2012-05-21 73 views
4

根據http://php.net/manual/en/language.oop5.autoload.php魔術功能__autoload()將在即將到來的PHP版本中被刪除和刪除(!)。官方的選擇是spl_autoload()。請參閱http://www.php.net/manual/en/function.spl-autoload.php。但是 - 像往常一樣 - PHP手冊吸如地獄,並沒有解釋這個嬰兒的正確使用。如何使用spl_autoload()作爲__autoload()去除

我的問題:如何用版本spl_autoload取代這個(我的自動級自動加載)

function __autoload($class) { 
    include 'classes/' . $class . '.class.php'; 
} 

()?問題是:我不知道如何給該函數一個路徑(它只接受命名空間)。

順便說一句:關於SO.com上的這個話題有很多線索,但沒有提供一個簡單的解決方案來取代我的性感單線。

+1

我已經在PHP文檔中添加了一個基於上述示例的基本示例。希望將來這樣的事情不會那麼難。 – salathe

+0

PHP手冊根本不吸收。 – Shikiryu

+0

@Shikiryu嗯,說實話,它的確如此。在大多數情況下,理解事情是如何起作用並不容易,因爲文檔是由完整的核心書寫者撰寫的。即使你知道某件事情是如何工作的,也不可能理解官方文件。更糟糕的是,在大多數情況下,官方文檔已被更正(!)並被很多評論改寫。像mysqli,餅乾或會話等事情很難找到,而且更難理解。當你像例子中那樣做時,你會失敗。這是IT和開源中的一個普遍問題:沒有可用性。 – Sliq

回答

10

您需要註冊自動加載功能spl_autoload_register。您需要提供"callable"。這樣做,從5.3開始的最好方式,是一個匿名函數:

spl_autoload_register(function($class) { 
    include 'classes/' . $class . '.class.php'; 
}); 

這對__autoload的主要優點是當然,你可以調用spl_autoload_register多次,而__autoload(像任何功能)只能定義一次。如果你有模塊化的代碼,這將是一個重大的缺點。

+1

它也值得一提的是它可能是一個好主意,讓自動加載是[PSR-0](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-0.md ),這幾乎是標準(除了對舊的PEAR慣例的傳統支持外)。如果你正在編寫你自己的自動加載器,這使得它與一些大型和流行的框架非常兼容。如果您不想自己寫,但使用指定的命名/存儲約定,則可以使用現有的自動裝載器組件。 – prodigitalson

+0

@lonesomeday謝謝,這是一個完美的解決方案,它將100%的上述autoload()事物替換掉。 – Sliq