PHP 自动加载
回顧
開始的時候, 如果想在一個php文件中使用其它文件的類或方法, 需要通過include/require方法將文件包含進來. 這種方法的缺點也很明顯:
autoload
為了解決這個問題, 在PHP5中引入了自動加載的概念, 通過 __autoload 函數來實現, 如下:
function __autoload($classname){// 完成 指定名稱類的加載任務include_once($classname.'.php') }將這個函數定義在文件中, 當遇到未引入的類時, 會調用此函數進行引入, 看起來貌似很好, 我們只需要將此函數定義在也給PHP文件中, 以后我們的每個文件就只需要引入這一個自動加載文件就可以了, 看起來完事大吉.
但通過使用, 這種方式也存在很多問題:
很明顯, 問題就出在了, 這是一個全局函數, 只能夠定義一次,
spl_autoload
那么如何解決這個問題呢? PHP引入了一個擴展庫, 可以定義多個自動加載函數, 在查找的時候會依次調用定義好的自動加載函數進行加載, 有如下方法:
有了它, 我們就可以定義多個自動加載函數了.
下面是一個例子:
test01.php
namespace test01; class test{public static function tt(){echo 'test01';} }test02.php
namespace test02; class test{public static function tt(){echo 'test02';} }run.php
spl_autoload_register(function ($classname){include_once $classname.'01.php'; }); spl_autoload_register(function ($classname){include_once $classname.'02.php'; });use test01\test; test::tt();運行run.php, 報錯:
Warning: include_once(test01\test01.php): failed to open stream: No such file or directory in
打印傳入的 $classname, 發現是: test01\test
也就是說, 我們使用的時候可以將命名空間與路徑相對應, 關于這個好像還有一個標準, 具體記不清了.
這樣一對應, 有沒有感覺和java中的包有些一樣了, 反正我是覺得挺像.
composer
好了, 現在通過 composer來管理第三方庫, 它將自動加載都做好了, 只要引入他的 autoload.php 文件就可以了.
composer提供了幾種類型的自動加載
1.psr-4
大概就是我們上面說的路徑和命名空間對應的形式
2. classmap
保存各個類與文件的映射map
等等吧, 沒有具體研究, 不過大體是對自動加載的封裝, 很方便.
簡單總結一下, 才疏學淺…
總結
- 上一篇: linux取消线程的原理,浅析 Linu
- 下一篇: Python元组是什么