中文字幕在线一区二区在线,久久久精品免费观看国产,无码日日模日日碰夜夜爽,天堂av在线最新版在线,日韩美精品无码一本二本三本,麻豆精品三级国产国语,精品无码AⅤ片,国产区在线观看视频

      php自動(dòng)加載--autoload()函數(shù)用法

      時(shí)間:2024-08-26 06:25:50 PHP 我要投稿
      • 相關(guān)推薦

      php自動(dòng)加載--autoload()函數(shù)用法

        autoload在php主版本中是自動(dòng)加載文件的一個(gè)方法了我們可以定義許多的文件在目錄然后通過autoload加載了,下面一起來看看autoload函數(shù)用法。

        在PHP5之后,我們可以通過 __autoload來解決這個(gè)問題。 而且在PHP5.1之后,還提供了 spl_autoload_register() 來提供更完善的加載機(jī)制。

        通過閱讀了 Autoloading in PHP 這篇文章,我理解的 Autoload 的加載機(jī)制,當(dāng)通過 new 來實(shí)例化一個(gè)類時(shí),PHP會(huì)通過定義的__autoload 函數(shù)加載相應(yīng)的文件,如果這個(gè)類文件使用了 extends 或者 implements 需要用到其他的類文件,php會(huì)重新運(yùn)行 autoload 去進(jìn)行類文件的查找和加載,如果發(fā)生了兩次對(duì)同一類文件的請(qǐng)求,就會(huì)報(bào)錯(cuò)

        自動(dòng)加載原理

        在使用PHP的OO模式開發(fā)系統(tǒng)時(shí),通常大家習(xí)慣上將每個(gè)類的實(shí)現(xiàn)都存放在一個(gè)單獨(dú)的文件里,這樣會(huì)很容易實(shí)現(xiàn)對(duì)類進(jìn)行復(fù)用,同時(shí)將來維護(hù)時(shí)也很便利。這也是OO設(shè)計(jì)的基本思想之一。在PHP5之前,如果需要使用一個(gè)類,只需要直接使用include/require將其包含進(jìn)來即可。下面是一個(gè)實(shí)際的例子:

        /* Person.class.php */

        <?php

        class Person {

        var $name, $age;

        function __construct ($name, $age)

        {

        $this->name = $name;

        $this->age = $age;

        }

        }

        ?>

        /* no_autoload.php */

        <?php

        require_once (”Person.class.php”);

        $person = new Person(”Altair”, 6);

        var_dump ($person);

        ?>

        在這個(gè)例子中,no-autoload.php文件需要使用Person類,它使用了require_once將其包含,然后就可以直接使用Person類來實(shí)例化一個(gè)對(duì)象。

        但隨著項(xiàng)目規(guī)模的不斷擴(kuò)大,使用這種方式會(huì)帶來一些隱含的問題:如果一個(gè)PHP文件需要使用很多其它類,那么就需要很多的require/include語句,這樣有可能會(huì)造成遺漏或者包含進(jìn)不必要的類文件。如果大量的文件都需要使用其它的類,那么要保證每個(gè)文件都包含正確的類文件肯定是一個(gè)噩夢(mèng)。

        PHP5為這個(gè)問題提供了一個(gè)解決方案,這就是類的自動(dòng)裝載(autoload)機(jī)制。autoload機(jī)制可以使得PHP程序有可能在使用類時(shí)才自動(dòng)包含類文件,而不是一開始就將所有的類文件include進(jìn)來,這種機(jī)制也稱為lazy loading。

        下面是使用autoload機(jī)制加載Person類的例子:

        /* autoload.php */

        <?php

        function __autoload($classname) {

        require_once ($classname . “class.php”);

        }

        $person = new Person(”Altair”, 6);

        var_dump ($person);

        ?>

        通常PHP5在使用一個(gè)類時(shí),如果發(fā)現(xiàn)這個(gè)類沒有加載,就會(huì)自動(dòng)運(yùn)行__autoload()函數(shù),在這個(gè)函數(shù)中我們可以加載需要使用的類。在我們這個(gè)簡(jiǎn)單的例子中,我們直接將類名加上擴(kuò)展名”.class.php”構(gòu)成了類文件名,然后使用require_once將其加載。從這個(gè)例子中,我們可以看出autoload至少要做三件事情,第一件事是根據(jù)類名確定類文件名,第二件事是確定類文件所在的磁盤路徑(在我們的例子是最簡(jiǎn)單的情況,類與調(diào)用它們的PHP程序文件在同一個(gè)文件夾下),第三件事是將類從磁盤文件中加載到系統(tǒng)中。第三步最簡(jiǎn)單,只需要使用include/require即可。要實(shí)現(xiàn)第一步,第二步的功能,必須在開發(fā)時(shí)約定類名與磁盤文件的映射方法,只有這樣我們才能根據(jù)類名找到它對(duì)應(yīng)的磁盤文件。

        因此,當(dāng)有大量的類文件要包含的時(shí)候,我們只要確定相應(yīng)的規(guī)則,然后在__autoload()函數(shù)中,將類名與實(shí)際的磁盤文件對(duì)應(yīng)起來,就可以實(shí)現(xiàn)lazy loading的效果。從這里我們也可以看出__autoload()函數(shù)的實(shí)現(xiàn)中最重要的是類名與實(shí)際的磁盤文件映射規(guī)則的實(shí)現(xiàn)。

        但現(xiàn)在問題來了,如果在一個(gè)系統(tǒng)的實(shí)現(xiàn)中,如果需要使用很多其它的類庫,這些類庫可能是由不同的開發(fā)人員編寫的,其類名與實(shí)際的磁盤文件的映射規(guī)則不盡相同。這時(shí)如果要實(shí)現(xiàn)類庫文件的自動(dòng)加載,就必須在__autoload()函數(shù)中將所有的映射規(guī)則全部實(shí)現(xiàn),這樣的話__autoload()函數(shù)有可能會(huì)非常復(fù)雜,甚至無法實(shí)現(xiàn)。最后可能會(huì)導(dǎo)致__autoload()函數(shù)十分臃腫,這時(shí)即便能夠?qū)崿F(xiàn),也會(huì)給將來的維護(hù)和系統(tǒng)效率帶來很大的負(fù)面影響。在這種情況下,難道就沒有更簡(jiǎn)單清晰的解決辦法了吧?答案當(dāng)然是:NO! 在看進(jìn)一步的解決方法之前,我們先來看一下PHP中的autoload機(jī)制是如何實(shí)現(xiàn)的。

        (2) PHP的autoload機(jī)制的實(shí)現(xiàn)

        實(shí)現(xiàn)自動(dòng)加載,我們需要借助一個(gè)函數(shù)來實(shí)現(xiàn):

        /*

        autoload_function

        欲注冊(cè)的自動(dòng)裝載函數(shù)。如果沒有提供任何參數(shù),則自動(dòng)注冊(cè) autoload 的默認(rèn)實(shí)現(xiàn)函數(shù)spl_autoload()。

        throw

        此參數(shù)設(shè)置了 autoload_function 無法成功注冊(cè)時(shí), spl_autoload_register()是否拋出異常。

        prepend

        如果是 true,spl_autoload_register() 會(huì)添加函數(shù)到隊(duì)列之首,而不是隊(duì)列尾部。

        */

        bool spl_autoload_register ([ callable $autoload_function [, bool $throw = true [, bool $prepend = false ]]] )

        最常用的一種方式就是通過spl_autoload_register函數(shù)來注冊(cè)自動(dòng)加載類的方法!

        通過spl_autoload_register注冊(cè)

        我們可以通過spl_autoload_register函數(shù)注冊(cè)類的方法,在類調(diào)用前,我們判斷類文件路徑是否是文件,如果是則引入之!

        下面是一個(gè)小例子:

        <?php

        class autoload

        {

        publicstatic functionload($className)

        {

        $name = str_replace('\\', '/', $className);

        $fileName = sprintf('%s.php', $name);

        if (is_file($fileName)) {

        require_once $fileName;

        }

        // var_dump($fileName);

        }

        }

        // 這樣寫也可以的

        // spl_autoload_register(array("autoload", "load"));

        spl_autoload_register("autoload::load");

        通過__autoload函數(shù)實(shí)現(xiàn)

        我們新建一個(gè)autoload.php文件,里面只放如下代碼也可以實(shí)現(xiàn)上面一樣的功能:

        <?php

        function__autoload($className) {

        $name = str_replace('\\', '/', $className);

        $fileName = sprintf('%s.php', $name);

        if (is_file($fileName)) {

        require_once($fileName);

        }

        }

        小結(jié):自動(dòng)加載可以使得我們的操作更簡(jiǎn)便,經(jīng)常需要自動(dòng)加載一些默認(rèn)配置,因此掌握自動(dòng)加載的實(shí)現(xiàn)是非常重要的!

      【php自動(dòng)加載--autoload()函數(shù)用法】相關(guān)文章:

      簡(jiǎn)單介紹php構(gòu)造函數(shù)用法08-31

      PHP中error-reporting函數(shù)用法08-13

      php中的字符編碼轉(zhuǎn)換函數(shù)的用法09-10

      有關(guān)php parse-str() 函數(shù)的定義和用法09-11

      關(guān)于php的sprintf函數(shù)的用法 控制浮點(diǎn)數(shù)格式08-25

      PHP的壓縮函數(shù)06-21

      PHP中substr函數(shù)字符串截取用法10-15

      淺析php函數(shù)的實(shí)例06-08

      PHP網(wǎng)絡(luò)操作函數(shù)08-26

      javascript寫的異步加載js文件函數(shù)09-28

      主站蜘蛛池模板: 中国少妇久久一区二区| 久久久午夜毛片免费| 一区二区三无码| 亚洲熟妇夜夜一区二区三区| 宜川县| 2021最新久久久视精品爱| 亚洲一级av大片在线观看| 全南县| 日本口爆吞精在线视频| 国产一区二区三区杨幂| 无码一区二区三区久久精品| 黄骅市| 永善县| 女同性恋亚洲一区二区| 开心五月婷婷激情在线| 久久精品美女久久| 午夜麻豆影片在线观看| 济源市| 永靖县| 连南| 中文字幕人妻丝袜成熟乱| a√无码在线观看| 自拍视频在线观看成人| 精品国产一区二区三区久久女人| 国产日产久久福利精品一区| 亚洲一区二区三区在线视频观看| 资源县| 吉首市| 闽侯县| 亚洲国产一区二区在线| 黄陵县| 茶陵县| 额尔古纳市| 陵川县| 欧洲AV秘 无码一区二区三| 太保市| 安阳县| 灵石县| 亚洲亚洲亚洲亚洲亚洲天堂| 99国产精品无码专区| 亚洲福利av一区二区|