[英]How to call a non static method using static keyword?
我只是檢查OOPs靜態/非靜態概念,發現一些奇怪的東西。
我聽說靜態方法的輸出可以通過使用帶有解析運算符(::)的靜態關鍵字來獲得。 但在我的程序中,我使用靜態關鍵字獲取非靜態方法的值。 任何人都可以解釋這個程序嗎? 我很困惑。
<?php
error_reporting(E_ALL);
class parentclass
{
protected function sum()
{
return 145;
}
}
class childclass extends parentclass
{
protected function sum()
{
return 125;
}
}
class grandchild extends childclass
{
function sum()
{
return 100;
}
function __construct()
{
echo static::sum(); // 100 as output but how
}
}
$obj = new grandchild();
?>
除此之外如果我正在將子類的函數sum()作為靜態
class childclass extends parentclass
{
protected static function sum()
{
return 125;
}
}
然后它也給出致命錯誤如下:
致命錯誤:無法在類childclass中創建非靜態方法parentclass :: sum()static
但為什么我不稱這個功能。
你可以靜態地調用一個函數,即使它沒有被聲明為static
,只要你不在它里面引用$this
。
這就是原始代碼有效的原因。
但是,您無法更改繼承方法的簽名。
致命錯誤:無法在類childclass中創建非靜態方法parentclass :: sum()static
當你聲明protected static function sum()
在childclass
,要更改繼承的方法從簽名parentclass
未特別聲明static
。
Bottomline,你試圖使用我推薦的一些PHP怪癖。 是的,他們工作,但這並不意味着你應該使用它們。
堅持嚴格的編碼風格。 為靜態和實例使用編寫單獨的方法,並按預期調用它們。
您使用static
作為后期靜態綁定 。 但你所聽到的是相當的
class Foo
{
static function bar() {}
}
$baz = Foo::bar();
我想要更好地理解后期靜態綁定,你可以編寫代碼的變體:
<?php
error_reporting(E_ALL);
class parentclass
{
protected function sum()
{
return 145;
}
public function do_the_math()
{
printf('Static sum: %d, Self sum: %d',
static::sum(),
self::sum());
}
}
class childclass extends parentclass
{
protected function sum()
{
return 125;
}
}
class grandchild extends childclass
{
function sum()
{
return 100;
}
}
$obj = new grandchild();
$obj->do_the_math();
輸出:
Static sum: 100, Self sum: 145
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.