1. 程式人生 > >php 之 類的自動載入

php 之 類的自動載入

引出自動載入

我們有一個HumanModel.php,裡面的程式碼如下:

class HumanModel {
    public function t() {
        echo '人類';
    }
}

當我們要在別的php檔案中使用HumanModel類的時候:

require('./HumanModel.php');

$lisi = new HumanModel();
$lisi->t();

問題:
如果網站比較大,model類比較多
HumanModel、UserModel、GoodsModel
CatModel、OrderModel

1:這麼多的model,我用誰,就得include/require誰.

2:而且不知道,之前是否已經include/require進來某個類
(這個用once可以解決,但once的效率很低)

這時 我們可以用自動載入!

自動載入的簡單實現

function __autoload($c) {
    echo '~~~~',$c,'~~~~~';
}

$ming = new Pig();

執行這段程式碼,
這裡寫圖片描述
說明:
如果呼叫某個不存在的類,
在報錯之前,
我們還有一次介入機會 __autoload函式

系統會呼叫__autoload()函式,
並把”類名”自動傳給__autoload函式

我們自然可以在__autoload裡 載入需要的類!

在引入HumanModel類的問題上,我們就可以這樣實現

function __autoload($c) {
    echo '我先自動載入';
    echo './' . $c . '.php';
    echo '<br />';
    require('./' . $c . '.php');
}

$lisi = new HumanModel();
$lisi->t();

執行:
這裡寫圖片描述

補充說明

有人會覺的require引入的檔案,就相當與把原始檔中的內容黏貼到了此處,那此處就相當於在__autoload()的方法中定義了HumanModel類,這樣可以嗎?
回答:可以

function test() {
    // 函式內可以寫任何合法的PHP程式碼,包含再宣告一個函式/類
    echo '來';
    class Bird {
        public static function sing() {
            echo '百靈鳥兒放聲唱!';
        }
    }
    echo '去';
}
Bird::sing();   // Class 'Bird' not found

為什麼出錯呢?
因為:test()函式還沒有執行了

function test() {
    // 函式內可以寫任何合法的PHP程式碼,包含再宣告一個函式/類
    echo '來';
    class Bird {
        public static function sing() {
            echo '百靈鳥兒放聲唱!';
        }
    }

    echo '去';
}

test();
Bird::sing();  

自動載入只能用__autoload函式嗎?

答:不是的,其實也可以指定一個函式

比如 我們就用zidongjiazai()函式

注意:要通知系統,讓系統知道–我自己寫了一個自動載入方法,用這個!
怎麼通知: 用系統函式 spl_auto_register

*/

// 下面這句話,是把zidongjiazai函式註冊成為”自動載入函式”;

spl_autoload_register('zidongjiazai');

function zidongjiazai($c) {
    echo '我引入了./' .  $c . '.php','<br />';
    require('./' .  $c . '.php');
}
$HumanModel = new HumanModel();

$HumanModel->t();

/**
__autoload 是一個函式

我能自己註冊一個自動載入函式
能否註冊類的一個靜態方法 當 自動載入函式?

TP裡這麼做的