自動加載是一個很是核心的功能。在沒有自動加載的時候,引用某個文件,經常須要一個很長的列表(須要把用到的)。
先用一個簡單的樣例:__autoload() 能夠作到當在實例化某個沒有的類的時候,會自動加載讀取到的沒有加載的文件名。須要保持文件名和類名是一致的
寫倆個文件 一個 in.php
php
<?php class in { public function test() { echo '123'; } public function test2() { echo "456"; } } ?>
另一個文件index.php
函數
<?php function __autoload($class){ require $class.".php"; } $a = new in(); $a->test(); ?>
可是__autoload函數只能用一次,當倆個項目合在一塊兒的時候,只有一個會生效,另一個沒法使用。因而增長了SPL函數
spl_autoload_register();
能夠同時加載N種自動加載規則,最經常使用的,重改index.php有
ui
function load($class){ include $class.".php"; } spl_autoload_register("load"); new in();
自動加載雖然很好用,可是到了PHP5.3之後,引入了命名空間namespace後,自動加載的複雜度又獲得了提高。這裏先介紹下PHP5.3的命名空間新概念:命名空間一個最明確的目的就是解決重名問題,PHP中不容許兩個函數或者類出現相同的名字,不然會產生一個致命的錯誤。這種狀況下只要避免命名重複就能夠解決,最多見的一種作法是約定一個前綴。可是約定前綴,會帶來大量的額外代碼。報告裏的評論和文章裏的評論可能都有comment,Article和Board都有這個函數,因而要進行各自約定Article_comment,Board_comment當大量這樣進行約定進行調用的時候,會很是麻煩,因而出現了命名空間。
調用的時候,只須要命名空間就能夠約定 見下列示例
spa
namespace test\index; class test1 { public function a() { echo "a"; } } function b() { return 7; } namespace test\test; function b() { return 5; } echo \test\index\b();
在namespace test\test的空間裏,調用test\index空間裏的方法相似於寫目錄的方法。自動加載進行解析的時候,就須要進行一些靈活的變更。
命名空間和文件引用沒有必然關係,可是在解析的時候,會遇到一個比較複雜的判斷狀況。
code