簡體   English   中英

如何使用static關鍵字調用非靜態方法?

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

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