簡體   English   中英

如何從同一個類的靜態方法調用非靜態方法?

[英]How to call non-static method from static method of same class?

我正在處理PHP代碼。

這是解釋我的問題的示例代碼:

class Foo {

    public function fun1() {
             echo 'non-static';   
    }
    public static function fun2() {
        echo "static" ;
        //self::fun1();
        //Foo::fun1(); 
    }
}

如何從靜態方法調用非靜態方法?

注意:這兩個功能在整個站點中都使用,這是未知的。 我無法對它們的靜態/非靜態性質進行任何更改。

您必須在靜態方法中創建一個新對象才能訪問該類中的非靜態方法:

class Foo {

    public function fun1()
    {
        return 'non-static';
    }

    public static function fun2()
    {
        return (new self)->fun1();
    }
}

echo Foo::fun2();

結果將non-static

稍后編輯:正如看到將變量傳遞給構造函數的興趣,我將發布該類的更新版本:

class Foo {

    private $foo;
    private $bar;

    public function __construct($foo, $bar)
    {
        $this->foo = $foo;
        $this->bar = $bar;
    }

    public function fun1()
    {
        return $this->foo . ' - ' . $this->bar;
    }

    public static function fun2($foo, $bar)
    {
        return (new self($foo, $bar))->fun1();
    }
}

echo Foo::fun2('foo', 'bar');

結果將是foo - bar

主要區別在於您可以為類調用靜態方法,而無需實例化該類的對象。 所以,在你的靜態方法中嘗試

Foo $objInst = new Foo();
$objInst->fun1();

但我不明白這在任何情況下都有什么意義。

Asnwer 選擇正確解決問題。 有一個有效的用例(設計模式),其中具有靜態成員函數的類需要調用非靜態成員函數,在此之前,該靜態成員還應該使用構造函數和構造函數實例化單例。

案例:例如,我正在實現 Swoole HTTP 請求事件,將其作為具有靜態成員的類提供回調。 靜態成員做兩件事; 它通過在類構造函數中進行初始化來創建類的單例對象,第二個靜態成員所做的是調用非靜態方法“run()”來處理請求(通過與 Phalcon 橋接)。 因此,沒有構造函數和非靜態調用的靜態類對我不起作用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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