2015-04-01 38 views
2

現在假設我有幾個類都在一個文件中,我運行作曲家dump-autoload -o,我嘗試使用它的任何工作類,現在如何將所有這些類都包含到單個文件中使用require_once,應該也有效嗎?我問這與我之前問的問題,還沒有得到答覆:Loading external libraries in laravel-5Composer Dump-Autoload Scan需要文件嗎?

現在,當我轉儲每個需要的文件的內容(類)到單個文件中,我可以使用這些類,但是當我使用require_once我總是沒有找到類?是否有一個原因?或者我只是沒有正確使用它?

爲了進一步澄清什麼,我問:

require_once("Class_1.php"); 
require_once("Class_2.php"); 
require_once("Class_3.php"); 
require_once("Class_4.php"); 

針對這樣的:

class Class_1 extends Class_Extender_1 {..} 
class Class_2 extends Class_Extender_2 {..} 
class Class_3 extends Class_Extender_3 {..} 
class Class_4 extends Class_Extender_4 {..} 

回答

0

給定文件src/require-everything.php,內容如下

require_once("Class_1.php"); 
require_once("Class_2.php"); 
require_once("Class_3.php"); 
require_once("Class_4.php"); 

composer.json與以下G含量

{ 
    "autoload": { 
     "files": ["src/require-everything.php"] 
    } 
} 

文件src/require-everything.php將始終自動加載, 當你包括作曲的供應商/ autoload.php(你轉儲與作曲家自動加載磁帶機後)。

請考慮這樣一個事實,即該文件被加載在每個請求!

它等同於你的bootstrap放置require 'src/require-everything.php';

我的建議是真正使用自動加載:要麼通過包裝要求在一類本身或使用類映射自動加載(與類的文件夾)的一部分。

{ 
    "autoload": { 
     "classmap": ["src/folder-with-classes/"] 
    } 
} 

將掃描所有.php文件的文件夾,並提取所有類名。這些數據形成了關係爲classname => filename的等級圖。現在,如果你在你的應用程序中使用Class_1,作曲家自動加載機將使用相應的文件名自動加載它。

1

你應該避免做手工自動加載優化。

我在this answer中說過,類映射自動加載(這也是在轉儲「優化」自動加載器時完成的)並不是每種情況下最快的解決方案,它取決於執行的代碼。你必須測量它是否加速了任何事情,否則你可能會在不知不覺中變得更糟。

這同樣適用於將多個類合併成一個文件。這樣做的好處是通過訪問較少的文件來減少磁盤I/O。缺點是更多的代碼在每種情況下都不需要執行,並使用更多的內存。此外,它創建了一個不太明顯的代碼結構,所以它可能也是一個維護缺陷。

人類在猜測什麼樣的策略是最好的時候通常很糟糕 - 但他們不需要,他們有機器可以完成所有這些優化。這也是你應該嘗試的。不要在開始時擺弄優化的自動加載 - 尋找一個好的代碼結構,使用PSR-4自動加載(每個文件需要一個類,這是一件好事),並在應用程序接近完成時進行優化。

+0

實際上使用psr-4來自動加載那個需要其他文件的文件,每個類都擴展了一些其他的類,所以我實際上需要它們都被自動加載。 – user3718908 2015-04-01 23:08:45

+0

但是你不需要自己做 - 這就是自動加載的意義。通過優化單個數據庫查詢,您可能會獲得更多的性能,而不是通過優化PHP中類的加載。記住:你不能優化你無法衡量的東西。繼續,使用分析器,確定你獲得的速度增益。如果這很重要,則應用它。如果不是 - 暫時忽略。如有必要,稍後再回來。 – Sven 2015-04-01 23:26:54

+0

還有一點,因爲我們正在討論優化自動加載:不要使用'* _once()'函數。自動加載只會自動進行一次,但這些功能需要跟蹤哪些文件已加載,哪些文件對性能也有影響。 – Sven 2015-04-01 23:29:16