我正在使用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
实例,但没有成功。我还阅读了我应该在“结束”方法(求和/获取)中调用new static
的方法,但不确定如何做到这一点并保持累积的数据。
[该工厂将使用魔术__call
方法拦截任何调用,然后将其分派到新的PHPFile(My Builder类)
<?php
namespace Me\Package\Factories;
use Me\Package\PHPFile;
class PHPFileFactory
{
public function __call($method, $args)
{
return (new PHPFile)->$method(...$args);
}
}
App::bind('PHPFile',function() {
return new PHPFileFactory;
});
感谢@apokryfos指出我需要返回其他内容-不是Builder本身,而是另一个类。