ZendFramework自動載入類的實現方法

技術小甜發表於2017-11-08

Zend Framework中實現自動載入類。網上查了很多,有好幾種。本文收集了常用的3種,

第一種如下:

E0FD4B173A4E45AA9F26C3AFC6D84587

方法很簡單,舉例說明。比如想要在models目錄下的類可以自動載入。

先在index.php中修改include path。

1
2
3
4
5
// Ensure library/ is on include_path
set_include_path(implode(PATH_SEPARATOR, array(
    realpath(APPLICATION_PATH . `/../library`),
    get_include_path(),realpath(APPLICATION_PATH . `/models`)
)));

上述程式碼裡,新增包含了models的目錄。

然後在Bootstrap.php檔案下,實現一個資源方法。

1
2
3
4
5
protected function _initAutoload()
{
            $autoloader = Zend_Loader_Autoloader::getInstance();
            $autoloader->setFallbackAutoloader(true);         
}

然後在models裡可以加一個類。注意檔名和類名的關係(類名要加上路徑名,用_隔開。下有示例),不然自動載入會失敗。比如加一個Nav.php的檔案。內容如下:

1
2
3
4
5
6
7
<?php
class Nav  {
public static function getNav() {
   echo "pfpf";
}
}
?>

在某個controller中,直接使用Nav類。

Nav::getNav();

如果models中需要加資料夾,那麼相應的類名也要有更改。舉例:

412A0F3703C3416683E6FAB52D3C637A

在models下有新建一個newFolder資料夾,在該資料夾下面新建一個檔案MKA,那麼這個檔案中的類名就應該是newFolder_MKA這種約定。

1
2
3
4
5
6
7
<?php
class newFolder_MKA  {
public static function getNav() {
echo "<br>MKA";
}
}
?>

預設的,index.php中已經包含了 realpath(APPLICATION_PATH . `/../library`)這個路徑,即可以直接把類放到這個資料夾中,既可以實現自動載入。

————————————————————————————————————————————————

還有一種方法,和上述方法類似,只不過在資源方法中實現註冊名稱空間(這裡名稱空間的概念和C#中名稱空間概念不太一樣,這裡指的是類名前面的字首和包含類的資料夾)。假設要自動載入的類在library中,預設的index.php中的includepath已經包含了。

E4A273299421470DA005954200E29941

那麼這些類名也要按約定加上名稱空間字首,在My目錄下的加上My_,沒有目錄的就加_。這樣的話,資源方法中只需註冊一下名稱空間就行了。

1
2
3
4
5
6
protected function _initAutoload ()
{
    Zend_Loader_Autoloader::getInstance()
    ->registerNamespace(`My_`)
    ->registerNamespace(`_`);
}

然後就可以直接呼叫My_Book類和_Pen類了。

My_Book::show();

_Pen::show();

甚至,你也不需要在資源方法中加程式碼,只需在配置檔案application.ini中加入如下指令即可:

1
2
autoloaderNamespaces[] = "My_"
autoloaderNamespaces[] = "_"

————————————————————————————————————————————————

還有一種方法 ,採用Zend_Loader_Autoloader_Resource類。

看例子,在Bootstrap.php檔案下,寫一個資源方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
        protected function _initAutoload()
{
            $loader new Zend_Loader_Autoloader_Resource(array(
`basePath`  => APPLICATION_PATH ,//這裡指定任何路徑,指定路徑後就在這個路徑下找
`namespace` => `Foo`,//這裡的名稱空間值的是類的字首,比如這個就是類的字首是Foo_開頭的。
            ));
            $loader->addResourceType(`wwww``models``Modelxxx`);//這個方法三個引數,分別是資源型別(貌似可以隨便填),路徑,子名稱空間
               //下面是原始碼中對於這3個引數的說明
               /**
     * Add resource type
     *
     * @param  string $type identifier for the resource type being loaded
     * @param  string $path path relative to resource base path containing the resource types
     * @param  null|string $namespace sub-component namespace to append to base namespace that qualifies this resource type
     * @return Zend_Loader_Autoloader_Resource
     */
}

例如上面的例子,它會在APPLICATION_PATHmodels目錄下,自動載入Foo_Modelxxx_這樣的類。

具體看下面的例子,目錄結構圖如下:

ADN0FC$CI[_JCYVGZN(D)F1

那現在的目標是能夠自動載入沒有folder中的類。

對應的,第一步,指定好自動載入的basepath,即`basePath` => APPLICATION_PATH.`/myfolder`,指定一個名稱空間Myns。

注意名稱空間的首字母大寫,不然報錯。

接著,載入資源型別,指定更細節的路徑和名稱空間。

所有的程式碼如下:

1
2
3
4
5
6
7
8
9
protected function _initAutoload()
{
            $loader new Zend_Loader_Autoloader_Resource(array(
`basePath`  => APPLICATION_PATH.`/myfolder`,
`namespace` => `Myns`
            ));
            $loader->addResourceType(`mytype``/``Mysubns`)
            ->addResourceType(`mytype2``mysubfolder``Mysubns2`);
}

其中注意名稱空間首字母大寫,路徑要指對,然後具體的類名要符合響應的規則。比如例子中的類名的格式就是

名稱空間_子名稱空間_類名的格式。

具體如下:

1
2
3
4
5
6
7
8
<?php
class Myns_Mysubns2_Myclass2
{
    public static function show()
    {
echo "myns_mysubns2_myclass2","<br>";
    }
}?>
1
2
3
4
5
6
7
8
9
<?php
class Myns_Mysubns_Myclass
{
    public static function show()
    {
echo "myns_mysubns_myclass","<br>";
    }
}
?>

然後呼叫的是直接

1
2
Myns_Mysubns_Myclass::show();
Myns_Mysubns2_Myclass2::show();

就可以了。


本文轉自cnn23711151CTO部落格,原文連結: http://blog.51cto.com/cnn237111/1300913,如需轉載請自行聯絡原作者


相關文章