【问题标题】:What does $this->$cmd($arg) mean in PHP?$this->$cmd($arg) 在 PHP 中是什么意思?
【发布时间】:2015-06-27 22:04:37
【问题描述】:

我正在尝试逐步执行一些不是我编写的 PHP 代码,但我陷入了僵局,无法弄清楚如何继续。

我已经达到了一个看起来像这样的类成员函数:

public function exec($cmd, $args) {

// ... some argument checks here

$result = $this->$cmd($args);

这段代码在做什么? $cmd 的值是字符串“info”,所以我假设它正在调用成员函数“info”...但是当我将跟踪代码放在该函数的顶部时,它不会产生任何输出。

我也尝试过使用 var_dump($this->$cmd) 但它会打印 NULL。然而该函数正在被调用并正在返回一个结果,所以也许 var_dump 不能转储函数?

我找到了另一个答案here,这表明上述内容无论如何都不起作用。但是,它肯定会为 $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 仍然被赋予与以前相同的值......

【问题讨论】:

  • 正如你所说,它只是调用了值名称为$cmd 的方法,$args 是参数,非常简单!
  • @Rizier123 这怎么会有用?
  • @Rizier123 这就是我的想法,但我在该方法中所做的任何事情(例如放置跟踪输出)似乎都没有发生。
  • @Michael 你有输出缓冲吗?
  • 如果所讨论的类是控制器或类命令,那么很有可能它在某处调用子类的“info”方法。

标签: php


【解决方案1】:

如您所知,$result$args 是变量。

如您所料,$this$cmdALSO 变量。

$this 指的是类实例。例如,如果myClass.a,则“a”可以被任何“myClass”方法引用为“$this->a”。

与许多其他面向对象的语言不同,PHP 还支持将成员名称作为变量。它支持"Variable variables'。这就是$cmd 的含义:无论您作为参数传递的“cmd”值如何,函数都希望找到匹配的方法。

您可以在此处找到更多详细信息:

http://php.net/manual/en/functions.variable-functions.php

How to explain 'this' keyword in a best and simple way?

至于为什么你没有点击你的跟踪语句 - 这只是一个调试问题:

  • “$cmd”是否会转换为您认为的名称?
  • 你们班有这样的方法吗?
  • 是否还有其他可能存在冲突的类?

如果可能的话,我会启动你最喜欢的 PHP 调试器并单步执行代码。

以下是一些支持 PHP 调试的 IDE:

http://www.sitepoint.com/best-php-ide-2014-survey-results/

【讨论】:

  • 感谢您确认此调用确实在做我认为应该做的事情。原来它正在调用“信息”函数,但在派生类中,没有基类。我将在“是否还有其他可能存在冲突的类”下归档。
猜你喜欢
  • 2012-05-04
  • 2011-05-06
  • 1970-01-01
  • 2011-08-27
  • 1970-01-01
  • 2011-06-20
  • 1970-01-01
  • 2010-12-04
  • 2014-05-20
相关资源
最近更新 更多