PHP類的自動載入與名稱空間及use的理解
阿新 • • 發佈:2019-01-30
今天寫一個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();
以上。