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