Как создать константные массивы экземпляров класса внутри этого класса? - PullRequest
3 голосов
/ 21 ноября 2010

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

1 Ответ

3 голосов
/ 21 ноября 2010

ОБНОВЛЕНИЕ :

Начиная с 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;
    }
}
...