我有一个使用外部包来做某事的课
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函数。多次创建一个新的外部类 - 这不是必需的。
如何解决此问题并仅创建一次外部类?
答案 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);
....
}
}