ОБНОВЛЕНИЕ :
Начиная с PHP 5.6 можно определить const
типа array
.
Также, начиная с 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;
}
}