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

Я из 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

Ответы [ 5 ]

20 голосов
/ 04 декабря 2010

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

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

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

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

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

5 голосов
/ 31 мая 2013

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

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

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

2 голосов
/ 25 августа 2015

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

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

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

1 голос
/ 04 декабря 2010

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

0 голосов
/ 04 декабря 2010

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

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

...