нужна помощь в понимании аспектов php объектов - PullRequest
0 голосов
/ 19 мая 2011

Я новичок в php и нуждаюсь в некоторой помощи, чтобы понять аспекты объектов php, которые я не получаю.В классе ai созданы классы b и c, которые расширяют a, но я хочу сделать это, чтобы получить доступ к переменной public letters в классе a из класса c, чтобы можно было получить функцию testb () из класса c.

Любая помощь очень ценится, ребята

   <?php

    class a {
        public $letters;
        function __construct() {
            $this->letters->b = new b();
            $this->letters->c = new c();
        }
    }   

    class b extends a {
        function __construct() {
            echo "hello world from b ";
        }

        private function testb() {
            echo "testing from b";
        }
    }

    class c extends a {
        function __construct() {
            echo "hello world from c ";
            $this->letters->b->testb();
        }
    }


    $a = new a();

?>

следующий скрипт повторяет наши "привет мир из b" и "привет мир из c", но он не печатает "тестирование из b" ...

Ответы [ 5 ]

2 голосов
/ 19 мая 2011

Причиной PHP Objects является то, что наследование вымышлено (всего лишь немного). Конструктор родительского объекта не вызывается неявно, когда вы создаете экземпляр одного из его дочерних объектов. Вместо этого вы должны явно вызвать конструктор родительского объекта.

class b extends a {
...
    public __construct() {
        parent::__construct();
        echo("Hello From B!");
    }
...
}

В вашем конструкторе Class c $this->letters не является объектом и не был инициализирован, поскольку конструктор a не был вызван.

Если вы просто играете с объектами, игнорируйте эту часть, но вы близки к получению круговой иерархии. Если вы добавите предложенные мной изменения, я думаю, что ваш код взорвется, если вы попытаетесь создать экземпляр объекта B или C напрямую.

0 голосов
/ 19 мая 2011

В вашем классе a вы создаете новый объект класса c.

Этот новый объект не имеет свойства $this->letters->b, он просто имеет неинициализированное свойство $this->letters.

Обратите внимание, что новый объект наследует свойство $letters от класса, который он расширяет, но не наследует никаких значений экземпляра a объекта.Таким образом, нет $this->letters->b и нет функции $this->letters->b->testb() для вызова.

0 голосов
/ 19 мая 2011

Хорошо, если вы расширяете класс c с b , вы можете вызвать метод иначе, поскольку вы расширяете его из класса a, а не из c ..

0 голосов
/ 19 мая 2011

«c» расширяет «a» и не наследует метод «b» s

ваш пример вернет

Неустранимая ошибка: вызов функции-члена testb () для необъекта

для

$ this-> буквы-> b-> testb ();

0 голосов
/ 19 мая 2011

Причина, по которой вы не можете вызвать testb из класса c, заключается в том, что сигнатура метода testb объявляет его как private, то есть доступ к нему возможен только в экземплярах b.Изменить видимость по умолчанию (без модификатора) или public.

Например:

function testb() {
    echo "testing from b";
}

Или:

public function testb() {
    echo "testing from b";
}

Редактировать:

Проблема в том, что вы не вызвали супер-конструктор из конструктора c - поэтому значение $this->b не инициализировано.Измените конструктор c на:

function __construct() {
    parent::__construct();
    echo "hello world from c ";
    $this->letters->b->testb();
}

К сожалению, тем не менее, это создаст бесконечный цикл, в котором конструктор a создает экземпляр c, а конструктор c вызывает доконструктор a.Почему ваши буквенные классы даже расширяют друг друга?

Вам также нужно изменить видимость testb в классе b.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...