Подтвердить что ты не робот

Как использовать внутренние классы в PHP?

Я из фона Java, и я хочу использовать внутренний класс в php. Каждый раз, когда я помещаю внутренний класс, я получаю синтаксическую ошибку. Это возможно с PHP? Кроме того, как мне обратиться к внешнему классу? Получаю ли я доступ ко всем его членам данных?

<?php

class OuterClass {
    var $x = 15;
    function __construct() {

    }

    class InnerClass {                  // error when InnerClass is static
        function __construct() {        // error when InnerClass is static
            echo $x;
        }
    }
}

?>

Это используется для MoveClass (как в случае перемещения) конкретной карточной игры. Я думаю, что было бы неплохо создать эти классы, потому что они не имеют смысла друг от друга. Кроме того, MoveClass должен знать о некоторых членах данных класса Game. Почему бы не сделать его функцией? Он просто слишком большой.

Edit:

Как насчет вложенных классов? Насколько я понимаю, они должны быть статическими? O_o

4b9b3361

Ответ 1

PHP не допускает внутренних классов. Если вы хотите получить доступ ко всем членам данных из родительского класса, я предлагаю вам использовать Наследование.

Возможная альтернатива:

class OuterClass {
    var $x = 15;
    function __construct() {

    }
}
class ChildClass extends OuterClass {
    function __construct() {
        parent::__construct();
    }
}

Вы можете объявить метод формы родительского класса, обратившись к самому классу; В PHP вы можете сделать это с помощью ключевого слова parent. Итак, чтобы ссылаться на метод в контексте класса, а не на объект, мы используем :: в отличие от ->.

Ответ 2

в PHP 5.4 или новее вы можете использовать PHP Traits, которые больше предназначены для множественного наследования, но могут удовлетворить ваши потребности. Из документации PHP:

A Trait похож на класс, но предназначен только для группы функциональность в тонкой и последовательной форме. Это невозможно чтобы создать экземпляр "Трейта" самостоятельно. Это дополнение к традиционным наследование и обеспечивает горизонтальный состав поведения; то есть, применение членов класса без необходимости наследования.

http://php.net/manual/en/language.oop5.traits.php

Ответ 3

Как уже упоминалось в комментариях к этому ответ из другого вопроса, PHP-версия этой функции была добавлено в PHP 7. Это, похоже, не дает именно то, что вы просите. Однако он должен предоставить вам аналогичный шаблон дизайна.

Здесь RFC описывает, как он работает: https://wiki.php.net/rfc/anonymous_classes

Как упоминалось в других комментариях к ответам, выполните поиск на странице RFC для "вложенных", чтобы увидеть пример вложенности внутри внешнего класса.

Ответ 5

Вы не можете вложить такие классы.

Посмотрите раздел "extends" руководство.