類的自動加載

方法1:
定義一個__autoload($className)函數(shù)接受一個參數(shù)
set_include_path(),是腳本里動態(tài)的對php.ini中的include_path進行修改
加載lib目錄下的類
set_include_path(get_include_path().PATH_SEPARATOR."lib/");


image.png
//當前文件為03.php
class A
{

}

function __autoload($className) {
    echo $className . '<br>';
    include $className.'.php';
}

$t = new Test();
$a = new A();

/*
 * 結(jié)果:
Test
根目錄下的test類
 */
image.png
set_include_path(get_include_path() . PATH_SEPARATOR .'lib/');
function __autoload($className) {
    echo $className . '<br>';
    include $className.'.php';
}

$t = new Test();
$t = new Test1();

echo get_include_path();

/*
 * 結(jié)果
 * Test
根目錄下的test類
Test1
lib目錄下的test1類
.;C:\php\pear;lib/
*/

方法2:
使用spl_autoload_register()函數(shù)
此函數(shù)的功能就是把函數(shù)注冊至SPL的__autoload函數(shù)棧中并移除系統(tǒng)默認的__autoload()函數(shù)
spl_autoload_register()可以調(diào)用多次,它實際上創(chuàng)建了autoload函數(shù)的隊列,按定義的順序逐個執(zhí)行。而__autoload()只可以定義一次
新建文件04.php

function __autoload($className) {
    echo '__autoload ' . $className . '<br>';
}

function __myautoload($className) {
    echo '__myautoload ' . $className . '<br>';
}

spl_autoload_register('__myautoload');

$t = new Test();

/*
結(jié)果為:
此時__autoload()函數(shù)失效了
 __myautoload Test
Fatal error: Uncaught Error: Class 'Test' not found in D:\Web\test\18-11-10\04.php:13 Stack trace: #0 {main} thrown in D:\Web\test\18-11-10\04.php on line 13
 */
set_include_path(get_include_path() . PATH_SEPARATOR .'lib/');

function __autoload($className) {
    echo '__autoload ' . $className . '<br>';
}

function __myautoload($className) {
    echo '__myautoload ' . $className . '<br>';
    include $className.'.php';
}

spl_autoload_register('__myautoload');

new Test();
new Test1();

/*
結(jié)果為:

此時__myautoload()執(zhí)行了兩次

__myautoload Test
根目錄下的test類
__myautoload Test1
lib目錄下的test1類

*/
image.png
set_include_path(get_include_path() . PATH_SEPARATOR .'lib/');

function __autoload($className) {
    echo '__autoload ' . $className . '<br>';
    include 'lib1/' . $className.'.php';
}

function __myautoload($className) {
    echo '__myautoload ' . $className . '<br>';
    include $className.'.php';
}

spl_autoload_register('__myautoload');
spl_autoload_register('__autoload');

// new Test();
// new Test1();
new T();

/*
結(jié)果為:

__myautoload T

Warning: include(T.php): failed to open stream: No such file or directory in D:\Web\test\18-11-10\04.php on line 12

Warning: include(): Failed opening 'T.php' for inclusion (include_path='.;C:\php\pear;lib/') in D:\Web\test\18-11-10\04.php on line 12
__autoload T
lib1目錄下的T類

*/
set_include_path(get_include_path() . PATH_SEPARATOR .'lib/');

class AutoLoad
{
    public static function loadClass($className) {
        echo 'AutoLoad 中的 loadClass ' . $className . '<br>';
        include $className . '.php';
    }
}

spl_autoload_register(['AutoLoad','loadClass']);

new Test();
new Test1();

/*
AutoLoad 中的 loadClass Test
根目錄下的test類
AutoLoad 中的 loadClass Test1
lib目錄下的test1類
*/
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 這些內(nèi)容是從慕課網(wǎng)上看到的,講了3中類的自動加載方法,試了一下,沒毛病。具體見下面代碼 <?php//方法1/* ...
    luckybear_5110閱讀 317評論 0 0
  • 在編寫面向?qū)ο螅∣OP) 程序時,很多開發(fā)者為每個類新建一個 PHP 文件。 這會帶來一個煩惱:每個腳本的開頭,都...
    快樂的bug制造者閱讀 214評論 0 0
  • 定義常量,三個目錄:優(yōu)先加載BASEPATH中的,如果沒有再加載APPPATH,如果再沒有再加載OT中的 方法1:...
    wangjunmech閱讀 305評論 0 0
  • 溫潤的清晨帶著微涼 打開窗戶招呼東來的風 雨無聲無息的走了 梨花在院子里梳妝 清甜灑滿了一地 好像誰家待嫁的新娘
    林云_09ae閱讀 408評論 2 5
  • 朋友: 前信談動,只說出一面真理。人生樂趣一半得之于活動,也還有一半得之于感受。所謂“感受”是被動的,是容許自然界...
    老山連海閱讀 904評論 0 1

友情鏈接更多精彩內(nèi)容