Zend Framework的Autoloader是一個很棒的設計,它可以自動幫你載入相關名稱的class,Zend Framework 會按照 PEAR 命名方法來載入類別(Xxx/Yyy/Zzz.php 對應 class Xxx_Yyy_Zzz 這個類別)
一般類別載入
例如:
library/Test/Hello/Morning.php
class Test_Hello_Morning {
function sayMorning(){
print "Good Morning";
}
}
可以在Controller中新增namespace
require_once 'Zend/Loader/Autoloader.php';
$autoloader = Zend_Loader_Autoloader::getInstance();
//新增Namespace(library/Test中的class都會引入)
//官網建議Namespace後要加上底線符號,避免像Testaaa/Xxx這種情形也被引入
//namespace autoloader就不需要加底線
$autoloader-> registerNamespace('Test_');
如果專案是使用ZF tools產生的話,可以直接在application/configs/application.ini中加入:
Autoloadernamespaces[] = "Test_"
Controller就可以直接使用
class IndexController extends Zend_Controller_Action {
public function indexAction() {
$this->_helper->viewRenderer->setNoRender();
$test = new Test_Hello_Morning();
$test -> sayMorning();
}
}
資源類別載入
資源類別是指Model、Form等常用類別,在用ZF tools建立的專案中,主要由Zend_Application_Module_Autoloader處理。
在ZF tools建立的專案中,application/configs/application.ini裡預設的appnamespace是Application,所以使用zf指令建立時,會按照namespace產生,例如:
#產生class Application_Model_Haha zf create model Haha
Zend_Application_Module_Autoloader預設已經有先建立幾個預設的對應路徑(不需任何設定就會自動載入)
| 資源名稱 | 對應路徑 |
| Model_DbTable | models/DbTable |
| Model_Mapper | models/mappers |
| Form | forms |
| Model | models |
| Plugin | plugins |
| Service | services |
| View_Helper | views/helpers |
| View_Filter | views/filters |
如果是使用手動建立ZendFramework的目錄,就必須在public/index.php中自行設定Zend_Loader_Autoloader_Resource
$resourceLoader = new Zend_Loader_Autoloader_Resource(array( 'basePath' => APPLICATION_PATH, 'namespace' => 'Application', 'resourceTypes' => array( 'form' => array( 'path' => 'forms/', 'namespace' => 'Form', ), 'model' => array( 'path' => 'models/', 'namespace' => 'Model', ), ), ));
namespace載入
也可以使用namespace autoloader
架構
├── library │ ├── Test │ │ └── Hello │ │ └── Morning.php
Morning.php
namespace Test\Hello;
class Morning {
static function test() {
echo '334567';
}
}
Controller
$loader = Zend_Loader_Autoloader::getInstance();
$loader->registerNamespace('Test');
$auto = new Test\Hello\Morning();
echo $auto->test() . PHP_EOL;