[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: include и определение классов
alc99vol
Подскажите, пожалуйста, почему так происходит:
1. попытка определить класс в методе другого класса, типа:
    class testA {
public function __construct(){
echo 'A construct<br>';
}
public function defineB(){
echo 'define B<br>';
class testB {
public function saySomething(){
echo 'Something<br>';
}
}

// include __DIR__.'/bdef.php';
}
private $var=3;
}

приводит к ошибке, пхп говорит что nested классы запрещены.
2. если сделать так:
    class testA {
public function __construct(){
echo 'A construct<br>';
}
public function defineB(){
echo 'define B<br>';
include __DIR__.'/bdef.php';
}
private $var=3;
}

и в файле bdef.php написать следующее:
    <?php
echo 'var= '.$this->var.'<br>';

то выведется значение приватной переменной класса testА, что говорит о том, что содержимое файла, подключенного через include выполняется в контексте метода defineB класса testA


3. И вот тут то парадокс: если в файл bdef.php запихать определение класса testB(см.1), то все прокатывает и класс testB становится определенным, притом в глобальном контексте.
А вопрос в том, в чем фишка(или это баг?) и нормально ли подключать определения классов динамически при помощи include(чтобы не подключать ненужное), притом делать это из метода класса?



Спустя 16 минут, 24 секунды (4.04.2012 - 00:59) m4a1fox написал(а):
alc99vol
Как выяснилось... вот это
Цитата

и нормально ли подключать определения классов динамически при помощи include

не нормально.... наследование, полиморфиз и инкапсуляция, вот малая часть возможностей ООП.

Спустя 35 минут, 29 секунд (4.04.2012 - 01:34) caballero написал(а):
Цитата
А вопрос в том, в чем фишка(или это баг?) и нормально ли подключать определения классов динамически при помощи include(чтобы не подключать ненужное), притом делать это из метода класса?

чтобы не подключать ненужное используется автолоад.

Спустя 17 минут, 16 секунд (4.04.2012 - 01:51) alc99vol написал(а):
caballero: да, знаю, но мне оно не подходит, т.к. функцию __autoload можно определить только один раз, а мой проект состоит из множества независимых частей.
m4a1fox: не хочу тебя обидеть, но, пожалуйста, если отвечаешь, то отвечай по теме и конкретно.

и еще, хочу уточнить: меня, скорее, интересует некая конкретная конструкция языка, а именно, является ли описанная мной особенность специально предусмотренной фичей или это баг php, и рассчитывать на него нельзя. еще раз обращаю внимание на то, что все относится именно к методам классов. про функции известно, что они могут содержать определения классов и это позволяется.

Спустя 4 минуты, 2 секунды (4.04.2012 - 01:56) caballero написал(а):
Цитата
caballero: да, знаю, но мне оно не подходит, т.к. функцию __autoload можно определить только один раз, а мой проект состоит из множества независимых частей.

функций автолоада можно назначить сколько угодно

spl_autoload_register - в руки

Цитата
рассчитывать на него нельзя.

нельзя и нет смысла этого делать -см. строку выше

Цитата
про функции известно, что они могут содержать определения классов и это позволяется.

сомневаюсь, если и позоволяют то по недосмотру компилятора

Спустя 34 секунды (4.04.2012 - 01:56) m4a1fox написал(а):
Ладно... замолкаю. Посмотрю что еще тебе ответят. Любопытно все таки.

Спустя 20 минут, 56 секунд (4.04.2012 - 02:17) alc99vol написал(а):
насчет функций и объявления классов:
а обработчик __autoload, это, по-твоему не функция? а include, вызванный из функции, как раз и должен быть эквивалентен просто объявлению класса в теле функции.
про spl_autoload_register не знал, возможно, ее и получится применить, но тут есть такое но:
обработчиком вроде как может выступать и метод класса, а, стало быть, мы опять вызываем include из метода класса. и, похоже, что это не бага и таки фича.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.