【終於明白】PHP加入命名空間的好處--方便自動加載


一個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其他類。

這樣,我們就不會為加載類而發愁了,極大地解放了我們的編程負擔。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM