我正试图在类中引用静态函数:
class Test {
function __construct() {
$this->fn1 = self::fn2;
}
public static function fn2() {
}
}
然后我收到此错误:
Undefined class constant 'fn2'
为什么?
答案 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的更多信息,请参阅Manual和RFC。
启用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