Intereting Posts

Как использовать внутренние классы в 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. Почему бы не сделать его функцией? Это просто слишком большой.

Редактировать:

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

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

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

 class OuterClass { var $x = 15; function __construct() { } } class ChildClass extends OuterClass { function __construct() { parent::__construct(); } } 

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

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

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

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

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

Вот RFC, описывающий, как он работает: https://wiki.php.net/rfc/anonymous_classes

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

Вместо этого вы можете использовать stdClass. Вот такой вопрос: Что такое stdClass в PHP?

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

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