首頁  >  文章  >  後端開發  >  詳解兩種PHP之自動載入函數

詳解兩種PHP之自動載入函數

零到壹度
零到壹度原創
2018-04-11 13:34:332069瀏覽

在使用ThinkPHP框架時,查看他的原始碼有用到__autoload和apl_autoload_register這兩個函數,而這兩個函數就是用來進行自動載入的。其主要作用就算,當你的原始碼檔案使用了還沒有載入的文件,就會觸發這兩個函數來進行載入這個沒有載入的檔案

php的__autoload函數是一個魔術函數,在這個函數出現之前,如果一個php檔案裡引用了100個對象,那麼這個文件就需要使用include或require引進100個類別文件,這將導致該php檔案無比龐大。於是就有了這個 __autoload函數。

__autoload函數在什麼時候呼叫呢?

當php檔案中使用了new關鍵字實例化一個物件時,如果該類別沒有在本php檔案中被定義,將會觸發__autoload函數,此時,就可以引進定義該類別的php文件,爾後,就能實例化成功了。 (注意:如果需要實例化的對象,在本文件中已經找到該類的定義的話,就不會觸發__autoload函數)

#Animal.php<?php
   class Animal{}?>
#main.php<?php
  function __autoload($classname){
     $classpath = "{$classname}.php";     if(file_exists($classpath)){         require_once($classpath);
     }else{         echo $classpath." not be found!";
     }
  }  $ani = new Animal();?>

如上述兩個文件,運行php main.php  
(1)執行到new Animal()時,發現class Animal沒有定義;  
(2)觸發了__autoload函數,該函數引進了Animal.php檔案; 
(3)實例化成功。
好了,了解完了__autoload函數的作用,再來看看spl_autoload_register函數的作用。
spl_autoload_register函數的作用就是將自訂函數設定替換為__autoload函數(注意:當檔案中同時出現__autoload和spl_autoload_register時,以spl_autoload_register為準)
那麼將main.php改為如下也有同樣的功能:

#main.php<?php
  function myLoad($classname){
     $classpath = "{$classname}.php";     if(file_exists($classpath)){         require_once($classpath);
     }else{         echo $classpath." not be found!";
     }
  }
  spl_autoload_register("myLoad");  $ani = new Animal();?>

           

在使用ThinkPHP框架時,檢視他的原始碼有用到__autoload和apl_autoload_register這兩個函數,而這兩個函數就是用來進行自動載入的,資料來源https://blog.csdn.net/gavin_new/article/details/52805811
其主要作用就算,當你的源碼檔案使用了還沒有加載的文件,就會觸發這兩個函數來進行加載這個沒有載入的檔案

php的__autoload函數是一個魔術函數,在這個函數出現之前,如果一個php檔案裡引用了100個對象,那麼這個檔案就需要使用include或require引進100個類文件,這將導致該php文件無比龐大。於是就有了這個 __autoload函數。

__autoload函數在什麼時候呼叫呢?

當php檔案中使用了new關鍵字實例化一個物件時,如果該類別沒有在本php檔案中被定義,將會觸發__autoload函數,此時,就可以引進定義該類別的php文件,爾後,就能實例化成功了。 (注意:如果需要實例化的對象,在本文件中已經找到該類的定義的話,就不會觸發__autoload函數)

#Animal.php<?php
   class Animal{}?>
#main.php<?php
  function __autoload($classname){
     $classpath = "{$classname}.php";     if(file_exists($classpath)){         require_once($classpath);
     }else{         echo $classpath." not be found!";
     }
  }  $ani = new Animal();?>

如上述兩個文件,運行php main.php  
(1)執行到new Animal()時,發現class Animal沒有定義;  
(2)觸發了__autoload函數,該函數引進了Animal.php檔案; 
(3)實例化成功。
好了,了解完了__autoload函數的作用,再來看看spl_autoload_register函數的作用。
spl_autoload_register函數的作用就是將自訂函數設定替換為__autoload函數(注意:當檔案中同時出現__autoload和spl_autoload_register時,以spl_autoload_register為準)
那麼將main.php改為如下也有同樣的作用:

#main.php<?php
  function myLoad($classname){
     $classpath = "{$classname}.php";     if(file_exists($classpath)){         require_once($classpath);
     }else{         echo $classpath." not be found!";
     }
  }
  spl_autoload_register("myLoad");  $ani = new Animal();?>

以上是詳解兩種PHP之自動載入函數的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn