輔助函數(shù)?

輔助函數(shù)正如其名,是用于輔助你處理任務(wù)的。每個輔助文件都只是一個特殊分類下一系列函數(shù)的集合。 例如 URL輔助函數(shù) 用于創(chuàng)建鏈接,表單輔助函數(shù) 用于創(chuàng)建表單元素,文本輔助函數(shù) 用于不同的文本編排方式,Cookie輔助函數(shù) 用于設(shè)置和獲取cookies,文件輔助函數(shù) 用于處理文件等。

與CodeIgniter中其他大多數(shù)的系統(tǒng)部件有所不同,輔助函數(shù)不是以面向?qū)ο蟮姆绞綄崿F(xiàn)的,而僅僅是簡單的,程序化的函數(shù)方法。 每個輔助函數(shù)都只執(zhí)行一個特定的功能,并與其他的函數(shù)不產(chǎn)生依賴。

CodeIgniter在默認情況下不加載輔助函數(shù)文件,因此使用它的第一步就是加載它。 而當輔助函數(shù)被加載后,該函數(shù)就在你的 控制器 and 視圖 中全局可用。

輔助函數(shù)通常儲存在 system/Helpersapp/Helpers directory 下。CodeIgniter首先會在 app/Helpers 目錄下進行查找,但是如果該目錄不存在,或者指定的輔助函數(shù)文件不在當前位置。 CI就會在你的全局 system/Helpers/ 目錄下進行搜索。

加載一個輔助文件?

可以使用如下方法來輕易地加載輔助文件:

helper('name');

其中 name 是輔助文件的文件名,并不需要帶有.php的文件擴展名或者是”helper”這部分。

舉例來說,為了加載名為**cookie_helper.php**的**Cookie輔助文件**,你需要這樣做:

helper('cookie');

如果你需要加載多個輔助文件,可以通過傳值一個文件名構(gòu)成的數(shù)組,這樣一來這些文件就都會被加載了:

helper(['cookie', 'date']);

一個輔助函數(shù)文件可以在你的控制器方法里的任意位置被加載(甚至在你的視圖文件里,雖然這樣做并不符合最佳實踐), 只要你在使用前加載了該文件就行。你也可以在控制器的構(gòu)造函數(shù)里加載輔助函數(shù),從而在當前控制器的任何方法里都可以使用, 或者在需要調(diào)用的方法里加載這個輔助函數(shù)。

注解

輔助函數(shù)的加載方法并不會返回值,所以請不要嘗試將它賦值給一個變量。請如上所示調(diào)用即可。

注解

URL輔助函數(shù)文件總是會自動加載,因此你不需要手動加載它。

從非標準位置加載?

輔助函數(shù)文件可以從 app/Helpers 目錄和 system/Helpers 目錄外被加載, 只要它們所處的路徑可以通過 自動加載器配置文件 中的PSR-4這節(jié)所配置的命名空間定位。 你可以為輔助函數(shù)文件用命名空間作為前綴來起名,從而使其可被定位。在命名空間所處的目錄下,加載器期望該文件存在于命名空間中一個名為 Helpers 的子目錄下。 以下是一個幫助理解的例子。

舉例來說,假設(shè)我們把所有博客相關(guān)的代碼都放在了我們的命名空間 Example\Blog 中。而文件存在于我們服務(wù)器的**/Modules/Blog/命名空間下。 那么我們就應(yīng)該把博客模塊對應(yīng)的輔助文件放在/Modules/Blog/Helpers/命名空間里。**blog_helper 文件就應(yīng)該位于**/Modules/Blog/Helpers/blog_helper.php**的位置。 在控制器中我們可以使用如下指令來加載該輔助文件:

helper('Modules\Blog\blog');

注解

通過該方式加載的文件中包含的函數(shù)并不是真正帶有命名空間的。這里的命名空間只是用于簡單快捷地定位文件而已。

使用一個輔助函數(shù)?

當你加載完包含有你想要使用的輔助函數(shù)的文件后,就可以像調(diào)用一個標準的PHP函數(shù)一樣調(diào)用它。

舉例來說,在你的視圖文件中使用 anchor 函數(shù)來創(chuàng)建一個鏈接,可以這樣做:

<?php echo anchor('blog/comments', 'Click Here');?>

其中”Click Here”是鏈接名,而”blogs/comments”是你希望鏈接到的控制器/方法名所對應(yīng)的的 URI

“繼承”輔助函數(shù)?

為了實現(xiàn)對輔助函數(shù)文件的”繼承”,在你的**app/Helpers/** 目錄下創(chuàng)建一個和現(xiàn)存的輔助函數(shù)文件同名的文件。

如果你你想做的只是對已有的輔助函數(shù)文件加一些新功能——那么在里面加一兩個函數(shù)或者改某個特殊的輔助函數(shù)的代碼—— 比起用你的版本來完全替換整個輔助函數(shù)文件來說要實用的多。在這種情況下,最好只是”繼承”這個輔助函數(shù)文件。

注解

“繼承”這個詞語在這里用起來太過于泛化了,因為輔助函數(shù)是面向過程且離散的,并不能像傳統(tǒng)的場景一樣被繼承。在這種情況下,這里的”繼承”的意思是,讓你可以添加或替換原本的輔助文件所提供的函數(shù)。

舉個例子,為了繼承原生的 數(shù)組輔助函數(shù),你可以創(chuàng)建一個名為 app/Helpers/array_helper.php 的文件并增加或重載以下函數(shù):

// any_in_array() 并不是數(shù)組輔助函數(shù),因為被定義為一個新的函數(shù)
function any_in_array($needle, $haystack)
{
        $needle = is_array($needle) ? $needle : [$needle];

        foreach ($needle as $item)
        {
                if (in_array($item, $haystack))
                {
                        return TRUE;
                }
        }

        return FALSE;
}

// random_element() 在數(shù)組輔助函數(shù)中被定義了,所以在這里重載了原生的函數(shù)
function random_element($array)
{
        shuffle($array);
        return array_pop($array);
}

helper() 方法會掃描所有 app/Config/Autoload.php 里定義的PSR-4命名空間并同時加載所有匹配的輔助文件 這一行為將使得所有模塊的輔助文件都會被加載,包括所有你所創(chuàng)建用于該程序的對應(yīng)輔助文件。加載順序如下:

  1. app/Helpers - 這里的文件總是首先被加載
  2. {namespace}/Helpers - 所有的命名空間都會通過所定義的順序遍歷
  3. system/Helpers - 系統(tǒng)輔助文件在最后加載

然后呢??

在內(nèi)容表里你可以找到所有可用的輔助函數(shù)文件 Helpers 。請逐一瀏覽它們的用途吧。