一個PHP項目,通常只有一個入口檔案index.php,我們通常會在這個入口檔案中寫入自動載入函數,用來require以後會實例化的類別檔案。如:
<span style='font-family: "courier new", courier; font-size: 14px'>spl_autoload_register(function ($className) {</span><br><span style='font-family: "courier new", courier; font-size: 14px'> require 'class/' . $className . '.php';</span><br><span style='font-family: "courier new", courier; font-size: 14px'>});</span><br><br><span style='font-family: "Microsoft YaHei"; font-size: 14px'>通过以上的代码,我们发现:在自动加载时,我们需要指定存放类的文件夹,以便找到相应的类。那么问题产生了。</span><br><br><strong><span style="font-size: 18px; background-color: #339966">在引入命名空间之前:</span></strong>
我們的專案目錄
###
##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會幫我們寫入usenamespace
; 。這樣,我們在寫自動載入的時候,就不用考慮將要載入的類別在哪一個檔案目錄下了,只需要這樣寫:######<span style='font-family: "courier new", courier; font-size: 14px'>spl_autoload_register(function ($class) {</span><br><span style='font-family: "courier new", courier; font-size: 14px'> require $class . '.php';</span><br><span style='font-family: "courier new", courier; font-size: 14px'>});</span><br><br><span style='font-family: "Microsoft YaHei"; font-size: 14px'>因为我们在index.php中use了所用到的类的命名空间,自动加载函数会到相应的命名空间中去寻找类(上述代码中的$class就相当于是'controller\Controller'),而这些类中又需要实例化其他的类,因为这些类中也声明了use <em>其他类的命名空间 </em>;,所以自动加载函数又会去相应的命名空间中去require其他类。</span><br><br><span style='font-size: 16px; font-family: "Microsoft YaHei"'>这样,我们就不会为加载类而发愁了,极大地解放了我们的编程负担。</span>
以上是PHP自動載入的實例詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!