簡體   English   中英

PHP抽象靜態類方法的替代模型

[英]Alternative model for PHP abstract static class methods

好的,所以我在這里閱讀了很多有關此的文章 ,但是我認為這是一個特定的新問題。

我想要我們這里很多人錯誤地稱為“抽象靜態方法”的功能。 也就是說: 我想要一個類,它堅持要對其進行擴展的類來實現某些靜態方法

圍繞被廣泛討論的不允許抽象靜態存在的問題,似乎有兩條路可走,但兩條路線似乎都很微不足道。

問題

以下生成錯誤:“ PHP Strict Standards:靜態函數A :: fn()不應為抽象”。

<?php
abstract class A
{
     abstract static public function fn();
}

class B extends A
{
    static public function fn()
    {
         // does something on class vars etc.
    }
}

解決方案1:使用接口

<?php
interface iA {
    static function fn();
}


abstract class A implements iA 
{
} // obviously this would have other stuff in it in reality

class B extends A
{
    static public function fn()
    {
         // does something on class vars etc.
    }
}

問題在於接口假設(指示)所有方法都是公共的。 因此,盡管達到了堅持抽象類的子類具有某些靜態方法的目的,但它只能用於公共方法; 仍然無法確保A的子類實現受保護的靜態方法。

當靜態方法完全適用於靜態數據但不應從“外部”調用時,受保護的靜態方法很有用。

解決方案2:例外

abstract class A
{
     static public function fn()
     {  
         throw new Exception(get_called_class() . " must implement fn()");
     }

}

class B extends A
{
    static public function fn()
    {
         // does something on class vars etc.
    }
}

如果在調用fn()時可以在運行時使用。 但是在運行時必須處理編碼語法錯誤並沒有什么用。 盡管這可能只是一種方法的破解,但每種方法都有很多代碼。

這種設計有什么問題,以至於該語言正確地禁止了這種設計? 奇怪的是,有多種方法可以堅持要求子類提供大多數類型的方法,但不能提供靜態方法。

這是因為靜態方法屬於定義它們的 不管繼承樹如何, A::fn()B::fn()是兩種不同的方法。 因此,將A::fn()定義為abstract幾乎沒有意義。

也許您所討論的方法根本不應該是抽象的? 如果要使用任何種類的多態性,都應該涉及對象。

我可能完全錯了,但是我使用時沒有問題

abstract class A
{
     abstract static public function fn();
}

class B extends A
{
    static public function fn()
    {
         print 1;
    }
}

B::fn();

它產生1作為輸出。 我已經在這里運行您的代碼。 您使用什么版本的php?

暫無
暫無

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

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