Как использовать внутренние классы в 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
Ответы
Ответ 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 для "вложенных", чтобы увидеть пример вложенности внутри внешнего класса.
Ответ 4
Вместо этого вы можете использовать stdClass. Вот вопрос о нем: Что такое stdClass в PHP?
Ответ 5
Вы не можете вложить такие классы.
Посмотрите раздел "extends" руководство.