Как создать константные массивы экземпляров класса внутри этого класса?

Я создаю свой собственный 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 можно определить array типа const .

    Также как и в PHP 7.1, можно определить постоянную видимость (до того, как она будет всегда публичной).

    ОРИГИНАЛЬНЫЙ ОТВЕТ :

    Никакие массивы и объекты не могут быть назначены константам в PHP. В документации говорится, что это должно быть «постоянное выражение». Я не знаю, определяют ли они этот термин, но они отмечают, что он исключает: «переменная, свойство, результат математической операции или вызов функции».

    Неудивительно, что вызовы конструктора также не допускаются, и хотя array не является действительно функцией, он «похож на функцию».

    Вероятно, вам нужно будет работать, как показано ниже. Вместо реальных констант мы используем private static . Это означает, что вам необходимо вручную избегать повторного присвоения и при необходимости предоставить получателю ( 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; } }