2012-03-16 61 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

相关问题