Laravel:门面真的会在调用方法时创建新对象吗?

Luu*_*gen 5 php facade inversion-of-control laravel

我有一个演示类通常通过

$this->app->bind('demo', function() { return new Demo(); }

一个立面

受保护的静态函数 getFacadeAccessor() { return 'demo'; }

类本身看起来像这样

课堂演示 
    {

        私人 $value1;        
        私人 $value2;        

        公共函数 setVal1($value)
        {
            $this->value1 = $value;
        }

        公共函数 setVal2($value)
        {
            $this->value2 = $value;
        }

        公共函数 getVals()
        {
            返回 '​​Val 1:' 。$this->value1 。'瓦尔2:'。$this->value2;
        }   

    }

有人告诉我,如果我在这个类上使用 Facade,Laravel 将实例化该类的一个对象,然后调用该对象上的方法,例如:

$app->make['demo']->setVal1();     
Run Code Online (Sandbox Code Playgroud)

Butt 我测试了更多,发现这种非常奇怪(至少对我而言)的行为:

如果我做

演示::setVal1('13654');

演示::setVal2('随机字符串')

我不应该使用 Demo::getVals() 来检索我刚刚创建的值,对吗?由于每次使用外观方法时都会实例化一个新对象,一个对象如何检索另一个对象的属性?应该有三个不同的实例,但我仍然能够从其他实例中检索属性......

我认为这只有在将类与 App::singleton 绑定而不是通过 App::bind 绑定时才有可能?

dan*_*nne 2

Facade 仍然只返回一个实例。但是,您可以使用方法返回该类的新实例new static

我在 Laravel 论坛上询问,nesl247 给出了很好的解释。请在这里找到它: http://laravel.io/forum/08-22-2014-how-do-i-instantiate-a-new-object-by-calling-a-class-method-via-a-facade