Возможно ли в PHP определить класс внутри другого класса?

программирование php ООП

Такой код:

<?

class A
{
class B
{
}
}

?>

порождает ошибку: "PHP Parse error: syntax error, unexpected T_CLASS, expecting T_FUNCTION in C:\temp\test.php on line 5"

Является ли невозможным в PHP определить класс внутри другого класса, или есть специальный синтаксис для этого?

(Кстати, почему "expecting" именно T_FUNCTION, а не T_VAR или T_PUBLIC, например?)

P.S.: Класс внутри функции определяется без проблем:

<?

function f()
{
class C
{
}
}

?>


Примечание:
Domovoy, да, забыл сказать, конечно PHP5.

C:\>php --version
PHP 5.2.6 (cli) (built: May 2 2008 18:02:07)
Copyright (c) 1997-2008 The PHP Group
Zend Engine v2.2.0, Copyright (c) 1998-2008 Zend Technologies

Спасибо за ссылку, но, как ни странно, пример не работает, выдаёт загадочную ошибку: "PHP Parse error: syntax error, unexpected T_PAAMAYIM_NEKUDOTAYIM, expecting '{' in C:\temp\test2.php on line 2".

Ну да ладно, буду знать, в каком направлении копать.

А вообще-то меня как раз интересовало такое определение, чтобы внутреннего класса вообще не видно было извне внешнего класса. "Private Class", так сказать. :-)

Примечание:
Azrael_ru, красиво говорите... но не то.
Такой код вызывает ту же ошибку:

<?

class A
{
}

class A::B
{
}

?>

PHP Parse error: syntax error, unexpected T_PAAMAYIM_NEKUDOTAYIM, expecting '{' in C:\temp\test2.php on line 7

Поясню, откуда взялась такая задача. Есть класс, которому для чисто внутренних целей нужен другой класс, нигде в других местах не нужный. Логично было бы описать его внутри основного класса, чтобы не засорять пространство имён и т.п. Ну да ладно, подождём нэймспэйсов, авось они решат этот вопрос...

Примечание:
Evgeniy Savichev, я, конечно, понимаю, что у нас в национальных традициях на любой вопрос, как сделать что-то, — отвечать: «А оно тебе надо?» Прошло больше года, и я понятия не имею, чего я конкретно хотел. (К тому же, за прошедшее время я имел счастье «уйти» на Python, и теперь половые трудности PHP меня мало волнуют.) Однако, взглянув на вопрос и на Ваши «размышления на тему», хочется спросить Вас: «Вы вообще об чём?»

«Я так понимаю, внутренний класс понадобился как формализованная структура, которых инстанциируется N штук и чё-то там в цикле... Так поля структуры можно формализовать и константой, и не обязательно для этого класс, обычного хеша хватит.»©

При чём здесь хеш, константы, цикл (и жуткое слово «инстанциируется»)? С тем же успехом можно сказать, что ООП вообще не нужен, т.к. всё можно написать и на «plain C». А в PHP есть такая замечательная штука, как “array”, в которую можно засунуть что угодно и жить счастливо. Так, может, ну их на фиг, эти классы?

P.S. Класс внутри класса нужен ровно по тем же причинам, по которым он нужен в любом другом месте программы. (Надеюсь, так понятнее.)
Ответы:
Как-то так:
<?php
class DB::MySQL {
var $host = '';
class Example1 extends ExcClass { }
class Example2 implements RefClass { }
class Example3 extends ExcClass implements RefClass { }
А почему не решить это private методами/свойствами самого же класса? На то они и private вообще-то ;).
Я так понимаю, внутренний класс понадобился как формализованная структура, которых инстанциируется N штук и чё-то там в цикле... Так поля структуры можно формализовать и константой, и не обязательно для этого класс, обычного хеша хватит. Скажите цель создания внутреннего класса - будет ответ полезнее.
При таком дополнении исправлюсь. Не встречал ни одного случая, где это реально нужно. Но если вопрос теоретический, тогда ответ такой: в PHP (независимо от версии пока) нет нельзя. Возможно, что-то из abstract, interface или паттерны factory либо proxy решают ту же задачу?


15 лет назад

RPI.su - самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.

Все вопросы, добавленные на сайт ответов Google, мы скопировали и сохранили здесь. Имена старых пользователей также отображены в том виде, в котором они существовали ранее. Только нужно заново пройти регистрацию, чтобы иметь возможность задавать вопросы, или отвечать другим.

Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected]. Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.