PHP - смешивание объектов инъекция и наследование - PullRequest
0 голосов
/ 02 октября 2011

Это дополнительный вопрос к следующему ответу: Родительский объект в php

class A {
    protected function doSomeStuff(){
       echo 'a method that all children will need to call';
    }
}

class B {
    protected $_parent;
    public function __construct($parent) {
       $this->_parent = $parent;
    }
    public function doSomeLocalStuff() {
       $this->_parent->doSomeStuff(); // Fatal Error
    }
}

$a = new A(); // will be used for other children as well.
$b = new B($a);
$b->doSomeLocalStuff();

В вышеприведенном коде использовался родительский объект Injection, позволяющий класс B инициализируется с использованием определенного экземпляра класса A , но класса B не сможет получить доступ к классу A защищенным свойствам или методам (например, doSomeStuff () ).

Но, смешав вышесказанное с наследованием, мы получаем лучшее из обоих миров:)

class B extends A {
    protected $_parent;
    public function __construct($parent) {
       $this->_parent = $parent;
    }
    public function doSomeLocalStuff() {
       $this->_parent->doSomeStuff(); // Works :)
    }
}

Итак, это приемлемо?... какие-либо недостатки?

PS: я пытаюсь реализовать нестатический заводской шаблон.

Уточнение

Учитывая это, я пытаюсь разработать класс, который будет использоваться для вызова внешнего API.У нас более 400 различных вызовов, разделенных на 10 категорий (выставление счетов, клиенты, продукты ...).

Все 400 вызовов имеют одинаковый URL-адрес родителя, имя пользователя / пароль и некоторые другие общие свойства.

Итак, вместо того, чтобы поместить метод 400 в один большой класс, я решил разделить их на 10 классов, причем родительский класс обрабатывает общие функции (например, аутентификация, создание URL-адреса, веб-вызов ...), а затемсоздал шаблон фабрики, где я могу загружать только необходимые классы / категории во время выполнения.

Что-то вроде:

$apiCall = new parentPlusFactory(); 
          //contains common methods and a mechanism to load sub-classes
$apiCall->setAPIuserName("user");
$apiCall->setAPIpassword("pass");
$apiCall->useClass('customers')->doSomeCustomerStuff();
$apiCall->useClass('products')->doSomeProductStuff();

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

Ответы [ 2 ]

1 голос
/ 02 октября 2011

В PHP нет ключевого слова friend, как в C ++. Вы можете проверить это обсуждение на способ реализации friend классов.

Но вам действительно нужно, чтобы эта функция была объявлена ​​protected?

0 голосов
/ 02 октября 2011

В общем, вы должны отдавать предпочтение композиции, а не наследованию. Для меня ваш вариант использования звучит как B вообще не должен расширять A, но вместо этого у вас должно быть два отдельных класса.

Теперь в PHP 5.4 будет «горизонтальное повторное использование», также известное как «черты», где можно будет «включить» черту в ваш класс.

trait A
{
    public function doSomeStuff()
    {
        echo 'doing some stuff';
    }
}

class B
{
    use A;

    public function doSomeLocalStuff()
    {
        $this->doSomeStuff();
    }
}

class C
{
    use A;

    public function doSomeLocalStuff()
    {
        echo 'Doing something completely different here';
    }
}

См. Также Руководство по PHP: черты и Выпущена PHP 5.4 beta1 .

...