我下載了一個框架和代碼,我有一個關於require
和include
與class_exists
的問題。瞭解所需課程並存在
在我下載的代碼,我看到:
require_once('class.php');
除了:
if(class_exists('class') == false) { require('class.php'); }
我得到require_once
意味着只有1次和類存在檢查類是否存在。
我的問題是:第二個比第一個好嗎?爲什麼?
我下載了一個框架和代碼,我有一個關於require
和include
與class_exists
的問題。瞭解所需課程並存在
在我下載的代碼,我看到:
require_once('class.php');
除了:
if(class_exists('class') == false) { require('class.php'); }
我得到require_once
意味着只有1次和類存在檢查類是否存在。
我的問題是:第二個比第一個好嗎?爲什麼?
此條件:
if(class_exists('class') == false) { require('class.php'); }
防止require_once
被調用。
require_once
如果您的項目中包含大量文件(特別是框架),速度會很慢,因爲它們必須掃描代碼以確保該文件不包含兩次或多次。所以如果你有超過25個你包含的文件並且它們是嵌套的,require_once將不得不檢查它們。
第二個將提供更多的保護,從兩次導入類。第一個導入類文件一次,但如果由於某種原因從另一個文件中導入了類,第二個將會提取該類已經被更早的聲明並且不需要類文件。
注意:兩個同名的類幾乎總是一個壞主意,所以除非你做了一些瘋狂的事情,'require_once'應該沒問題。 – 2012-01-15 20:08:39
require_once()
只include
是個文件一次。
class_exists()
檢查您的類是否存在。
您可以在多個文件中定義一個類,並且require_once()
將不在意。你的第二塊將會。
正如在其他答案中所討論的那樣,兩種變體之間存在語義差異。此外,在託管服務提供商不提供PHP操作碼緩存(APC或equiv)的共享託管方案中,所有代碼文件都需要在每個請求中讀入並編譯。這裏的主要殺手並不是編譯時間本身(在現代核心上~50M PHP語句/秒),但是如果不在文件系統緩存中預先緩存,則收集PHP文件的I/O開銷(I/Os /秒)。
在這種情況下,如果一個應用程序需要90個查詢中有十幾個模塊的核心,那麼將這些數據包緩存到一個bulkload文件中是有意義的。如果採用這種類型的解決方案,那麼圍繞類文件的要求放置一個防護欄使其具有防爆功能。
還警告:如果您使用__autoload()
功能做JIT類加載,要知道,class_exists('fred')
將觸發fred
自動加載。如果你想要一個弱探頭,那麼你需要使用謂詞!in_array('fred', get_declared_classes())
。
其實是一個非常有趣的前景,我很驚訝,我從來沒有見過第二次使用。 – esqew 2012-01-15 20:05:30
值得一提的是,現在有更好的方法http://php.net/spl-autoload-register – KingCrunch 2012-01-15 20:10:07
我猜這裏每個文件都代表一個且只有一個類?每個文件沒有多個類? – 2012-01-15 20:49:21