2012-01-15 23 views
14

我下載了一個框架和代碼,我有一個關於requireincludeclass_exists的問題。瞭解所需課程並存在

在我下載的代碼,我看到:

require_once('class.php'); 

除了:

if(class_exists('class') == false) { require('class.php'); } 

我得到require_once意味着只有1次和類存在檢查類是否存在。

我的問題是:第二個比第一個好嗎?爲什麼?

+0

其實是一個非常有趣的前景,我很驚訝,我從來沒有見過第二次使用。 – esqew 2012-01-15 20:05:30

+1

值得一提的是,現在有更好的方法http://php.net/spl-autoload-register – KingCrunch 2012-01-15 20:10:07

+2

我猜這裏每個文件都代表一個且只有一個類?每個文件沒有多個類? – 2012-01-15 20:49:21

回答

9

此條件:

if(class_exists('class') == false) { require('class.php'); } 

防止require_once被調用。

require_once如果您的項目中包含大量文件(特別是框架),速度會很慢,因爲它們必須掃描代碼以確保該文件不包含兩次或多次。所以如果你有超過25個你包含的文件並且它們是嵌套的,require_once將不得不檢查它們。

1

第二個將提供更多的保護,從兩次導入類。第一個導入類文件一次,但如果由於某種原因從另一個文件中導入了類,第二個將會提取該類已經被更早的聲明並且不需要類文件。

+0

注意:兩個同名的類幾乎總是一個壞主意,所以除非你做了一些瘋狂的事情,'require_once'應該沒問題。 – 2012-01-15 20:08:39

1
  • require_once()include是個文件一次。

  • class_exists()檢查您的是否存在。

您可以在多個文件中定義一個類,並且require_once()將不在意。你的第二塊將會。

5

正如在其他答案中所討論的那樣,兩種變體之間存在語義差異。此外,在託管服務提供商不提供PHP操作碼緩存(APC或equiv)的共享託管方案中,所有代碼文件都需要在每個請求中讀入並編譯。這裏的主要殺手並不是編譯時間本身(在現代核心上~50M PHP語句/秒),但是如果不在文件系統緩存中預先緩存,則收集PHP文件的I/O開銷(I/Os /秒)。

在這種情況下,如果一個應用程序需要90個查詢中有十幾個模塊的核心,那麼將這些數據包緩存到一個bulkload文件中是有意義的。如果採用這種類型的解決方案,那麼圍繞類文件的要求放置一個防護欄使其具有防爆功能。

還警告:如果您使用__autoload()功能做JIT類加載,要知道,class_exists('fred')觸發fred自動加載。如果你想要一個弱探頭,那麼你需要使用謂詞!in_array('fred', get_declared_classes())