php 之 類的自動載入
阿新 • • 發佈:2019-02-14
引出自動載入
我們有一個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裡這麼做的