5

我有一个名为的类Awesome,并已使用ServiceProvider和 将Facade其注册到应用程序。现在我可以将它用作Awesome::Things().

我想向这个类添加常量,所以我尝试了

<?php namespace Helper\Awesome;
class Awesome()
{
    public static $MOVIE = 'I love the Lego Movie!";
}

但是当我打电话时Awesome::$MOVIE,我得到Access to undeclared static property: Helper\\Aesome\\Facades\\AwesomeFacade::$MOVIE

有人可以帮忙吗?

4

1 回答 1

10

简短的版本是——你真的不想这样做。Laravel 外观并不意味着像普通类一样使用,如果你的应用程序以这种方式使用它们,你可能会混淆未来的开发人员。

警告不碍事。当你在 Laravel 中创建一个“门面”时,你实际上是在创建一个类别名。当您添加Awesomealias列表中时app/config/app.php,在某些时候运行如下代码

class_alias('Helper\Aesome\Facades\AwesomeFacade','Awesome');

这意味着每当您使用全局非命名空间类Awesome时,PHP 都会替换Helper\Aesome\Facades\AwesomeFacade. 如果要添加常量,则需要将它们添加到此类。

Laravel 能够传递方法是因为基Facade类实现了一个__callStatic方法,该方法将您的调用传递给实际的服务实现对象。外观不会传递静态常量访问。此外,PHP 没有(似乎?)有类似的魔术方法来传递对常量的请求。

如果您对这个答案的深入版本感到好奇,我目前正在写一个关于 Laravel 的对象系统的系列,包括一些关于外观实现的深入信息。

于 2014-10-30T20:23:19.657 回答