《打造自己的PHP框架(4)類的自動加載》要點:
本文介紹了打造自己的PHP框架(4)類的自動加載,希望對您有用。如果有疑問,可以聯系我們。
有了自動加載,我們在也不用擔心require、include的問題了,不用在文件頭部寫一大堆require、include了,再也不用擔心是否必要引入某個類的問題了
自動加載就是依賴于php的命名空間,什么是命名空間呢?好比就是你的名字,好比,你叫王大錘,那么在你們那個大家庭里面就不會有人再叫王大錘,但是,在其它姓王的家庭里面就有可能有叫王大錘的這個人,你們是兩個大家庭,所有,有相同名字的人不會沖突,那么,一個家庭就相當與一個命名空間,所有,一個命名空間下面的類的名稱可以和其它命名空間下面的類的名稱一樣,當然,變量、函數也是一個道理,在php沒有命名空間之前,有兩個一樣名稱的變量、函數、類是不允許的.
很簡單,非常簡單
namespace 空間名稱;
<?php
namespace Goods;
function getGoodsList()
{
}
?>
定義了一個命名空間叫Goods
還可以定義子命名空間,如下:
<?php
namespace Library\Base;
?>
Library是一個命名空間,Base是Library下面的子空間,當然,Base下面也可以有子空間,所有,子子孫孫無窮盡也.
定義一個類,名叫Controller
<?php
namespace Library\Base;
class Controller
{
}
?>
再定義一個類,也叫Controller
<?php
namespace Library;
class Controller
{
}
?>
他們雖然類名相同,但是命名空間分歧,所以,不會沖突的,那我們怎么實例化呢?很簡單,帶上命名空間即可
<?php
$base = new Library\Base\Controller();
$controller = new Library\Controller();
?>
假如,我不想寫前面的Library\Base,那要怎么辦呢?
<?php
use Library\Base\Controller;
$base = new Controller;
$controller = new Library\Controller();
?>
怎樣能實現自動加載呢?這里就有個規范,就是,命名空間和類存放的目錄對應,好比命名空間是Library\Base,下面有個類叫Controller,那么,對應的文件目錄就是/Library/Base/這個目錄.
php可以注冊一個自動加載函數,當我們new一個類的時候,php首先會分析這個類是否存在,如果這個類沒有載入進來,那么,php就會調用這個自動加載函數,并傳入這個類的名稱,包含命名空
比如我們new Library\Base\Controller();但是現在這個類還沒被引入進來,那么就找不到這個類,php就會調用自動加載函數,函數是我們本身編寫的,比如,名字叫loadClass
<?php
function loadClass($class_name)
{
}
?>
那么$class_name接收到的值就是'Library\Base\Controller'這個字符串,調用完這個函數之后,才會真正的去實例化這個類,這時候,如果還沒有,那就報錯了,說這個類未找到,所有,我們可以在這個辦法里面加載需要的類,由于,命名空間和文件目錄一致,所有,要找到這個類就很簡單了
<?php
function loadClass($class_name)
{
//把命名空間的分隔符"\"替換為當前操作系統的文件目錄分隔符
$class_name = str_replace('\\', DIRECTORY_SEPARATOR, $class_name);
//組裝類文件路徑
$class_file = $class_name . '.php';
//加載類文件
require $class_file;
}
?>
<?php
spl_autoload_register('loadClass');
?>
大概的思路就是這樣,當然,我們寫的框架的類自動加載不會這么簡單,但是,整體還是這個流程,只是考慮的比較多罷了,到時候我們再講.
第一次寫教程,可能講的不是很全面,如果,還不明白,可以在下面回復,我來解答
當然,喜歡的話記得點一波存眷,覺得好的話,記得分享給朋友
維易PHP培訓學院每天發布《打造自己的PHP框架(4)類的自動加載》等實戰技能,PHP、MYSQL、LINUX、APP、JS,CSS全面培養人才。
轉載請注明本頁網址:
http://www.snjht.com/jiaocheng/9357.html