Это дополнительный вопрос к следующему ответу: Родительский объект в 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();
Вот почему мне нужно использовать тот же экземпляр родительского класса.