Zend Framework 自动加载类的实现方法
Zend Framework中實現自動加載類。網上查了很多,有好幾種。本文收集了常用的3種,
第一種如下:
方法很簡單,舉例說明。比如想要在models目錄下的類可以自動加載。
先在index.php中修改include path。
// 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文件下,實現一個資源方法。
protected function _initAutoload() {$autoloader = Zend_Loader_Autoloader::getInstance();$autoloader->setFallbackAutoloader(true); }然后在models里可以加一個類。注意文件名和類名的關系(類名要加上路徑名,用_隔開。下有示例),不然自動加載會失敗。比如加一個Nav.php的文件。內容如下:
<?php class Nav { public static function getNav() {echo "pfpf"; } } ?>在某個controller中,直接使用Nav類。
Nav::getNav();
如果models中需要加文件夾,那么相應的類名也要有更改。舉例:
在models下有新建一個newFolder文件夾,在該文件夾下面新建一個文件MKA,那么這個文件中的類名就應該是newFolder_MKA這種約定。
<?php class newFolder_MKA { public static function getNav() { echo "<br>MKA"; } } ?>默認的,index.php中已經包含了 realpath(APPLICATION_PATH . '/../library')這個路徑,即可以直接把類放到這個文件夾中,既可以實現自動加載。
————————————————————————————————————————————————
還有一種方法,和上述方法類似,只不過在資源方法中實現注冊命名空間(這里命名空間的概念和C#中命名空間概念不太一樣,這里指的是類名前面的前綴和包含類的文件夾)。假設要自動加載的類在library中,默認的index.php中的includepath已經包含了。
那么這些類名也要按約定加上命名空間前綴,在My目錄下的加上My_,沒有目錄的就加_。這樣的話,資源方法中只需注冊一下命名空間就行了。
protected function _initAutoload () {Zend_Loader_Autoloader::getInstance()->registerNamespace('My_')->registerNamespace('_'); }然后就可以直接調用My_Book類和_Pen類了。
My_Book::show();
_Pen::show();
甚至,你也不需要在資源方法中加代碼,只需在配置文件application.ini中加入如下指令即可:
autoloaderNamespaces[] = "My_" autoloaderNamespaces[] = "_"————————————————————————————————————————————————
還有一種方法 ,采用Zend_Loader_Autoloader_Resource類。
看例子,在Bootstrap.php文件下,寫一個資源方法。
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_PATH\models\目錄下,自動加載Foo_Modelxxx_這樣的類。
具體看下面的例子,目錄結構圖如下:
那現在的目標是能夠自動加載沒有folder中的類。
對應的,第一步,指定好自動加載的basepath,即'basePath' => APPLICATION_PATH.'/myfolder',指定一個命名空間Myns。
注意命名空間的首字母大寫,不然報錯。
接著,加載資源類型,指定更細節的路徑和命名空間。
所有的代碼如下:
protected function _initAutoload() {$loader = new Zend_Loader_Autoloader_Resource(array( 'basePath' => APPLICATION_PATH.'/myfolder', 'namespace' => 'Myns'));$loader->addResourceType('mytype', '/', 'Mysubns')->addResourceType('mytype2', 'mysubfolder', 'Mysubns2'); }其中注意命名空間首字母大寫,路徑要指對,然后具體的類名要符合響應的規則。比如例子中的類名的格式就是
命名空間_子命名空間_類名的格式。
具體如下:
<?php class Myns_Mysubns2_Myclass2 {public static function show(){ echo "myns_mysubns2_myclass2","<br>";} }?><?php class Myns_Mysubns_Myclass {public static function show(){ echo "myns_mysubns_myclass","<br>";} } ?>然后調用的是直接
Myns_Mysubns_Myclass::show(); Myns_Mysubns2_Myclass2::show();就可以了。
總結
以上是生活随笔為你收集整理的Zend Framework 自动加载类的实现方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Django 运行 runserver
- 下一篇: 自定义的命民空间在其他程序集里无法调用