2010-11-09 106 views
1

我爲我們公司建立了一個CMS,它具有大量的功能,其中許多功能與我們使用CMS所用的大多數網站都沒有使用的特定功能相關。那麼我的目標就是隻在需要時才包含函數的腳本(當函數被調用時)。定義PHP函數的名字時可以使用變量嗎?

現在,我只是簡單地調用每個函數,要求函數的實際腳本所在的文件,然後調用第二個函數(與函數名稱相同,但帶有下劃線前綴)其中包含該函數的實際腳本。例如:

function foo($a,$b) { 
    require_once "funtions-foo.php"; 
    return _foo($a,$b); 
} 

然而,這似乎有點重複我。我在尋找的是一種'捕捉'函數調用的方法,如果它的名字在'包含'函數的數組中,我將包含正確的文件並調用函數。例如:

catch_function_call($function,$arg1,$arg2) { 
    $array = array(
     'foo' => 'functions-foo.php', 
     'bar' => 'functions-bar.php' 
    ); 
    if($array[$function]) { 
     require_once $array[$function]; 
     return $function($arg1,$arg2); 
    } 
} 

有我假設「catch_function_call」功能,當一個函數被調用能以某種方式趕上。因爲我知道沒有這樣的功能,但是,我的第二個想法是簡單地使用變量來定義每個「包含」功能。例如:

$array = array(
    'foo' => 'functions-foo.php', 
    'bar' => 'functions-bar.php' 
); 
foreach($array as $function => $file) { 
    function $function($arg1,$arg2) { 
     $_function = "_".$function; 
     require_once $file; 
     return $_function($arg1,$arg2); 

    } 
} 

當然,這給了我,因爲我顯然不能在函數的名稱定義它,當使用一個變量的錯誤。有關如何繞過此解決方案或其他解決方案的任何想法,以便在需要時僅包含一個函數?

回答

1

您可以分別在對象或類上使用__call__callStatic,這將近似您要查找的功能。您可以在this thread中閱讀一些解釋。

但是在全局函數空間中沒有辦法做到這一點。

+0

這可能聽起來像是最好的解決方案,但它似乎需要重寫所有函數調用,這可能比它的價值更多的工作。儘管如此,對於未來發展還是很瞭解的。 – Charlie 2010-11-09 20:20:05

0

只需在每個需要的函數之前使用include_once

0

你有沒有考慮過將你的函數分組到集合中,並將它們作爲靜態方法存儲在對象中。然後,您可以使用__autoload()函數並停止擔心何時包含。

所以:

class Rarely_Used{ 

    static function foo(){} 
    static function bar(){} 
} 

class Only_for_Managers{ 
    static function ohboy(){} 
    static function punish(){} 
} 
+0

我也喜歡這個想法,但它又需要改變所有的函數調用,這些調用比我現在認爲的值得多一點工作。 – Charlie 2010-11-09 20:21:05

0

爲什麼包括所有的文件這麼大的問題?由於您可能正在使用APC,因此繁重的文件系統訪問不會成爲問題。除此之外,如果功能更多,函數哈希表中的查找顯然會更慢,但這肯定不會成爲應用程序的瓶頸。

+0

我正試圖減少系統中的內存使用量。我們建立的一些網站流量相當高,而我們可以做的任何事情來減少內存消耗都是從我們的角度來看。 – Charlie 2010-11-09 20:22:23

相關問題