[英]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.
}
}
<?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的子類實現受保護的靜態方法。
當靜態方法完全適用於靜態數據但不應從“外部”調用時,受保護的靜態方法很有用。
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.