簡體   English   中英

檢查父類的構造函數中的子類是否覆蓋了常量?

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

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