Главная страница > Вопрос
Вопрос
Возможно ли в 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
   {
   }
 }

?>
ООП | php | программирование 22.06.09 Автор: PureVirtual
Ответы
1 из 6
Как-то так:
<?php
class DB::MySQL {
var $host = '';

   function db_connect($user) {
       print "Connecting to MySQL database '$this->host' as $usern";
   }
}

class DB::Oracle {
   var $host = 'localhost';

   function db_connect($user) {
       print "Connecting to Oracle database '$this->host' as $usern";
   }
}

$MySQL_obj = new DB::MySQL();
$MySQL_obj->db_connect('Susan');

$Oracle_obj = new DB::Oracle();
$Oracle_obj->db_connect('Barbara');
?>

PHP 5 используешь?
22.06.09 Автор: Domovoy
2 из 6
class Example1 extends ExcClass { }
class Example2 implements RefClass { }
class Example3 extends ExcClass implements RefClass { }
22.06.09 Автор: DimoNya
3 из 6
<?php
class DB::MySQL

Не может быть такого имени у класса, поэтому и Parse Error
Имя класса alphabetical.

> почему "expecting" именно T_FUNCTION, а не T_VAR или T_PUBLIC, например
потому что, T_VAR или T_PUBLIC, т.е. задание свойств класса является опциональным.
Парсер смотрит их, потом T_FUNCTION, функции нет - parse error

Что-то похожее можно сделать так
<?php
class A
{
 public function __construct()
 {
   include 'classB.php'; // где идет декларация класса
 }
}

Только это не поможет, создать экземпляр класса B можно будет в любой точке кода когда класс уже загружен
$obj = new B();

Если нужно спрятать объект, то нужно сделать так
class A
{
 private $_classB;

 public function __construct()
 {
   $this->_classB = new B();
 }
}

Однажды загруженный класс остается в памяти до завершения скрипта.
24.06.09 Автор: Azrael_ru
4 из 6
Дополнительная информация: T_PAAMAYIM_NEKUDOTAYIM означает двойное двоеточие на иврите.
18.01.10 Автор: crimaniak
5 из 6
А почему не решить это private методами/свойствами самого же класса? На то они и private вообще-то ;).
Я так понимаю, внутренний класс понадобился как формализованная структура, которых инстанциируется N штук и чё-то там в цикле... Так поля структуры можно формализовать и константой, и не обязательно для этого класс, обычного хеша хватит. Скажите цель создания внутреннего класса - будет ответ полезнее.
05.11.10 Автор: Evgeniy Savichev
6 из 6
При таком дополнении исправлюсь. Не встречал ни одного случая, где это реально нужно. Но если вопрос теоретический, тогда ответ такой: в PHP (независимо от версии пока) нет нельзя. Возможно, что-то из abstract, interface или паттерны factory либо proxy решают ту же задачу?

PS: однако, любопытно, какое практическое применение такой структуры, если несложно? интересно же.
04.05.11 Автор: Evgeniy Savichev
Это может быть интересно
Не вызывается метод из подключенного файла в PHP (Call to a member function on a non-object)
вложенные классы
java cannot find symbol ошибка
Почему в PHP не заданному свойству объекта можно присвоить и получить значение?
c++ как изменить функцию класса из объекта
Войти
Просмотреть Вопросы и ответы в версии: для мобильных устройств | для ПК
©2014 Google - Политика конфиденциальности - Справка