我們按照文件目錄的結構來為每個類寫入命名空間,當在一個類中需要實例化另外一個類時,IDE會幫我們寫入use namespace; 。這樣,我們在寫自動載入的時候,就不用考慮將要載入的類在哪一個文件目錄下了,只需要這樣寫: spl_autoload_register(function ($clas... ...
一個PHP項目,通常只有一個入口文件index.php,我們通常會在這個入口文件中寫入自動載入函數,用來require以後會實例化的類文件。如:
spl_autoload_register(function ($className) {
require 'class/' . $className . '.php';
});
通過以上的代碼,我們發現:在自動載入時,我們需要指定存放類的文件夾,以便找到相應的類。那麼問題產生了。
在引入命名空間之前:
我們的項目目錄
index.php
Controller.php
在index.php中我們需要實例化一個controller目錄下的Controller類,並且調用這個對象的model()方法,而這個方法則需要實例化一個model目錄下的Model類。我們運行一下index.php:
Warning: require(controller/Model.php): failed to open stream: No such file or directory
提示沒有這個文件或目錄。原因很簡單:PHP在new Model()的時候,是自動去controller目錄下去require的,所以找不到。
那麼,我們的自動載入函數應該怎麼寫才能解決問題呢?很顯然,把'controller/'換成'model/' 或者 不寫目錄,都不能正常載入。於是,使用命名空間的好處就顯現出來了。
引入命名空間之後:
index.php
Controller.php
Model.php
我們按照文件目錄的結構來為每個類寫入命名空間,當在一個類中需要實例化另外一個類時,IDE會幫我們寫入use namespace ; 。這樣,我們在寫自動載入的時候,就不用考慮將要載入的類在哪一個文件目錄下了,只需要這樣寫:
spl_autoload_register(function ($class) {
require $class . '.php';
});
因為我們在index.php中use了所用到的類的命名空間,自動載入函數會到相應的命名空間中去尋找類(上述代碼中的$class就相當於是'controller\Controller'),而這些類中又需要實例化其他的類,因為這些類中也聲明瞭use 其他類的命名空間 ;,所以自動載入函數又會去相應的命名空間中去require其他類。
這樣,我們就不會為載入類而發愁了,極大地解放了我們的編程負擔。