簡體   English   中英

如何在該類中創建類的實例的const數組?

[英]How to create const arrays of instances of a class, within that class?

我正在創建自己的PHP類。 我希望在該類的實例類中具有常量引用,如枚舉。

我不斷收到2個錯誤:1。常量不能是數組2.第11行解析錯誤(見下文)

怎么了? 我真的沒有一個恆定的陣列嗎? 我來自Java背景......

這是我的代碼:

class Suit {
    const SUIT_NAMES = array("Club", "Diamond", "Heart", "Spade");
    const COLOURS = array("red", "black");

    const CLUB = new Suit("Club", "black");        // LINE 11
    const DIAMOND = new Suit("Diamond", "red");
    const HEART = new Suit("Heart", "red");
    const SPADE = new Suit("Spade", "black");

    var $colour = "";
    var $name = "";

    function __construct($name, $colour) {
        if (!in_array(self::SUIT_NAMES, $name)) {
            throw new Exception("Suit Exception: invalid suit name.");
        }
        if (!in_array(self::COLOURS, $colour)) {
            throw new Exception("Suit Exception: invalid colour.");
        }
        $this->name = $name;
        $this->colour = $colour;
    }
}

更新

從PHP 5.6開始,可以定義類型為arrayconst

從PHP 7.1開始,可以定義常量可見性(在它始終是公共的之前)。

原始答案

在PHP中,數組和對象都不能分配給常量。 文檔說它必須是“持續表達”。 我不知道他們是否定義了這個術語,但是他們注意到它排除了“變量,屬性,數學運算的結果或函數調用”。

毫不奇怪,也不允許構造函數調用,雖然array實際上不是函數,但它“類似於函數”。

可能你必須像下面那樣進行解決。 我們使用private static而不是實際常量。 這意味着您需要手動避免重新分配,並且必要時必須提供getter( getClub等,並命名為您)。

此外,因為您無法將對象分配給static ,並且PHP沒有靜態初始值設定項,所以我們在構造函數中按需初始化。

一個不相關的問題是你有向后的in_array

class Suit {
    private static $CLUB, $DIAMOND, $HEART, $SPADE;
    private static $SUIT_NAMES = array("Club", "Diamond", "Heart", "Spade");
    private static $COLOURS = array("red", "black");

    private static $initialized = false;

    function __construct($name, $colour) {
        if(!self::$initialized)
        {
            self::$CLUB = new Suit("Club", "black");
            self::$DIAMOND = new Suit("Diamond", "red");
            self::$HEART = new Suit("Heart", "red");
            self::$SPADE = new Suit("Spade", "black");
            self::$initialized = true;
        }

        if (!in_array($name, self::$SUIT_NAMES)) {
            throw new Exception("Suit Exception: invalid suit name.");
        }
        if (!in_array($colour, self::$COLOURS)) {
            throw new Exception("Suit Exception: invalid colour.");
        }
        $this->name = $name;
        $this->colour = $colour;
    }
}

暫無
暫無

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

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