首頁  >  文章  >  php教程  >  Zend Framework教學之Autoloading用法詳解

Zend Framework教學之Autoloading用法詳解

高洛峰
高洛峰原創
2017-01-06 09:18:341359瀏覽

本文實例講述了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的相关方法

 Zend Framework教程之Autoloading用法详解

 Zend Framework教程之Autoloading用法详解

希望本文所述对大家PHP程序设计有所帮助。

更多 Zend Framework教程之Autoloading用法详解相关文章请关注PHP中文网!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn