【问题标题】:Laravel 5 use statements [duplicate]Laravel 5使用语句[重复]
【发布时间】:2015-05-14 02:28:02
【问题描述】:

第一次使用 Laravel 5。我了解名称空间的使用以及为什么需要使用它们。我不明白为什么我需要添加如下的 use 语句(在控制器的顶部):

use Session;
use Input;
use Response;

我必须这样做,以免出现以下致命异常:

Class 'App\Http\Controllers\Session' not found

也许我错过了什么?这些类似乎是框架的一部分,并且默认情况下在 L4.x 中。

谁能帮助我理解为什么在 L5 中会出现这种情况,或者我如何才能避免在 L5 中这样做?

谷歌在这方面让我失望了。

【问题讨论】:

    标签: php laravel-5


    【解决方案1】:

    在文件中使用use 语句的过程称为别名或导入。 http://php.net/manual/en/language.namespaces.importing.php 给出了很好的解释,但简而言之:

    • 如果您使用“相对”或仅使用类的名称(例如Session)引用一个类,PHP 将检查当前命名空间是否存在该类。
    • 从技术上讲,Laravel 4 控制器不在命名空间中。它们是应用程序根命名空间的一部分,因此对根命名空间 (Session) 中另一个类的引用会发现这一点。 Laravel 5 控制器的命名空间位于 App\Http\Controllers\
    • 解决这个问题的唯一方法是告诉 PHP 给定类的完整命名空间,例如在本例中为 \Session,因为这些类是作为根命名空间的一部分添加的。例如new \App\MyCompany\Models\SomeModel();
    • 类文件顶部的“use”语句允许您将这些完整的类路径作为任何您想要的别名。 use \App\MyCompany\Models\SomeModel as Foo 将允许您执行new Foo() 并获得\App\MyCompany\Models\SomeModel 的实例。 (大多数人会省略 'as' 语句,只引用 new SomeModel()
    • 在尝试利用与当前类不同的命名空间中的类时,没有办法也不需要尝试避免将这些use 语句添加到您的类中。它是一种有用的语言结构,而不是限制。

    希望这是有道理的。

    【讨论】:

    • 谢谢它确实有意义。与 C# 中的 Use 语句非常相似。但是在 C# 中,您可以“使用 System”或“使用 System.Web”,它使您可以访问许多可以参考的类等。看起来如果这些类都在根命名空间中,您将能够执行“使用 App”之类的操作,并且它们将被自动包含在内。但好像不是这样的?
    • 您不能在 PHP 中导入整个命名空间。但是,您可以将命名空间从其完整路径名命名为最低级别,然后从那里引用它。继续我之前的示例,use \App\MyCompany\Models。然后你可以做new Models\SomeModel()
    • 只是一个提示 - 当引用根命名空间中的类时,您可以只用斜杠引用它,即 - \DB::enableQueryLog();除非我在一个类中广泛使用根类,否则我宁愿不要浪费一行来写“use”语句。但是,我确实更喜欢引用根类,而不是使用基于根类的辅助函数,即返回 \Response::json() 而不是仅返回 json()。虽然前者更冗长,但对于其他查看代码的人来说也更清楚。
    猜你喜欢
    • 2015-07-22
    • 2018-07-11
    • 2017-05-17
    • 1970-01-01
    • 2021-09-27
    • 2014-01-20
    • 2011-02-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多