我有一組擴展抽象類的類。抽象類包含使用後期靜態綁定來獲取子類中定義的信息的方法。因此,例如,抽象類可能具有包含線的方法:PHP - 強制類聲明屬性
$var = static::$childVar . ' some text';
以這種方式,能夠在運行時在抽象類中定義的方法,以基於一個變量的值不同串在子類中定義。
我想要做的是有一些機制,迫使子類聲明這個變量,消除如果變量沒有設置被調用方法的可能性。
使用接口,可能需要一個類來定義方法(以及常量,不幸的是它們的可見性不能通過public/protected/private修改)。所以如果一個類實現了一個接口,但是沒有定義接口中指定的所有方法,則會產生一個錯誤。但是,沒有辦法使用接口來要求類定義屬性。
我已經看到一些建議在接口中使用getter方法的材料(例如getChildVar())隱式地要求變量聲明,但這不適合我,因爲我不想讓變量在類之外訪問(他們有protected
知名度)。
類似地,常量不起作用,因爲它們不支持protected
可見性修改器。
我知道我總是可以使用isset()
語句在抽象類的方法(或者甚至是構造函數)中檢查它,但與使用接口確保方法定義相比,這看起來不夠優雅。我想知道是否有一些標準的方法來做到這一點,而不用硬編碼抽象類中的需求。順便說一句,如果有人知道你爲什麼不能在接口中聲明變量,那麼我很想知道推理是什麼。這對我來說似乎是一個重大的監督。
任何幫助將不勝感激。
感謝您的解釋。我現在明白爲什麼接口不允許變量聲明(儘管我不確定我完全同意該決定背後的原因)。我實際上想出了幾乎與行相同的代碼,因此很高興知道我做得對。 – C106 2012-01-17 12:02:49