簡體   English   中英

如何在php中的類內部引用靜態函數?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM