2013-03-19 99 views
0

的使用在PHP中,讓我們說我有三大類:如何避免include_once

database.php 
item.php 
user.php 

兩個類項目和用戶擁有的聲明include("database.php");,以連接到數據庫和執行查詢。

說,我有一個頁面,我想顯示用戶信息和項目信息。我必須鍵入

include("item.php"); 
include("user.php"); 

但是,這當然,給我一個錯誤,因爲我包括數據庫類兩次。我知道我可以在項目和用戶類中使用include_once("database.php");,但是我已閱讀過各種線程,最好不要使用include和require的_once版本。

當需要在多個地方包含數據庫類時,避免在PHP代碼中使用「_once」的最佳做法是什麼?

+0

你可以參考這些說不使用_once的文章嗎?我一直在需要的地方使用它們,並且從來沒有遇到任何問題。你可以像C++頭文件一樣做相同的處理,並定義某種變量,如果它尚未定義,那麼在連接類中做所有事情,如果它已經定義了,你已經知道你已經包含了。 – 2013-03-19 10:28:12

+0

正常使用'include_one'和'require_once',使用自動加載器 – 2013-03-19 10:28:42

+0

忽略該建議,這是錯誤的。 *要*使用'require_once'(或者,如Marko所說,配置自動加載器更好)。 – 2013-03-19 10:29:10

回答

3

我原以爲最好的解決方案就是不要在您的主代碼中執行include調用。相反,自動加載你的文件,所以只有在需要時纔會包含它們。現在

spl_autoload_register(function ($class) { 
    include 'classes/' . $class . '.php'; 
}); 

,如果你的代碼獲取到像new database();並沒有加載database類,此功能將包括:classes/database.php。如果將來再次使用該類,則該類將會被加載,因此自動加載器將不會再使用。

有關更多信息,請參閱spl_autoload_register的文檔。

+0

這很漂亮!謝謝。 – Matthias 2013-03-19 14:38:12

0

您可以在包含其他腳本的主腳本中包含數據庫,但include_oncerequire_once的使用是正常的,並且不存在任何關鍵性能問題。

-1

我不知道你的* _once基本的恐懼,但是...

include("database.php"); 
include("item.php"); 
include("user.php"); 

一種方法是調用它,因爲你需要從類中刪除包括線。

+0

這是非常糟糕的,如果作爲一個單元項需要訪問數據庫,它不應該依賴於其他類,包括它的依賴關係,它應該包括它自己的依賴關係。 – 2013-03-19 10:37:27

+0

如果根據具體情況選擇不同的數據庫會怎樣?現在你必須打開所有的課程。無論如何,無論如何,數據庫應該被注入依賴於它的類 - 但我沒有打擾在我的回覆中進入... – Cups 2013-03-19 10:40:46