实例化对象以在静态访问器中使用

时间:2015-09-21 08:27:47

标签: php

背景

我有两个类,A和B,其中A是一个充满静态方法的类(Behat / Mink步骤定义),但是使用来自B类实例的逻辑方法。

我想要的是让A类能够使用B实例中的方法,A将没有构造函数。

class A {
    // This class needs an instance of B, but A has no constructor

    const B_INSTANCE = new B(); //Surely not?
}

class B {
    public function __construct() {}

    public function methodForUseInClassA() {...}
}

Nuance的

现在,我有A扩展B,但是出于单元测试的目的,实例化B将是一个更好的解决方案。

问题

我如何为此提供便利?是否有一些公认的最佳做法?

任何提示赞赏!

1 个答案:

答案 0 :(得分:0)

尝试扩展class A extends B {},然后您就可以访问B的方法了。或者试试这个:

class A {
    //This class needs an instance of B, but A has no constructor
    private static $instanceOfB = null;

    // singleton returns always the same object while script is running
    public static function getInstanceOfB() {
        if( self::$instanceOfB === null ) {
            self::$instanceOfB = new B();
        }

        return self::$instanceOfB;
    }

    // always returns a new instance
    public static function getNewInstanceOfB() {
        return new B();
    }
}

class B {
    public function __construct() {}

    public function methodForUseInClassA() {
        // do something
    }

}

你可以像这样调用它,但我认为扩展是更好的选择,除了你只需要一些静态辅助方法。

$b = A::getInstanceOfB();
$b->methodForUseInClassA();