Это дополнительный вопрос к следующему ответу: Родительский объект в 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();
В приведенном выше коде использовалась инъекция родительского объекта, позволяющая инициализировать класс 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 :)
}
}
Итак, допустимо ли это? .. есть недостатки?
P.S. Я пытаюсь реализовать нестатический фабричный шаблон.
Пояснение
Учтите, я пытаюсь создать класс, который будет использоваться для вызова внешнего 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();
Вот почему мне нужно использовать один и тот же экземпляр родительского класса.