參考連結:
1、spl_autoload_register與autoload的區別詳解
2、php.net 自動載入類別
很多開發者寫物件導向的應用程式時對每個類別的定義建立一個 PHP 原始檔。一個很大的煩惱是必須在每個腳本開頭寫一個長長的包含檔案清單(每個類別一個檔案)。
在 PHP 5 中,不再需要這樣了。可以定義一個 __autoload() 函數,它會在試圖使用尚未定義的類別時自動呼叫。透過呼叫此函數,腳本引擎在 PHP 出錯失敗前有了最後一個機會載入所需的類別。
簡單的引入範例:
先新建一個類別檔案MyClass.class.php:
<?php class MyClass { public function __construct() { echo "This is MyClass's construct"; } }
再在同目錄下新建任意名字的php檔案:
<?php function __autoload($cls){ var_dump($cls); require './'.$cls.".class.php"; } $o1 = new MyClass(); // 这里不会再执行__autoload了,因为这个类已经require进来了。只有在当前文件中找不到该类的时候才会调用__autoload函数 $o2 = new MyClass();
這裡將require的內容放在了__autoload()中,如果沒有定義這個函數,會報一個致命錯誤(Fatal),提示找不到MyClass類別。
而定義了這個魔術方法會在new一個物件且在當前程式碼中找不到這個類別定義的時候(滿足以上2個條件),__autoload()函數被傳入一個類別名稱參數,並執行函數代碼段。
所以,在函數中執行了var_dump("MyClass");和require './MyClass.class.php';
結果如下:
string(7) "MyClass" This is MyClass's constructThis is MyClass's construct
這裡輸出了一次var_dump的內容和兩次建構子echo的內容。可以證明,當require進來之後,再次new MyClass這個類,並不會再呼叫__autoload()函數。
autoload有缺點:不能重複定義(PHP語言的特徵),導致如果要進行團隊開發的時候很不方便,容易出現衝突。
於是PHP 5.1.2之後有一個autoload註冊函數spl_autoload_register,以下是此函數的一些說明:
將函數註冊到SPL __autoload函數佇列。如果該隊列中的函數尚未激活,則激活它們。
如果需要多個 autoload 函數,spl_autoload_register() 滿足了這類需求。 它實際上創建了 autoload 函數的佇列,按定義時的順序逐一執行。相較之下, __autoload() 只可以定義一次。
在PHP 5.3引入了命名空間之後,此函數的參數有多種形式:
spl_autoload_register('my_autoloader'); // my_autoloader是一个函数名 spl_autoload_register(array('Loader', 'loadClass')); // 表示类内的静态方法,Loader::loadClass // 或者,自 PHP 5.3.0 起可以使用一个匿名函数 spl_autoload_register(function ($class) { include 'classes/' . $class . '.class.php'; }); spl_autoload_register(__NAMESPACE__ .'\Foo::test'); // 自 PHP 5.3.0 起,可以使用命名空间的形式
這個函數只需要在new物件之前呼叫即可。
以下是一個例子(測試以上4種形式):
<?php // namespace Atl; // 加了这句话报错了! function my_autoloader($cls){ echo "<br/>$cls - my_autoloader <br/>"; require_once './MyClass1.class.php'; } class Loader{ public static function loadClass($cls){ echo "<br/>$cls - Loader::loadClass <br/>"; require_once './MyClass2.class.php'; } public static function nspClass($cls){ echo "<br/>$cls - Loader::nspClass <br/>"; require_once './MyClass3.class.php'; } } spl_autoload_register('my_autoloader'); $o1 = new MyClass1(); spl_autoload_register(array('Loader', 'loadClass')); $o2 = new MyClass2(); // 版本检测 if(version_compare(PHP_VERSION, '5.3.0', '<')) die("以下的两个测试需要PHP 5.3及以上"); spl_autoload_register(__NAMESPACE__ .'\Loader::nspClass'); $o3 = new MyClass3(); spl_autoload_register(function ($cls) { echo "<br/>$cls - anonymous function <br/>"; require_once './MyClass4.class.php'; }); $o4 = new MyClass4();
輸出的結果如下(注意到查找的先後順序與註冊順序相同):
MyClass1 - my_autoloader This is MyClass1's construct MyClass2 - my_autoloader MyClass2 - Loader::loadClass This is MyClass2's construct MyClass3 - my_autoloader MyClass3 - Loader::loadClass MyClass3 - Loader::nspClass This is MyClass3's construct MyClass4 - my_autoloader MyClass4 - Loader::loadClass MyClass4 - Loader::nspClass MyClass4 - anonymous function This is MyClass4's construct

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

Dreamweaver Mac版
視覺化網頁開發工具

記事本++7.3.1
好用且免費的程式碼編輯器

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

Safe Exam Browser
Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

SAP NetWeaver Server Adapter for Eclipse
將Eclipse與SAP NetWeaver應用伺服器整合。