проблема с областью видимости parent::function

borgez

Новичок
проблема с областью видимости parent::function

php ругаеться Fatal error: Call to a member function get_info() on a non-object in
если вызываю функцию из класса наследника
хотя если вызывать из самого класса MyClass оно работает
мож я где-то жутко туплю?
var_dump в первом случае выдаёт NULL а во втором то что я ожидаю те обьект

есть класс
PHP:
class MyClass{
function MyClass(){
                  $this->func['MyClass2'] = new MyClass2();//дочерний класс
                  $this->func['MyClass3'] = new MyClass3();//дочерний класс
	}
function get_info($id){
		return $this->func['MyClass3']->get_info($id);
//в этом месте php ругаеться Fatal error: Call to a member function get_info() on a non-object in
	}
}
и дочернии классы
PHP:
MyClass2 extends MyClass
{
function MyClass2(){
	           $val=parent::get_info_id('4');
	}      
}
MyClass3 extends MyClass
{
function get_info(){
	          return что-то такое странное;
	}
         
}
ps мож чего накосячил с кодом тут но проблема в том что в myclass функция get_info не хочет из чаилда вызываться а из самого класса она прекрасно вызываеться...
вызываю так
$company=parent::get_company($val['id_company']);

php > 5.2
 

borgez

Новичок
точно MyClass так для примера что где не работает ;)
там оно называеться get_company точно проверял =)
 

Dovg

Продвинутый новичок
// А это вообще нормально, что класс в конструкторе создает экземпляры своих потомков?
 

borgez

Новичок
а чем это ужасно?
я просо хочу чтобы он сам себя обслуживал и на запрос типа хачу увидеть такуето таблицу от и до он её сам формировал проверял обрабатывал и выдавал
так что не отклоняемся...
 

rotoZOOM

ACM maniac
borgez у тебя конструктор MyClass в каком месте вызывается, когда ты создаешь экземпляры дочерних классов?

-~{}~ 28.05.08 18:31:

И вообще, почему у тебя конструктор называется MyClass, когда
?
 

borgez

Новичок
мне MyClass конструктор больше нравиться чем __construct()

конструктор MyClass запускаеться сразу после описания класса MyClass

дочерние классы инклудяться в шапке файла

от того что они инклудяться после описания класса ничего не изменяеться (тока что проверил)

я даже не правильно написал так будет правильнее простите меня =)

PHP:
//include class2
//include class3
//так 
class MyClass{ 
function MyClass(){ 
                  $this->func['MyClass2'] = new MyClass2();//дочерний класс 
                  $this->func['MyClass3'] = new MyClass3();//дочерний класс 
    } 
function choice(){
                  $this->func['MyClass2']->MyFunc();
}
function get_info($id){ 
        return $this->func['MyClass3']->get_info($id); 
//в этом месте php ругаеться Fatal error: Call to a member function get_info() on a non-object in 
    } 
}
$n = new MyClass();
$n->choice();
и дочернии классы
PHP:
MyClass2 extends MyClass 
{ 
function MyFunc(){ 
               $val=parent::get_info_id('4'); 
    }       
} 
MyClass3 extends MyClass 
{ 
function get_info(){ 
              return что-то такое странное; 
    } 
          
}
 

rotoZOOM

ACM maniac
Это пипец просто. Нет слов.
Индусы нервно курят в сторонке.

-~{}~ 28.05.08 18:49:

Срочно вернитесь в палату, вас знобит, пациент.
А именно. Создает БАЗОВЫЙ класс, который в конструкторе создает два класса, которые являются наследниками БАЗОВОГО класса, потом у наследника вызывает функцию наивно полагая, что parent - это первый БАЗОВЫЙ класс, который он создает new.
Рано вам ООПшничать.
 

Gas

может по одной?
fuck my мозг :)
и правильно ругается, когда создавался объект MyClass2, конструктор парента не был вызван и не были созданы $this->func['MyClass2'] и 3. Но если его вызвать в child'ах то скорее всего скрипт зациклится и умрёт.
 

borgez

Новичок
так я индус понял
тогда где их нужно вызывать?
если я их вызываю в choice() оно тоже не хочет работать хотя конструктор парента уже должен быть вызван


я не хачу быть индусом =)
 

Gas

может по одной?
borgez
не нужно хотеть создавать объекты child'ов в конструкторе parent'а.
Но так-как не понятно что ты хочешь делать, то и советов более правильных дать сложно.
 

StUV

Rotaredom
$val=parent::get_info_id('4');
зашибись

borgez
срочно читать книжки по основам ооп
выкинуть этот гкод
и еще раз подумать - что же хотелось написать

-~{}~ 28.05.08 17:18:

ps:
и на форум надо постить не
что-то такое странное
а _именно_тот_код_, с которым есть проблемы, максимально избавленный от всякого мусора, никак несвязанного с проблемой
 

borgez

Новичок
пойду читать книжки по ооп хотя гугл читал не помогло

Gas
тогда где их создавать чтобы они были доступны паренту
или альтернативу

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

чтобы из класа MyClass2 был доступен класс MyClass3 через MyClass

StUV
что-то такое странное -> не связано с проблемой там было
define ("ok", "okey");
return ok;
'зашибись' я тоже так думаю
 

StUV

Rotaredom
вообще говоря вот этот код

PHP:
class MyClass{ 
function get_info($id){ 
        //...
    } 
}

MyClass2 extends MyClass 
{ 
function MyClass2(){ 
               $val=parent::get_info_id('4'); // а именно вот эта строка
    }       
}
говорит о полном непонимании/незнании тредстартером основ ооп - и ваще зачем оно нужно
 

borgez

Новичок
cDLEON
Зачем возвращать строку, если можно вернуть булев ?
какая разница что я верну в оригинале там должен вернуться масив :p

rotoZOOMЭто ты неправильно хочешь.
хм а как надо хотеть

Автор оригинала: StUV
вообще говоря вот этот код

PHP:
class MyClass{ 
function get_info($id){ 
        //...
    } 
}

MyClass2 extends MyClass 
{ 
function MyClass2(){ 
               $val=parent::get_info_id('4'); // а именно вот эта строка
    }       
}
говорит о полном непонимании/незнании тредстартером основ ооп - и ваще зачем оно нужно
ну да там _id быть не должно и нет в оригинале (код написал для форума)
проблема в другом я уже понял буду писать по другому
говорит о полном непонимании/незнании тредстартером основ ооп - и ваще зачем оно нужно
интересно не хотите мне рассказать (link)?
 
Сверху