[ZF]Zend Framework v1 Autoloader

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;

[jQuery].data()

[PHP]PHPUnit