Позвольте мне обратиться к одной важной строке:
mainclass->echodata();//the problem is here
В PHP для использования инфиксного оператора доступа к объекту (->
) левый аргумент должен быть переменной (с добавлением по крайней мере одного $
) и должен быть экземпляром класса, например, $myClass->whatever
или $this->foo
.
Если вы пришли с другого языка и думаете о статическом доступе, вы должны использовать правильный оператор, который является ::
, например someClass::$someValue
или someClass::SOME_CONST
.
Теперь, если вы категорически против передачи «родительского» объекта дочернему конструктору, вы можете рассмотреть шаблон синглтона, который позволит вам статически получить доступ (только) к экземпляру родительского класса из любой точки код, включая дочерний объект.
А если серьезно, просто передайте его в качестве аргумента конструктору, и, как сказал кто-то другой, не определяйте класс внутри функции, особенно если эта функция сама является членом другого класса. Если эта функция вызывается дважды, вы получите фатальную ошибку.
EDIT
Вот пример того, о чем я говорю:
class mainClass {
private static $instance = null;
private $data = null;
private function __construct($setData) {
if (!is_null($setData)) {
$this->data = $setData;
}
}
public static function getInstance($setData = null) {
if (is_null(self::$instance)) {
self::$instance = new mainClass($setData);
}
return self::$instance; // objects will always be passed by reference
}
public function echodata() {
echo $this->data;
}
public function start() {
$inner = new innerClass;
$inner->show();
}
}
class innerClass {
function show() {
mainClass::getInstance()->echodata();
}
}
Затем запустите:
$foo = mainClass::getInstance('Foo');
$foo->start(); // prints "Foo"