2012-03-22 85 views
0

我讀了關於PHP中的類自動加載,但直到現在我不明白爲什麼我們應該使用__autoload()方法?php重新評估包含的文件

,我讀了

PHP不使用 這種方法,原因是其具有方便的小功能包括, include_once和require_once,阻止您加載相同 文件多於一次,但不像一種編譯語言PHP在評估期內每次重複評估 這些表達式 將包含一個或多個這些表達式的文件加載到此站點中的 運行時why we should use autoloading,

但我不明白什麼是PHP 重新評估在上面的聲明中的含義! 爲什麼require-once不能解決多次加載php文件的問題?

+1

這段代碼沒有上下文是完全沒有意義的。 「PHP不使用這個方法」 - > *什麼方法*?坦率地說,作者聽起來並不令人信服。 – Jon 2012-03-22 07:45:06

+0

@PalAla鏈接被破壞! – Songo 2012-03-22 07:48:04

+0

對不起,我修改了它,現在可以使用。 – palAlaa 2012-03-22 07:50:27

回答

1

original article當你讀它更廣泛的(見下文)更明確:

它只是說,__autoload()比include_once()的聰明,因爲函數include_once()的,必須顯式編碼時,類可能是必需的,也因爲這個函數每次出現時都需要處理,以便知道參數中給出的文件是否已經加載。

相反,其他函數__autoload()只能針對您可能需要的幾個類調用一次。然後PHP嘗試僅在缺少類定義時加載相應的源文件。我們可以總結這個論證:每個類/函數源需要一個include_once(),而只有一個__autoload()可能足夠用於具有相同位置規則的一組類源。

摘錄的文章:

Why you should use an autoload function in PHP

的類加載的東西,管理像Java 和C#語言並不需要擔心,類裝載器內置於 編譯。原因是其具有方便的小

[...] 

PHP不使用此方法包括函數,include_once和require_once,防止您 加載相同的文件不止一次,但不像編譯 語言,PHP重每次將包含這些 表達式中的一個或多個的文件加載到運行時時,在評估期間內都會反覆評估這些表達式。這就是在PHP 5中引入的標準PHP 庫(SPL)以及精彩的小型_autoload 函數用於提高PHP代碼的速度和一致性的功能。

__autoload是一個神奇的函數,您可以定義這個函數,它可以讓PHP知道它何時沒有加載類,但需要加載該類 。

0

自動加載意味着,如果你需要在腳本自動包含像

require_once ("class.user.php"); 
require_once ("class.module.php"); 

一些類爲了避免這樣的代碼,每個腳本,你可以使用PHP

1

include_once語句本身是重新評估的自動加載功能每當遇到。

for ($i = 0; $i < 100; $i++) { 
    include_once 'foo.php'; 
    new Foo; 
} 

這將評估(「運行」)include_once 100次。這可能會有所放緩。另一方面:

for ($i = 0; $i < 100; $i++) { 
    new Foo; 
} 

當使用自動加載時,只有在第一次需要該類時纔會觸發文件包含的邏輯。

+0

我在自動加載函數裏面做了一個echo語句,我改變了echo語句並刷新了頁面,視圖沒有改變!這意味着對象僅被初始化一次。但是我應該怎麼做才能重新初始化對象?我嘗試關閉瀏覽器並重新打開它,但它不會更改內容。 – palAlaa 2012-03-22 07:58:58

+0

對不起,什麼?所有這些都不適用於刷新頁面,只能在同一請求中多次執行相同的操作。 – deceze 2012-03-22 08:12:53

+0

不是它觸發對象一次,甚至我改變了構造函數的內容,視圖並沒有改變! – palAlaa 2012-03-22 08:27:52

1

,但到現在我不明白爲什麼我們要使用它

當你的結構和組織你的工作,因爲該組織的它會導致你有許多相似的類文件。更簡單的例子是一個mvc,但不僅如此,任何自定義結構都會導致類似文件包含一個類,然後由於相似性,您將它們放在同一個文件夾中,並且還使用通用文件命名約定,例如,您可以擁有一個控制器和模型目錄。檢查示例文件:employeeModel.phpstatisticsModel.phpindexController.phperrorController.php

那麼你可以利用這個事實,看看這個定製的自動加載功能:

/*** function to include model and view classes ***/ 
    function __autoload($class_name) 
    {if(__DEBUG) eval(__DEBUG_EVAL); 

      /*** Load a model class ***/ 
      $mfile=__SITE_PATH .'model/'.$class_name.'.php';//echo 'model file'.NL;v($file); 
      if (file_exists($mfile)){ 
      include ($mfile); 
       if(__DEBUG) //store debug info before include 
        eval('error_log("autoload Success file exists: ".$mfile.NL);'); 
      return true; 
      } 

      /*** Load a view class ***/ 
      $cfile=__SITE_PATH .'view/'.'/'.substr($class_name,0,-4).'/'.$class_name.'.php';//v($file); 
      if (file_exists($cfile)){ 
      include ($cfile); 
       if(__DEBUG) //store debug info before include 
        eval('error_log("autoload Success file exists: ".$cfile.NL);'); 
      return true; 
      } 
      return false; 
    } 

它也有幾行用於稍後可以輕鬆移除的調試。由於事物的相似性,它可以自己決定包括以及發生時報告錯誤。 沒有這個自動載入函數你必須注意,在使用之前,類文件是可用的。另外這個函數將允許包含一個文件,如果仔細檢查它沒有使用include_once,這意味着autoload只會在文件之前沒有被看到時觸發,這與簡單文件包含每次觸發代碼被執行爲非常正確地通知它。

結論自動加載=每個文件觸發一次,自動執行,因此您直接執行一個類而不必關心它。