PHP类树,父类持有子类实例

3
我有一个主类"A",它有一个构造函数,可以传递一个可选的登录和密码用于访问Web服务。我有A的子类:A1,A2和A3,它们都有访问同一家公司其他Web服务的方法。它们都使用相同的登录和密码,但是有不同的用途,并且每个子类都有自己的方法集。
那么,如果我已经有了父类的实例(或任何子类),如何创建其他子类而无需重新对父类进行身份验证?
我的想法是这样的:
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();

有什么自然的方法可以实现这一点吗?这似乎与标准面向对象的方法有些背道而驰,但我的调用客户端将需要同时使用A1、A2和A3的方法,但是方法的数量和组织方式适合根据功能分为子类。

使用单例模式 www.php.net/manual/zh/language.oop5.patterns.php - Nick Maroulis
这个代码显然需要使用工厂模式。 - Mike Purcell
1个回答

3
如果你在类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();
    }

}

CodeCaster,这不是我正在做的事情,但你让我找到了正确的方向。我没有在A1中创建自己的私有连接变量,而是引用父类并拥有一个更智能的构造函数,它确定是否传递了用户ID和密码。 - Chris Chubb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接