【问题标题】:How fussy are Laravel namespaces?Laravel 命名空间有多挑剔?
【发布时间】:2016-07-29 08:53:08
【问题描述】:

我似乎遇到了几种 laravel 命名空间定义(在类中),我想知道是否有些比其他更好,或者甚至是完全错误的。

  1. namespace mydomain\app\controllers
  2. namespace dev.mydomain.com\app\controllers
  3. namespace app\controllers
  4. namespace \app\controllers

几个问题:

  • 我知道最初的\ 是可选的,但是mydomain 前缀是什么?它是必需的,还是可选的?
  • 使用dev.mydomain.com is 或仅使用mydomain 有区别吗?
  • 仅仅是与文件夹名称相同的问题吗?

【问题讨论】:

  • 初始斜线指的是global namespace。在命名空间之前是否使用dev 都没有关系。它只是一个命名空间。文件夹名称与命名空间本身无关,但一些加载程序确实使用命名空间作为文件夹的映射。查看here 以获得更全面的解释。
  • myproject\app\controllers\app\controllersapp\controllers有区别吗?
  • 是的。有。根据 laravel 使用的psr-4 加载标准,命名空间必须为\<NamespaceName>(\<SubNamespaceNames>)*\<ClassName>,其中SubNamespaceNames 可以任意多个。

标签: php namespaces laravel-5.2


【解决方案1】:

在你提到的那些命名空间中没有更好或更坏的地方。

名称空间已添加到语言中,以防止单独包中的名称冲突。

例如,您可以在自己的命名空间\MyApp\User 中拥有一个类User,也可以使用具有名为User 的类但在自己的命名空间\Package\User 中的第三方包。

这是最初的想法。后来,人们决定我们可以使用这个命名空间来自动加载一些类。一个原始的想法是\MyApp\User 应该在MyApp/User.php 中找到。很简单。

这当然是先进的,您可以通过搜索“php autoloading”或更好的“composer autoloading”来了解更多信息。

关于最初的\,在某些地方并不重要,但在其他地方却很重要。在声明命名空间时,它并不重要,例如namespace \MyApp\Usernamespace MyApp\User 相同。 use 语句的行为也是如此。但是当你要使用一个类时,即new \MyApp\User() vs new MyApp\User,它确实不同。您可以在PHP documentation找到更多信息。

好的,背景足够了。具体问题。

我知道最初的 \ 是可选的,但是 mydomain 前缀是什么?它是必需的还是可选的?

对于 Laravel 案例,它不是可选的。查看composer.json,在psr-4 下,您会发现app 文件夹具有定义的命名空间前缀。这就是您应该为您的课程使用的(如果它们在app 文件夹中)。要了解更多信息,请查找PSR-4

使用 dev.mydomain.com is 或只是 mydomain 有区别吗?

我想我已经提到了 PSR-4,所以使用那里的任何东西。

仅仅是文件夹名称相同的问题吗?

这也是 PSR-4。阅读更多相关信息,您的所有问题都会得到解答。

但简而言之,我们有两个基于 PHP 命名空间自动加载类的标准:PSR-0 和 PSR-4。

在 PSR-0(旧版本)中,目录结构必须与命名空间完全匹配,也就是说,如果您的根文件夹是 src 并且您的类被命名为 \Package\User,那么您的目录结构中就有 src/Package/User.php文件系统。

在 PSR-4 中,我们可以为目录设置命名空间前缀。例如,您说文件夹src 中的任何内容都以\App\Package 命名空间开头。名为\App\Package\User 的类应该驻留在src/User.php 中,当然具有正确的命名空间。这就是 Laravel 和当今大多数软件包所使用的。

【讨论】:

    猜你喜欢
    • 2015-10-05
    • 2017-12-16
    • 1970-01-01
    • 2015-04-25
    • 2023-03-21
    • 2015-07-27
    • 2016-11-27
    • 2023-04-09
    • 2013-06-16
    相关资源
    最近更新 更多