只调用一次外部类?

时间:2016-12-07 17:29:23

标签: php

我有一个使用外部包来做某事的课

class MyClass
{
    public function doSomething($data){
        $external = new External();
        $external->doSomething($data);
    }
}

此类是从另一个类调用的,例如:

class MasterClass
{
    public function go(){

        $data = 'whatever';
        $data2 = 'whatever2';

        $myClass = new MyClass();
        $myClass->doSomething($data);
        $myClass->doSomething($data2);
        ....
    }
}

所以在我的MasterClass中,我多次调用doSomething函数。多次创建一个新的外部类 - 这不是必需的。

如何解决此问题并仅创建一次外部类?

3 个答案:

答案 0 :(得分:2)

class MyClass
{
   protected $external;

   public function doSomething($data){
        if(!$this->external){
            $this->external = new External();
        }
        $this->external->doSomething($data);
   }
}

但请阅读php中的依赖注入。

答案 1 :(得分:2)

new External()调用移动到构造函数中并将其存储为属性,然后在doSomething()方法中引用该属性,而不是每次都构造一个新实例。

或者,如果您不想在构造External时始终构造新的MyClass,则可以将构造移动到名为 Lazy Load 的静态方法中类似于getExternal()类中的External

第一次调用该方法时,它需要将External的新实例存储为属性,但在后续调用中(当属性已设置时)将返回相同的实例。这种类型的模式在面向对象的设计模式中称为 Singleton Pattern

您可以参考此link以了解有关单例模式及其实现方式的更多信息。

答案 2 :(得分:1)

在构造函数中传递External类。

class MyClass
{
    private $external;

    public function __construct(External $external)
    {
        $this->external = $external;
    }

    public function doSomething($data) 
    {
        $this->external->doSomething($data);
    }

class MasterClass
{
    public function go() {

        $data = 'whatever';
        $data2 = 'whatever2';

        $external = new External();        

        $myClass = new MyClass($external);
        $myClass->doSomething($data);
        $myClass->doSomething($data2);
        ....
    }
}