Дерево классов PHP, в котором родительский класс содержит экземпляры подклассов

#php #oop #class

#php #ооп #класс

Вопрос:

У меня есть мастер-класс: «A» с конструктором, который принимает необязательный логин и пароль для веб-службы. У меня есть подклассы A: A1, A2 и A3, которые имеют методы для других веб-сервисов от той же компании. Все они используют один и тот же логин и пароль, но используются по-разному. У каждого есть свой собственный набор методов.

Итак, если у меня уже есть экземпляр родительского класса (или любого из подклассов), как я могу создать другие подклассы без необходимости повторной аутентификации родительского класса?

То, что я хочу сделать, это так:

 class A {

    protected static $authenticated_service_handle; //Takes a while to set up
    protected $instance_of_A1;

    function __construct($login = null, $password = null) {
        //Go do login and set up
        $authenticated_service_handle = $this->DoLogin($login, $password)

        //HELP HERE: How do I set up $this->instance_of_A1 without having to go through construction and login AGAIN??
        //So someone can call $instance_of_A->instance_of_A1->A1_Specific_function() ?
    }

}

class A1 extends A {

    function __construct($login = null, $password = null) {
        parent::__construct($login, $password);
    }

    public function A1_Specific_function() {
    }

}

//How I want to use it.
$my_A = new A('login', 'password');
$method_results = $my_A->instance_of_A1->A1_Specific_function();
$second_results = $ma_A->instance_of_A2->A2_Specific_function();
 

Есть идеи, как сделать это естественным образом? Это кажется отступлением от стандартной методологии OO, но моим вызывающим клиентам необходимо будет использовать методы A1, A2 и A3 одновременно, но количество методов и их организация позволяют разбивать их на подклассы в зависимости от функциональности.

Комментарии:

1. используйте синглтон www.php.net/manual/en/language.oop5.patterns.php

2. Это просто кричит о фабрике.

Ответ №1:

Если то, что вы создаете в своем классе A, является соединением, которое может использоваться всеми классами, которым оно требуется, вы можете использовать его как таковое:

 class ServiceConnection
{
    private $_authenticated_service_handle; //Takes a while to set up

    function __construct($login = null, $password = null) {
        //Go do login and set up
        $_authenticated_service_handle = $this->DoLogin($login, $password)
    }

    public function DoSomething()
    {
        $_authenticated_service_handle->DoSomething();
    }

}
 

И передайте это соединение всем объектам, которые в нем нуждаются:

 $connection = new ServiceConnection('login', 'password');

$my_A1 = new A1($connection);
$my_A2 = new A2($connection);
$my_A3 = new A3($connection);

$my_A1->A1_Specific_function();
$my_A2->A2_Specific_function();
$my_A3->A3_Specific_function();
 

AN-классы будут выглядеть следующим образом:

 class A1 {

    private $_connection;

    function __construct($connection) {
        $_connection = $connection;
    }

    public function A1_Specific_function() {
        $_connection->doSomething();
    }

}
 

Комментарии:

1. CodeCaster, это не совсем то, что я делаю, но ты наставил меня на правильный путь. Я не создаю свою собственную переменную private connection в A1, но я ссылаюсь на родительский класс и имею более интеллектуальный конструктор, который определяет, передаются ли ему идентификатор пользователя и пароль или нет.