国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > PHP > 正文

php自動加載__autoload()函數用法

2024-05-04 21:50:03
字體:
來源:轉載
供稿:網友

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

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

自動加載原理:

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

  1. /* Person.class.php */ 
  2. <?php 
  3.  class Person { 
  4.   var $name$age
  5.    
  6.   function __construct ($name$age
  7.   { 
  8.    $this->name = $name
  9.    $this->age = $age
  10.   } 
  11.  } 
  12. ?> 
  13.  
  14. /* no_autoload.php */ 
  15. <?php 
  16.  require_once (”Person.class.php”); 
  17.  
  18.  $person = new Person(”Altair”, 6); 
  19.  var_dump ($person); 
  20. ?> 

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

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

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

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

  1. /* autoload.php */ 
  2. <?php 
  3.  function __autoload($classname) { 
  4.   require_once ($classname . “class.php”); 
  5.  } 
  6.  
  7.  $person = new Person(”Altair”, 6); 
  8.  var_dump ($person); 
  9.  ?> 

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

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

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

(2) PHP的autoload機制的實現

實現自動加載,我們需要借助一個函數來實現:

  1. /* 
  2. autoload_function 
  3. 欲注冊的自動裝載函數。如果沒有提供任何參數,則自動注冊 autoload 的默認實現函數spl_autoload()。 
  4.  
  5. throw 
  6. 此參數設置了 autoload_function 無法成功注冊時, spl_autoload_register()是否拋出異常。 
  7.  
  8. prepend 
  9. 如果是 true,spl_autoload_register() 會添加函數到隊列之首,而不是隊列尾部。 
  10. */ 
  11. bool spl_autoload_register ([ callable $autoload_function [, bool $throw = true [, bool $prepend = false ]]] ) 

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

通過spl_autoload_register注冊

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

下面是一個小例子:

  1. class autoload  
  2.     publicstatic functionload($className)  
  3.     { 
  4.         $name = str_replace('//', '/', $className); 
  5.         $fileName = sprintf('%s.php'$name); 
  6.         if (is_file($fileName)) { 
  7.             require_once $fileName
  8.         } 
  9.         // var_dump($fileName); 
  10.     } 
  11.  
  12. // 這樣寫也可以的 
  13. // spl_autoload_register(array("autoload", "load")); 
  14. spl_autoload_register("autoload::load"); 

通過__autoload函數實現

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

  1. function__autoload($className) { 
  2.  
  3.     $name = str_replace('//', '/', $className); 
  4.     $fileName = sprintf('%s.php'$name); 
  5.  
  6.     if (is_file($fileName)) { 
  7.         require_once($fileName); 
  8.     } 

小結:

自動加載可以使得我們的操作更簡便,經常需要自動加載一些默認配置,因此掌握自動加載的實現是非常重要的!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 乐东| 阜平县| 江门市| 兴业县| 苗栗市| 田阳县| 静安区| 应用必备| 灌阳县| 临夏县| 云林县| 广西| 札达县| 徐水县| 富阳市| 栾城县| 剑阁县| 兴仁县| 三亚市| 香河县| 保亭| 苍南县| 防城港市| 张北县| 太仆寺旗| 南城县| 天全县| 苍溪县| 渝中区| 洞口县| 临武县| 麦盖提县| 张掖市| 大荔县| 德钦县| 鱼台县| 饶阳县| 申扎县| 轮台县| 拜泉县| 阿克苏市|