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