Php 在使用生成器模式时,如何允许唯一的Laravel Facade实例?

Php 在使用生成器模式时,如何允许唯一的Laravel Facade实例?,php,laravel,facade,Php,Laravel,Facade,我正在使用生成器模式,但调用之间会出现数据混淆。我希望在对facade的每次静态调用中都有一个新实例。例如: 底层类 试验 由于正面保持相同的实例,第二个测试行将打印10。我想在这里输入'NO_-SUCH_-KEY'-在每次静态调用之后都有一个新实例。我该怎么做?我尝试使facade返回一个最小的“工厂”,即一个返回新的PHPFile实例的构造函数,但没有成功。我还读到,我应该在“结束”方法(sum/get)中调用一个新的static,但不确定如何执行该操作并保留累积的数据。添加工厂 此工厂将使

我正在使用生成器模式,但调用之间会出现数据混淆。我希望在对facade的每次静态调用中都有一个新实例。例如:

底层类 试验 由于正面保持相同的实例,第二个测试行将打印
10
。我想在这里输入'NO_-SUCH_-KEY'-在每次静态调用之后都有一个新实例。我该怎么做?我尝试使facade返回一个最小的“工厂”,即一个返回新的
PHPFile
实例的构造函数,但没有成功。我还读到,我应该在“结束”方法(sum/get)中调用一个
新的static
,但不确定如何执行该操作并保留累积的数据。

添加工厂 此工厂将使用magic
\uu call
方法拦截任何调用,然后将其分派到新的PHPFile(我的生成器类)


感谢@apokryfos,他指出我需要返回其他东西——不是构建器本身,而是另一个类。

为什么不将其作为
PHPFile
逻辑的一部分(创建新实例等等)。。。?似乎它应该有这样的责任感我想使用构建器模式启用静态可链接API我认为你不能,而且我认为你不应该。请为您的问题找到不同的解决方案。立面的主要用途是环绕单身人士。也就是说,如果您只想重置外观,您只需执行
PHPFile::swap(app()->make('PHPFile'))
Ok,谢谢!刚刚更新了问题以澄清目的。这与Laravels QueryBuilder非常相似,所以确实应该有一些方法来实现它?我从未遇到过查询冲突?
DB
facade是的facade,而不是查询生成器。数据库管理器单例负责返回查询生成器实例。这意味着查询之间没有冲突,因为这不是facade单例
<?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 !!!
<?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;
});