本文實例講述了Zend Framework教程之Autoloading用法。分享給大家供大家參考,具體如下:
一、概述
自動載入是一種機制,無需依賴手動編寫PHP程式碼。參考»PHP手冊自動加載,一旦自動加載器被定義,你試圖使用一個沒有定義的類別或介面的情況下,它會自動被呼叫。
使用自動加載,在專案中你不必擔心類別的存放位置。定義一個良好定義的自動載入器,您不需要考慮一個類文件相對於當前類文件的位置,您只需使用類,自動加載器將自動查找文件。
此外,自動加載,確保只加載一次,提升了效能 -所以可以用它取代require_once()。
Zend Framework 鼓勵使用自動加載,並提供了許多工具實現自動加載程式碼庫以及應用程式程式碼。以下將介紹這些工具,以及如何有效地使用它們。
自動載入的實作約定
類別命名約定
Zend Framework借鑒了 PEAR的想法,即類別名稱與檔案系統的1:1的關係。簡單地說,下劃線字元("_")替換目錄分隔,以代表該檔案的路徑,然後添加後綴“.php”。例如,類別“Foo_Bar_Baz”將對應檔案系統上的"Foo/Bar/Baz.php"。假設已透過PHP的include_path設定類別的位置,這使得可以透過 include() 和 require()找到相對include_path中設定的路徑來尋找檔案名稱。
此外,建議使用供應商名稱或項目名稱作為前綴。這意味著,你寫的所有的類別都有一個共同的類別前綴,例如,Zend Framework的所有程式碼前綴為「Zend_」。這種命名約定有助於防止命名衝突。在ZendFramework中,我們常提到「namespace」前綴,要注意不要把它與PHP的本地命名空間混為一談。
自動載入器設計約定
Zend Framework透過Zend_Loader_Autoloader實作支援自動載入的,主要提供有以下目標和設計元素:
提供命名空間比對。如果類別的命名空間前綴是沒有註冊的命名空間,會傳回FALSE。
允許定義自動載入器作為一個備用的自動載入器。一個團隊可能分佈廣泛,或使用一個為定義的命名空間前綴情況下,它會嘗試匹配任何命名空間前綴。但是,這種做法是不推薦,因為它可能會導致不必要的查找。
允許開啟禁止錯誤提示。 因此,預設情況下,它應該處於關閉狀態。開發階段,可以啟用它。
可以自訂自動載入。有些開發人員不希望使用Zend_Loader::loadClass()自動加載,但仍想使用Zend Framework的自動載入機制。 Zend_Loader_Autoloader允許使用自訂的自動載入。
允許使用SPL自動載入回呼鏈。這樣做的目的是允許指定額外的自動載入器 。
二、用法:
通常,只需將需要引入包含類,然後實例化它即可。由於Zend_Loader_Autoloader所採用的單例模式,可以使用getInstance()方法來取得一個實例。
require_once 'Zend/Loader/Autoloader.php'; Zend_Loader_Autoloader::getInstance();
預設情況下,可以載入命名空間前綴為"Zend_"或 "ZendX_"的任何類,只要確保已經指定include_path。
如果想使用其他的命名空間前綴?最好的,最簡單的方法是呼叫registerNamespace() 方法。您可以透過傳遞單一的命名空間前綴,或一個陣列:
require_once 'Zend/Loader/Autoloader.php'; $loader = Zend_Loader_Autoloader::getInstance(); $loader->registerNamespace('Foo_'); $loader->registerNamespace(array('Foo_', 'Bar_'));
或者,您可以將Zend_Loader_Autoloader當作「備用」自動載入器。這意味著如果命名空間無論是否定義,都會嘗試自動載入。
$loader->setFallbackAutoloader(true);
(注意:這種方式是不建議的,盡量不要使用)。
Zend_Loader_Autoloader的內部實作是使用 Zend_Loader::loadClass() 載入類別的。該方法的使用 include() 來嘗試載入給定的類別檔案。 include()將傳回一個布林值,如果沒有成功回傳FALSE - 而且也發出PHP警告。 可能會導致以下問題:
如果啟用了display_errors,警告將包含在輸出中。
根據你所配置的error_reporting級別,它也可以輸出到日誌中。
可以禁止這些錯誤訊息,具體如下:(但注意,display_errors啟用時,錯誤日誌將始終顯示。)
$autoloader->suppressNotFoundWarnings(true);
選擇一個Zend Framework的版本
ZendFramework/1.2/1.| |-- library/
|-- ZendFramework-1.9.1-minimal/
| |-- library/
|-- 1.8.4PL1/
| |-- libra|-- 1.8.4PL1/
| |-- library/-- 11. | |-- library/
|-- ZendFramework-1.8.3/
| |-- library/
|-- 1.7.8/
| |-- library/
|-- 1.7/
| | - library/
|-- 1.7.6/
| |-- library/
$autoloader->setZfPath($path, 'latest');
$autoloader->setZfPath($path, '1.8');
$autoloader->setZfPath($path, '1.7.7');
Autoloader介面
注:命名空间前缀和PHP命名空间
PHP5.3已经发布。该版本中,PHP现在已经正式支持命名空间。
然而,Zend Framework的命名空间和PHP 5.3的命名空间完全不同的。 Zend Framework中,提到的“命名空间”,是指一个类前缀。例如,所有的Zend Framework的类名称的前缀“Zend_”。 这是我们指定的“命名空间”。
在Zend Framework 2.0.0使用了原生的PHP命名空间。
自动加载器除了能够指定任意回调以外,Zend Framework还定义了一个需要自动加载类实现的接口Zend_Loader_Autoloader_Interface:
interface Zend_Loader_Autoloader_Interface { public function autoload($class); }
如果您希望在Zend Framework中使用自定义的自动加载器,可以使用 Zend_Loader_Autoloader的 pushAutoloader()和unshiftAutoloader()方法。
通过这些方法将在Zend Framework的内部自动装载器之后追加或之前使用自定义的加载器。
每个方法接受一个可选的第二个参数,类的命名空间前缀。自动加载器只查找给定的类前缀。如果不是指定的类前缀,将跳过自动加载器 , 这可能是一种性能改进方式。
当使用这个接口时,你需要传递类实例到Zend_Loader_Autoloader类的pushAutoloader()和unshiftAutoloader()方法,具体如下:
// Append function 'my_autoloader' to the stack, // to manage classes with the prefix 'My_': $loader->pushAutoloader('my_autoloader', 'My_'); // Prepend static method Foo_Loader::autoload() to the stack, // to manage classes with the prefix 'Foo_': $loader->unshiftAutoloader(array('Foo_Loader', 'autoload'), 'Foo_'); // Assume Foo_Autoloader implements Zend_Loader_Autoloader_Interface: $foo = new Foo_Autoloader(); $autoloader->pushAutoloader($foo, 'Foo_');
Zend_Loader_Autoloader的相关方法
希望本文所述对大家PHP程序设计有所帮助。
更多 Zend Framework教程之Autoloading用法详解相关文章请关注PHP中文网!