[英]Check if constant was overridden in child class in constructor of parent class?
我有一個定義幾個常量的抽象類。 大多數這些常量都不會被任何子類覆蓋,但應該是。 我在抽象類中將此常量定義為null,並在子類中為其指定值。 構造函數在所有子類中也是相同的,所以我添加了一個檢查以查看是否為常量賦值,如果未由子類定義則拋出異常。
一些簡化的代碼來描繪我的問題:
父抽象類:
abstract class ParentClass {
const TEST_CONSTANT = null;
public function __construct()
{
if (!defined(self::TEST_CONSTANT)) {
throw new Exception("Please define TEST_CONSTANT!");
}
}
abstract protected function someFunction();
}
兒童班:
class ChildClass extends ParentClass {
const TEST_CONSTANT = "value";
protected function someFunction()
{
//some functionality here
}
}
但是,在實例化ChildClass時,異常“請定義TEST_CONSTANT!” 即使常數被覆蓋,也會被拋出。 我理解我可以簡單地將它作為構造函數中的必需參數,並以這種方式設置成員變量(這可能是更符合邏輯/實際的解決方案)。
在我的情況下,為此目的使用常量可能沒有多大意義,但我仍然想知道為什么這不起作用。 應該可以覆蓋子類中的常量。 在調用構造函數之后,這種覆蓋是否只會發生? 我的支票不正確嗎? 很高興理解這里發生的事件的邏輯和順序。
您需要將參數傳遞給defined()
作為字符串:
if (!defined('self::TEST_CONSTANT')) {
否則,你正在測試是否存在一個名為null的全局常量(不是'null'而是一個實際的null,這是毫無意義的)....如果你試圖確定是否定義了一個名為value
的全局常量,那么您可能還需要考慮static::TEST_CONSTANT
, static::TEST_CONSTANT
從您已實例化的子類( 'value'
)中獲取static::TEST_CONSTANT
'value'
並測試以查看名稱value
是否具有全局常量已定義。
您需要使用后期靜態構建來從父類訪問靜態子屬性(和常量):
abstract class ParentClass {
const TEST_CONSTANT = null;
public function __construct()
{
if (!defined(static::TEST_CONSTANT)) {
throw new Exception("Please define TEST_CONSTANT!");
}
}
abstract protected function someFunction();
}
說,重寫常量看起來有點不尋常。 我很好奇usecase為什么你需要它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.