1. 程式人生 > >PHP類的自動載入與名稱空間及use的理解

PHP類的自動載入與名稱空間及use的理解

今天寫一個demo,遇到一個問題,平時框架用多了,下意識的就以為use就能引入類,導致一直跑不成功,後來才意識到use與引用類並不是一回事。use只是指定了要使用哪個名稱空間下的類,但是並不會引入類,類的引用還是需要使用include或require。這裡記錄一下這次事件的總結,加深一下印象。

類的引用

建立一個類檔案ClassA.class.php

namespace AreaA;
class ClassA{}

在同級目錄下的index.php中要使用哪個類,就必須包含這個類檔案,否則會報錯

require('./AreaA/ClassA.class.php'); //引入AreaA下的ClassA類
$objA = new ClassA(); //例項化成功,例項化出來的時AreaA下的classA

use與類的引用

再建立另一個類檔案ClassA.class.php,宣告不同的名稱空間

namespace AreaB;
class ClassA{}

在index.php中包含兩個類檔案

require('./AreaA/ClassA.class.php');
require('./AreaB/ClassA.class.php');

//此時單純例項化ClassA時PHP不知道你用的是哪個ClassA,所以需要使用use來指定要使用的ClassA
use AreaA\ClassA
; $obj = new ClassA(); //此時例項化的是AreaA下的ClassA類

當然,不使用use也是可以的,但是在例項化的時候需要指定名稱空間,如下:

require('./AreaA/ClassA.class.php');
require('./AreaB/ClassA.class.php');

$objA = new \AreaA\ClassA(); 
$objB = new \AreaB\ClassB();

類的自動載入

那這樣每次使用的類的時候都要require一下類檔案,豈不是很麻煩?框架中使用類的時候可沒有每次都要手動包含一下類檔案啊。
這就要說說類的自動載入了,框架不用每次都手動包含類檔案就是因為php的類的自動載入功能,能夠根據你使用的類名自動載入類檔案。
php的自動載入有兩種方式,__autoload()

函式與spl_autoload_register()函式。

__autoload()
還是在index.php檔案中

function __autoload($class_name){
    $file = $class_name . '.class.php';  
    if (file_exists($file)) {  
        require_once($file);  
    }
}
use AreaA\ClassA;
$obj = new ClassA();

ps:在聲明瞭名稱空間後,自動載入函式獲取的就是包含名稱空間的類名,因此,將名稱空間與檔名對應,對於自動載入來說會方便很多,可以自行在__autoload()方法中將$class_name打印出來看一看。

spl_autoload_register()
還是在index.php中

//宣告一個自定義的載入類檔案的函式
function _autoload($class_name){
    $file = './' . $class_name . '.class.php';
    $file = str_replace('\\','/',$file);
    if (file_exists($file)) {
        require_once($file);
    }
}
//註冊自定義的載入函式,註冊之後,自定義的載入函式就變成了自動載入的函式
spl_autoload_register('_autoload');

use AreaA\ClassA;
$obj = new ClassA();

以上。