【发布时间】:2020-05-20 21:35:51
【问题描述】:
在 PHP 中,我想引用一个成员函数。
对于一般函数,我可以将函数分配给变量,如下所示:
php > function h1() {echo "h1";}; h1();
h1
php > function h2() {echo "h2";}; h2();
h2
php > $hh = h1; $hh(); // ok: assign to a variable and call
h1
php > $hh = h2; $hh(); // ok: assign to a variable and call
h2
如果您想将一个函数作为参数传递给另一个函数,这很有用。
但是成员函数呢?
class C {
function k(){ echo "k";}
function j(){ $a = $this->k; $a();} // assign k() to a variable
function m(){ $a = "k"; $this->$a();} // assign the name "k" to a variable
};
这行得通:
php > $c = new C();
php > $c->k();
k
> $c->m(); // variable-function approach
k
但这没有(在 CLI 中测试)
php > $c->j();
Warning: Uncaught Error
是我的语法错误,还是变量函数方法是唯一的方法?
【问题讨论】:
-
很高兴找到@NoahBoegli。这个问题是关于一般函数的,我的第一个例子可能是 h1 和 h2 回答了这个问题。我不确定这个功能在 PHP 中有多新,所以在 2011 年的旧帖子发布时它可能不可用。我的问题是关于成员函数。
-
感谢@JaredFarrish,是的,这是我上面的函数 m() 的示例。结果是 $hh = h1; $hh();不是对 h1() 的引用,而是与 $hh="h1" 相同。是的,PHP 接受不带引号的单词作为字符串。但是,您可以使用 $h1 = function() { ...} 代替函数 h1(){...}。现在 $h1 是一个对象,而不是字符串,您可以将其重新分配为 $hh = $h1。顺便说一句,我同时弄清楚了:您可以使用“复杂的可调用对象”。在上面的 C 类中: function j(){ $func = array($this,"k"); $函数(); } 做我需要的。数组中的第一个元素可以是任何对象。
-
在对@NoahBoegli 进行了一些挖掘之后,您提到的问题确实有一个适用的答案(尽管这个问题并不是我所追求的)。所以谢谢你指点我。
标签: php