2010-03-16 71 views
2

我試圖找到最好的實用方法來即時導入功能......讓我解釋一下。PHP導入功能

說我有一個名爲功能目錄具有以下文件:

array_select.func.php 
stat_mediam.func.php 
stat_mean.func.php 
..... 

我想:加載每個單獨的文件(其內部定義的函數),並使用它,就像一個內部php函數..例如array_pop(),array_shift()等。

一旦我偶然發現了一個教程(我現在再也找不到),它將用戶定義函數編譯爲PHP安裝的一部分。雖然這不是一個很好的解決方案,因爲在shared/res上託管你的eller不能重新編譯PHP安裝。

我不想與未來版本的PHP /其他擴展衝突,即如果一個名爲X的函數突然成爲內部php函數的一部分(即使它本身可能沒有相同的功能)我不希望PHP因此而拋出致命錯誤,並且慘敗。

所以,我能想到的最好的方法是,以檢查是否函數定義使用function_exists(),如果是拋出一個通知,這樣很容易在日誌文件來跟蹤,否則定義函數。然而,這可能會轉化爲在其他文件中有很多include/require語句,我需要這樣一個函數,而我並不喜歡這樣的函數。或者可能讀取目錄並遍歷每個* .func.php文件和include_once。雖然我覺得這有點難看。

問題是,你有沒有偶然發現過一些處理這種情況的源代碼?它是如何實施的?你有沒有做過類似的事情?我需要儘可能多的想法! :)

+0

爲什麼一個班不做的特殊原因?動態加載每個單獨的功能將會變得越來越難以維護,可能不是那麼實用。 – tadamson 2010-03-16 20:09:26

+0

爲了保持能力,我可能最終會這樣做。 – 2010-03-16 20:23:17

+0

考慮到這個問題沒有太多答案(不是我很驚訝),我會看看我能想出什麼來滿足速度/可維護性/實用性。如果我確實找到滿足此要求的解決方案,那麼我會回來並將其發佈到此處;) – 2010-03-16 20:53:21

回答

3

您可以將這些功能放入類中,然後設置__autoload函數。如果你反對在類中封裝函數,這個解決方案可能不適用於你。我個人喜歡它,因爲它允許我爲我的函數命名空間並在它們之間共享私有方法。

首先,您設置了類似於此的自動加載功能。你會想調整命名約定來適應你自己的風格,並且可能會引入一些錯誤處理,但這只是爲了獲得基本的想法。

function __autoload($class_name){ 
    require_once(strtolower("library/$class_name.class.php")); 
} 

然後在代碼中的任何地方,不管範圍如何,都可以這樣做。

arrayFunctions::doStuff($myArray); 

PHP將自動嘗試包括「圖書館/ arrayFunctions.class.php」,並尋找一個在arrayFunctions類稱爲「doStuff」方法。

+0

可能是實現它的一種方法。但爲什麼我應該有一個只有一個靜態方法的類?我知道,我很難取悅。其實,我不知道是否有可能將參數傳遞給__construct(),並直接從__construct()獲取返回值,就像調用__toString();當您嘗試回顯對象時。 – 2010-03-16 20:22:01

+0

Re:「爲什麼我應該有一個只有一個靜態方法的類?」 你可以(也應該!)在類中放置多個方法。從組織的角度來看它很棒,因爲你基本上是用這種方式對你的功能進行分類的。 – 2010-03-16 20:49:21

0

我有這個想法的問題。打擊文件系統以包含單一功能在降低每秒最大可能請求方面非常昂貴。

在單個文件(靜態類?)中加載/解析五個函數通常要好得多,並且只使用其中的兩個(一個stat調用),而不是爲兩個函數(兩個stat調用)加載兩個文件。

當你需要全部五項功能時,這顯然會變得更糟。

+0

所以在這種情況下,即使格雷格W的解決方案遭受.. – 2010-03-16 20:32:17

+0

只有當你寫一個功能每類,我會考慮一個相當濫用類。 – 2010-03-16 21:09:34

+0

嗯,我不明白爲什麼你應該有一個文件與所有類,然後使用自動加載。爲什麼不首先使用include/require呢? – 2010-03-16 21:22:55

0
  1. 要在需要時自動加載內容,請將函數放在類中並使用自動加載。
  2. 對於名稱衝突,請使用名稱空間(如果您有PHP 5.3)。