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, и рассчитывать на него нельзя. еще раз обращаю внимание на то, что все относится именно к методам классов. про функции известно, что они могут содержать определения классов и это позволяется.
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 из метода класса. и, похоже, что это не бага и таки фича.
а обработчик __autoload, это, по-твоему не функция? а include, вызванный из функции, как раз и должен быть эквивалентен просто объявлению класса в теле функции.
про spl_autoload_register не знал, возможно, ее и получится применить, но тут есть такое но:
обработчиком вроде как может выступать и метод класса, а, стало быть, мы опять вызываем include из метода класса. и, похоже, что это не бага и таки фича.