如何在php中引用类内部的静态函数?

时间:2017-10-16 01:49:22

标签: php

我正试图在类中引用静态函数:

class Test {

    function __construct() {

        $this->fn1 = self::fn2;


    }

    public static function fn2() {

    }


}

然后我收到此错误:

Undefined class constant 'fn2'

为什么?

3 个答案:

答案 0 :(得分:0)

您已定义static function

Test {
    function__construct()
    {
        $this->fn1 = self::fn2();
    }

    public static function fn2()
    {

    }
}

答案 1 :(得分:0)

更新

如果要为变量分配函数,最好这样做 与匿名aka lambda函数,因为他们是一等公民,可以自由传递,返回和分配。 PHP以这种方式处理静态方法引用并不是唯一的,因为JAVA类似地实现它们:

  

方法引用...是紧凑的,易于阅读的lambda表达式   已经有名字的方法。

您可以基于PHP中的可调用来创建匿名函数,因此OP可能希望执行如下操作,PHP 7.1.10或更高版本支持:

<?php
class Test {
    public static function fn2() {
         return __METHOD__;
    }
    public static function getClosure (){
        return Closure::fromCallable(["Test","fn2"]);
    }
}


echo Test::getClosure()(),"\n";

查看实时代码here

在此示例中,静态getClosure方法创建并返回匿名函数。当一个人调用这个方法时,它会返回一个闭包,其内容与静态方法fn2相同。接下来,调用返回的闭包,这将导致显示静态方法fn2的名称。

有关来自callables的更多信息,请参阅ManualRFC

启用PHP 7后,您可以创建complex callable。在下面的代码中,complex callable是一个可调用的数组:

<?php
class foo 
{
    public static function test()
    {   
        return [__CLASS__, 'fn2'];
    }   

    public static function fn2()
    {   
        echo __METHOD__;
    }   
}

echo foo::test()();

请参阅live code

注意:从PHP 7.0.23开始,您可以使用包含由双冒号aka paaamayim nekudotayim分隔的类和方法名称的字符串创建复杂的可调用对象;见here

具有更广泛PHP支持的解决方案如下:

<?php

class Test {

    public static function fn2() {
           return __METHOD__;
    }
    public static function tryme(){
      return call_user_func(["Test","fn2"]);
    }

}
// return closure and execute it
echo Test::tryme();

请参阅live code

答案 2 :(得分:0)

不确定这是否是你想要的,但至少这可能会给你一个提示:

<?php

class Test {

    function __construct() {

        $this->fn = function(){
             return self::realFn();
        };

    }

    public function callFn (){
        $fn = $this->fn ;//yes, assigning to a var first is needed. You could also use call_user_func
        $fn();
    }
    public static function realFn() {
        echo 'blah';
    }


}

$x = new Test();

$x->callFn();

您可以在此处进行测试:https://3v4l.org/KVohi