__autoload()函數

如果定義了__autoload()函數,那麼在代碼中使用一個未定義的類的時候,該函數就會被調用,你可以在該函數中加載相應的類實現文件,如:
function __autoload( $classname )
{
    require_once( “{$classname}.php”);
}
但該函數已經不被建議使用,原因是一個項目中僅能有一個這樣的__autoload()函數,因爲php不允許函數重名。但當你使用一些類庫的時候,難免會出現多個autoload()函數的需要,於是sql_autoload_register取而代之:

sql_autoload_register()會將一個函數註冊到autoload函數列表中,當出現未定義的類的時候,SPL會按照註冊的倒序逐個調用被註冊的autoload函數,這意味着你可以使用sql_autoload_register()註冊多個autoload函數。




例子:
同一個目錄下,
文件Back.phhp
<?php
class Back {
    public function make() {
        print('back class');
    }
}
?>
文件Go.php
<?php
class Go {
    public function make() {
        print('go class');
    }
}
?>
文件test.php
<?php
function __autoload($classname)
{
    require_once($classname .'.php');
}

$go= new Go();
$go->make();
$back = new Back();
$back->make();

執行test.php時,實例化Go類時,會自動調用__autolod方法。
__autoload()是專門爲類的不存在而設計的,很多框架利用到了這個函數,實現類文件的自動加載!!!




**************
備註 2017年2月1日週三
基本概念:
1.php代碼本質上就是一行行的由解釋器執行,php引入面向對象後,依然是這樣。
2.要使用哪個類必須先引入,用require、include引入類文件以後,才能使用類的成員變量和成員方法。
yii2.0框架思路:
yii2.0框架,入口腳本調用的類文件中,就使用了sql_autoload_register(),它進而注入了yii2.0寫的自動載入類的方法。 框架比較複雜,一個http請求過來以後,php腳本執行,然後返回http響應,這個php腳本執行過程要加載很多很多的類。
框架一開始就得需要很多基礎的類,yii2.0把他們配置到了一個配置文件中,配置了命名空間和實際文件路徑的對應關係。一旦腳本運行過程中,需要某個類,就先從這個配置文件中讀取,如果有得到實際文件路徑,就直接require這個文件,這就能使用這個類了。
如果腳本執行過程中,要引入的類文件不在配置列表中,就按照yii2.0的方法實現,即根據命名空間的結構,解析成對應的目錄路徑,再去找文件在不在。







發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章