2012-03-16 68 views
0
function mainFunction() { 
    functionA(5, "blah"); 
    functionB("ok", "whatever"); 
} 

如何編寫函數GetFunctions返回mainFunction內的函數?是否有可能在PHP中使用方法獲取語句?

如何用mainFunction中給出的參數調用它們?

如何給他們打電話如下?

foreach (GetFunctions(mainFunction) as $function) { 
    print "Calling function $function: "; 
    call($functionA); // called with parameters(5, "blah") 
} 

在PHP 5.2.8工作

編輯:好的,這裏有一個更完整的解釋。我試圖讓它容易理解,但顯然這不是一個好主意。

目標是在給定的靜態方法內調用每個斷言。我正在編寫一個測試框架。每個斷言都返回true或false。

我打電話的方法如下。

$methods = get_class_methods('LibraryTests'); 
foreach ($methods as $method) { 
    if (StartsWith($method, 'Test')) { 
     print "calling: " . $method . ": "; 
     call_user_func('LibraryTests::' . $method); 
    } 
} 

上面的代碼調用類中的每個方法,但我想分別調用每個斷言並跟蹤結果(true/false)。 CallAssertion應該調用每個斷言(如TestUnit::AssertEqual(GetFormattedHour(5), "5 PM");)。這是我正在問的方法。

這裏是類:

class LibraryTests extends TestUnit { 

    static $success = 0; 
    static $failure = 0; 
    static $total = 0; 

    static function CallAssertion($assertion) { 
     self::$total += 1; 
     if ($assertion) { self::$success += 1; } 
     else { self::$failure += 1; } 
    } 

    static function TestGetFormattedHour() { 
     TestUnit::AssertEqual(GetFormattedHour(5), "5 PM"); 
     TestUnit::AssertEqual(GetFormattedHour(16), "4 PM"); 
    } 

所以,問題是,如何寫CallAssertion?

+1

請不要這樣做,有一定更好的方法做,你實際上是試圖完成。 – Nicole 2012-03-16 20:02:44

+0

你想達到什麼目的?有一個非常(非常)很好的機會,有比這更好的方法。 – 2012-03-16 20:04:28

+0

@NickC - 是的,這可能是一個壞主意,但你不知道情況,也許沒有別的選擇。也許他所做的是完全安全的。 – 2012-03-16 20:04:59

回答

2

你不能。

相反,創建一個類並使用反射來獲取它的方法。

無論如何,你會想弄清楚爲什麼這是必要的,看看是否有一個完全不同的方法可以使用。

(如果這是調試的目的,你可以使用debug_backtrace檢查,但其目的不是叫你在你的問題所描述的功能。)

+0

這不是他想要做的。 – Simon 2012-03-16 20:03:08

+0

不''debug_backtrace()'做這項工作嗎? – 2012-03-16 20:03:34

+0

他似乎沒有爲了調試目的而這樣做。無論如何,我會添加一個鏈接。 – webbiedave 2012-03-16 20:04:36

1

嗯,什麼問題是,你實際上是試圖解決的問題。對我來說,這聽起來像你試圖在運行時檢查調用堆棧。如果是這樣,我建議只使用debug_backtrace()src)。

儘管如此,我不會建議在生產中使用該函數,因爲它對代碼的衝擊很大。

1

一種可能性是在包含main_function的PHP文件上執行file_get_contents,然後通過解析出main_function及其調用的函數。當然,我不知道你的情況,所以可能無法正常工作。

+0

你是認真的嗎? – 2012-03-16 20:04:50

+1

@drgomesp爲什麼不呢?似乎對我來說是合法的解決方案。根據以前的情況,這看起來可能很荒謬,但如果我想問一個問題,我想要得到任何想法,而我的信息似乎來自我擁有的信息。 – 2012-03-16 20:05:56

+2

我同意這個解決方案。主要的問題是,如果你傳遞一個非常量值作爲參數,它不能解決它的運行時間值。取決於海報想要做什麼問題。 – Simon 2012-03-16 20:06:04

相關問題