Я создаю свой собственный 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; } }