我正在尝试逐步解决一些我未编写的PHP代码,但陷入僵局,无法确定如何继续。
我已经达到了一个类成员函数,看起来像这样:
public function exec($cmd, $args) {
// ... some argument checks here
$result = $this->$cmd($args);
这段代码在做什么?$ cmd的值是字符串“ info”,因此我假设它正在调用成员函数“ info” ...但是当我将跟踪代码放在该函数的顶部时,它不会产生任何输出。
我也尝试过使用var_dump($ this-> $ cmd),但它显示NULL。但是函数正在被调用并返回结果,所以也许var_dump无法转储函数?
我在这里找到了另一个答案,这表明以上内容无论如何都不起作用。但是,它肯定是为$ result分配了一个复杂的值,在调用返回后我可以转储该值。
如果重要的话,下面是我的跟踪代码。我正在查看Apache error.log文件,该文件在其他地方都可以正常工作,因此我假设跟踪代码很好:
$STDERR = fopen('php://stderr', 'w+');
ob_start();
var_dump($some_variable);
$result999 = ob_get_clean();
fwrite($STDERR, "TRACE: $result999\n");
fclose($STDERR);
更新:我也尝试过将一个空的return语句作为“ info”函数的第一行,但$result
仍被分配与以前相同的值...
如您所知,$result
并且$args
是变量。
如您所料,$this
并且$cmd
也是ALSO变量。
$ this引用类实例。例如,如果为myClass.a
,则任何“ myClass”方法都可以将“ a”引用为“ $ this-> a”。
与许多其他面向对象的语言不同,PHP还支持将成员名称作为变量。它支持“ Variable variables”就是这样$cmd
:无论作为参数传递的“ cmd”值是多少,函数都希望找到匹配的方法。
您可以在此处找到更多详细信息:
http://php.net/manual/zh/functions.variable-functions.php
至于为什么不点击trace语句-这只是调试问题:
如果可能的话,我将启动您最喜欢的PHP调试器并单步执行代码。
以下是一些支持PHP调试的IDE:
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句