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