php 自动加载函数,PHP自动加载的实例详解
一個(gè)PHP項(xiàng)目,通常只有一個(gè)入口文件index.php,我們通常會(huì)在這個(gè)入口文件中寫(xiě)入自動(dòng)加載函數(shù),用來(lái)require以后會(huì)實(shí)例化的類(lèi)文件。如:spl_autoload_register(function ($className) {
require 'class/' . $className . '.php';
});
通過(guò)以上的代碼,我們發(fā)現(xiàn):在自動(dòng)加載時(shí),我們需要指定存放類(lèi)的文件夾,以便找到相應(yīng)的類(lèi)。那么問(wèn)題產(chǎn)生了。
在引入命名空間之前:
我們的項(xiàng)目目錄
index.php
Controller.php
在index.php中我們需要實(shí)例化一個(gè)controller目錄下的Controller類(lèi),并且調(diào)用這個(gè)對(duì)象的model()方法,而這個(gè)方法則需要實(shí)例化一個(gè)model目錄下的Model類(lèi)。我們運(yùn)行一下index.php:
Warning: require(controller/Model.php): failed to open stream: No such file or directory
提示沒(méi)有這個(gè)文件或目錄。原因很簡(jiǎn)單:PHP在new Model()的時(shí)候,是自動(dòng)去controller目錄下去require的,所以找不到。
那么,我們的自動(dòng)加載函數(shù)應(yīng)該怎么寫(xiě)才能解決問(wèn)題呢?很顯然,把'controller/'換成'model/' 或者 不寫(xiě)目錄,都不能正常加載。于是,使用命名空間的好處就顯現(xiàn)出來(lái)了。
引入命名空間之后:
index.php
Controller.php
Model.php
我們按照文件目錄的結(jié)構(gòu)來(lái)為每個(gè)類(lèi)寫(xiě)入命名空間,當(dāng)在一個(gè)類(lèi)中需要實(shí)例化另外一個(gè)類(lèi)時(shí),IDE會(huì)幫我們寫(xiě)入usenamespace; 。這樣,我們?cè)趯?xiě)自動(dòng)加載的時(shí)候,就不用考慮將要加載的類(lèi)在哪一個(gè)文件目錄下了,只需要這樣寫(xiě):spl_autoload_register(function ($class) {
require $class . '.php';
});
因?yàn)槲覀冊(cè)趇ndex.php中use了所用到的類(lèi)的命名空間,自動(dòng)加載函數(shù)會(huì)到相應(yīng)的命名空間中去尋找類(lèi)(上述代碼中的$class就相當(dāng)于是'controller\Controller'),而這些類(lèi)中又需要實(shí)例化其他的類(lèi),因?yàn)檫@些類(lèi)中也聲明了use 其他類(lèi)的命名空間;,所以自動(dòng)加載函數(shù)又會(huì)去相應(yīng)的命名空間中去require其他類(lèi)。
這樣,我們就不會(huì)為加載類(lèi)而發(fā)愁了,極大地解放了我們的編程負(fù)擔(dān)。
總結(jié)
以上是生活随笔為你收集整理的php 自动加载函数,PHP自动加载的实例详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 初级第一旬05— 蓝字观试题
- 下一篇: 动态规划算法php,php算法学习之动态