[英]How to reference a static function inside class in php?
我正在嘗試在類內引用靜態函數:
class Test {
function __construct() {
$this->fn1 = self::fn2;
}
public static function fn2() {
}
}
然后我得到這個錯誤:
Undefined class constant 'fn2'
為什么?
您已經定義了一個靜態函數 :
Test {
function__construct()
{
$this->fn1 = self::fn2();
}
public static function fn2()
{
}
}
如果要為變量分配函數,則最好使用匿名又名lambda函數來執行此操作,因為它們是一等公民,並且可以自由傳遞,返回和分配。 在以這種方式處理靜態方法引用時,PHP並不是唯一的,因為JAVA類似地實現了它們:
方法引用...是已經有名稱的方法的緊湊,易於閱讀的lambda表達式。
您可以基於PHP中的callable創建一個匿名函數,因此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";
在此處查看實時代碼
在此示例中,匿名函數由靜態getClosure方法創建並返回。 當調用此方法時,它將返回閉包,其內容與靜態方法fn2相同。 接下來,返回的閉包被調用,這將導致顯示靜態方法fn2的名稱。
有關可調用對象的更多信息,請參見《 手冊》和《 RFC》 。
隨着PHP 7的啟動,您可以創建一個復雜的callable 。 在下面的代碼中,復雜的callable是一個可調用的數組:
<?php
class foo
{
public static function test()
{
return [__CLASS__, 'fn2'];
}
public static function fn2()
{
echo __METHOD__;
}
}
echo foo::test()();
查看實時代碼 。
注意:從PHP 7.0.23開始,您可以使用包含以雙冒號aka paaamayim nekudotayim分隔的類和方法名稱的字符串創建一個復雜的可調用對象。 看這里 。
具有更廣泛的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();
查看實時代碼
不知道這是否是您想要的,但是至少這可能會給您提示:
<?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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.