2013-04-10 39 views
0

所以我使用spl_autoload_register來加載我的類。不過,我有這樣的結構,我的課:PHP - 在子文件夾中使用spl_autoload_register

classes 
    classfolder 
     classfile 

所以通常當我是他們,包括我在做這個:

include('classes/modules/module_class.php'); 

現在使用spl_autoload_register我將如何處理子文件夾?我沒有能力升級到PHP 5.3使用命名空間,我需要做這樣的事情嗎?

$module = new modules_Module(); 

然後我與spl_autoload_register註冊功能炸_,並使用所述第一部分作爲類文件夾和第二部分作爲類方法。但後來我不得不將類名更改爲modules_Module吧?如果是這樣的話?或者有更好的方法來做到這一點?

+0

@rid我可以很容易地得到包含的類文件就好了,問題是當我調用類名,它調用任何我使用的名稱。因此,如果我使用了module_Module(),那麼它的期望類module_Module()就是一個類名。除非你說我可以在我登記的功能裏面啓動這個類? – John 2013-04-10 23:59:10

回答

1

不是說你應該做的,但是在PHP-土地常見的模式是文件名中的使用情況,以及和不添加的東西一樣_classclass.Module.php

include('classes/Modules/Module.php'); 

在PHP 5.2(沒有namespace支撐位),然後你用_工作強調:

class Modules_Module 
{ 
} 

所以這是它是如何正常進行。 不是說你必須這樣做。你也可以按你的意願解決。但是人們也應該知道這個更常見的模式,因爲它有助於閱讀/導航第三方源代碼。

+0

+1。這也是我的經驗,比「php namespacing」更好。 – 2013-04-11 00:16:16

0

基本就是這樣。

除了名稱空間(你不能使用)和命名約定的類名(這將需要你重命名所有的類),唯一的另一個理智的選擇是建立一個類圖:一個數組映射類名到定義它們的文件的完整路徑。

這樣做意味着每次添加或修改類時都必須更新類映射,這是自動化的主要候選項。看看使用Composer的autoload functionality,它可以根據需要做到這一點,並自動生成自動加載代碼。作曲家非常好,即使忽略其90%的功能也很有用。

+0

類映射可以工作,但如果您擁有較大的代碼庫(即使用Symfony框架並清除緩存),則該映射將變得不便。 – 2013-04-11 00:02:10

+0

@MikePurcell:在談論無法重寫的遺留代碼時,可以選擇笨重的類地圖和笨拙的「手動包含所有內容,因爲您無法設置自動加載」。無論如何,作曲家可以幫助很大。 – Jon 2013-04-11 00:07:23

0

只要您的文件以某種方式排列,讓我們從類名到文件名,您可以實現自動加載器功能,但不管您喜歡。您的自動加載功能不需要將類名稱轉換爲目錄路徑:它的工作僅僅是獲取類名稱,並且如果可能的話,只需輸入正確的文件即可。

保持你的映射相對簡單,對人類也很有用,但是 - 所以你知道要編輯哪個文件。

例如,您可以說所有開始於Mod_的課程都位於名爲classes/modules的目錄中,但所有其他課程都位於名爲classes/general的目錄中。

你也可以使用file_exists來檢查一個類的多種可能性,但要記住,這對PHP檢查文件系統和試圖記住文件去往哪裏都有一定的代價。

相關問題