【发布时间】:2020-04-22 05:31:30
【问题描述】:
我使用 Builder 模式,但在调用之间会出现数据混淆。我希望在每次静态调用我的门面时都有一个新实例。示例:
基础类
<?php
namespace Me\Package;
class PHPFile
{
public function set($key, $value) {
$this->$key = $value;
return $this;
}
public function get($key) {
return isset($this->$key) ? $this->key : 'NO_SUCH_KEY';
}
public function sum()
{
// example of an "ending" method
}
}
立面
<?php
namespace Me\Package\Facades;
use Illuminate\Support\Facades\Facade;
class PHPFile extends Facade {
protected static function getFacadeAccessor() { return 'PHPFile'; }
}
服务提供者
use Me\Package\PHPFile;
public function register()
{
App::bind('PHPFile',function() {
return new PHPFile;
});
}
测试
print PHPFile::set('first', 10)->set('second', 20)->sum();
// 30
print PHPFile::get('first');
// 10 !!!
由于外观保持相同的实例,第二个测试行将打印10。我想要'NO_SUCH_KEY' - 每次静态调用后都有一个新实例。我怎样才能做到这一点?我尝试让外观返回一个最小的“工厂”,只是一个构造函数返回一个新的PHPFile 实例,但没有成功。我还读到我应该在“结束”方法(sum/get)中调用new static,但不知道如何做到这一点并保留累积的数据。
【问题讨论】:
-
为什么不把它作为
PHPFile逻辑的一部分(创建新实例等等)...?看来它应该有这个责任 -
我想使用 Builder 模式启用静态可链接 API
-
我不认为你可以,此外我认为你不应该。请为您的问题找到不同的解决方案。门面的主要目的是包裹单例。话虽这么说,如果您只想重置外观,您可以这样做
PHPFile::swap(app()->make('PHPFile')) -
好的,谢谢!刚刚更新了问题以澄清目的。这与 Laravel QueryBuilder 非常相似,所以真的应该有一些方法来做到这一点吗?我从来没有遇到过查询冲突?
-
DB外观是DatabaseManager 的外观,而不是查询构建器。数据库管理器单例负责返回一个查询构建器实例。这意味着查询之间没有冲突,因为那不是门面单例