首頁  >  文章  >  後端開發  >  PHP自動載入的實例詳解

PHP自動載入的實例詳解

零下一度
零下一度原創
2017-07-23 13:24:251769瀏覽

一個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會幫我們寫入use

namespace

;  。這樣,我們在寫自動載入的時候,就不用考慮將要載入的類別在哪一個檔案目錄下了,只需要這樣寫:######
<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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn