【问题标题】:PHP reference to a member functionPHP 对成员函数的引用
【发布时间】: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


【解决方案1】:

function j(){ $a = $this->k; $a();} // assign k() to a variable

这里有点误会。也就是将类属性k 的值分配给$a。这与班级成员k() 不同。如果k 不作为C 的类属性存在,则$a 的值将是NULL

您可能会认为将其更改为k(),但这只是分配k() 的返回值,而不是函数本身的内容。

我认为这可能会有所帮助:What is the scope of a PHP function defined within a PHP anonymous function?

【讨论】:

  • 确实,这就是为什么 $a = $this->k 不是错误的原因,尽管方法 k() 已经存在并且同名属性 k 确实不应该被允许。可惜。这是PHP。正如引用的帖子所提到的,这是与匿名函数一起使用的典型构造,但这不是我在这里所拥有的。那么,你知道得到我想要的东西的语法吗?
  • 我不确定你到底想要什么。您的问题似乎基于您在第一个代码块中“将函数分配给变量”的事实,但这并不是实际发生的事情。您在 PHP 中使用所谓的“变量函数”,这基本上只是字符串扩展:php.net/manual/en/functions.variable-functions.php.
  • 你是对的! $hh = h1 是一个字符串赋值,不带引号!我认为 $hh = h1 会将函数 h1 分配给变量 $h,将其视为类似于 $h1 = function(){echo "inside anon";} 的(第一类)函数对象您可以将其称为 $h1() ;或者,如我所愿,重新分配 $hh = $h1 并调用 $hh();顺便说一句,我同时弄清楚了:您可以使用“复杂的可调用对象”。在上面的 C 类中: function j(){ $func = array($this,"k"); $函数(); } 做我需要的。
  • 感谢您将我指向变量函数页面,其中提到了复杂可调用对象下的数组(对象,名称)。
【解决方案2】:

我写了一个简单的例子来说明这里发生了什么。在您的示例内部函数(方法)中,从外部范围调用不存在的函数 k(),这就是出现致命错误的原因。

function k() {
    return 'k()';
}

class C {
    function k(){ return 'C->k()';}
    function l(){ return 'C->l()';}

    function g(){ return k();}
    function h(){ return l();}
};

$c = new C();

print($c->k()); //C->k()

print($c->g()); //k()

print($c->h()); //PHP Fatal error:  Uncaught Error: Call to undefined function l()

简单的解决方法是使用complex callables

class C {
    function l(){ return 'C->l()';}

    function i(){
        $callable = array($this,'l');
        return $callable(); }
};

$c = new C();

print($c->i()); // C->l()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-24
    • 1970-01-01
    • 1970-01-01
    • 2011-11-04
    • 1970-01-01
    • 1970-01-01
    • 2011-11-29
    • 2020-11-07
    相关资源
    最近更新 更多