1. <tt id="5hhch"><source id="5hhch"></source></tt>
    1. <xmp id="5hhch"></xmp>

  2. <xmp id="5hhch"><rt id="5hhch"></rt></xmp>

    <rp id="5hhch"></rp>
        <dfn id="5hhch"></dfn>

      1. php自動加載--autoload()函數(shù)用法

        時間:2020-09-17 18:17:44 PHP 我要投稿

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

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

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

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

          自動加載原理

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

          /* 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);

          ?>

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

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

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

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

          /* autoload.php */

          <?php

          function __autoload($classname) {

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

          }

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

          var_dump ($person);

          ?>

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

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

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

          (2) PHP的autoload機制的實現(xiàn)

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

          /*

          autoload_function

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

          throw

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

          prepend

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

          */

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

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

          通過spl_autoload_register注冊

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

          下面是一個小例子:

          <?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ù)實現(xiàn)

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

          <?php

          function__autoload($className) {

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

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

          if (is_file($fileName)) {

          require_once($fileName);

          }

          }

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

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

        簡單介紹php構(gòu)造函數(shù)用法10-04

        PHP中error-reporting函數(shù)用法11-12

        PHP打印輸出函數(shù)用法詳解10-04

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

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

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

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

        PHP的壓縮函數(shù)11-15

        關(guān)于php的sprintf函數(shù)的用法 控制浮點數(shù)格式11-16

        国产高潮无套免费视频_久久九九兔免费精品6_99精品热6080YY久久_国产91久久久久久无码

        1. <tt id="5hhch"><source id="5hhch"></source></tt>
          1. <xmp id="5hhch"></xmp>

        2. <xmp id="5hhch"><rt id="5hhch"></rt></xmp>

          <rp id="5hhch"></rp>
              <dfn id="5hhch"></dfn>