当前位置: 首页 > 知识库问答 >
问题:

为什么在使用psr-4自动加载Composer时指定名称空间?

白青青
2023-03-14

我有点困惑,我应该如何在作曲家中使用psr-4自动加载。假设我有一个这样的文件夹结构:

/
|- Core/
|   - Router.php
|- App/
|   - Models
|       User.php
|- composer.json

基本上,在项目根中:composer。json;包含路由器php类的核心文件夹;包含包含用户类的模型文件夹的应用程序文件夹。

路由器类如下所示:

<?php
namespace Core;

class Router {
}

Users类如下所示:

<?php
namespace App\Models;

class User {
}

所以我可以使用Composer psr-4自动加载程序自动加载这些类,我可以在Composer中这样做。json:

{
    "autoload": {
        "psr-4": {
            "Core\\": "Core",
            "App\\Models\\": "App/Models"
        }
    }
}

因此,我可以使用这些类而不需要它们(在运行composer dump autoload之后),如下所示:

$router = new Core\Router();
$user = new App\Models\User();

这样做没有问题。

不过,我也可以在composer中这样做。json:

{
    "autoload": {
        "psr-4": {
            "": ""
        }
    }
}

根据文档,它是一个回退目录,相对于根,任何名称空间都可以在其中。因此,通过在composer autoloader中设置这个“空”条目,我相信它会说“从根目录开始,在任何目录中查找任何命名空间中的类”,如果遵循正确的文件夹命名/命名空间结构,我可以自动加载我的任何类。

所以我的问题是,如果后者有效且简单得多,我为什么要做前者?这是表演吗?还是有其他原因?

共有3个答案

师成弘
2023-03-14

PSR-4是将名称空间转换为物理目录的标准。

钮才哲
2023-03-14

通常,在使用composer时,您自己的项目只有一个文件夹。然后只需要指定一个名称空间。

考虑将文件结构重新排列为

/
|- lib/
|   - Core/
|      - Router.php
|   - App/
|      - Models
|          User.php
|- composer.json

换个作曲家。json

{
    "autoload": {
        "psr-4": {
            "MyApp\\": "lib/"
        }
    }
}

然后您只有一个指定的名称空间,不需要再添加任何名称空间。您可以这样调用您的类:

$router = new \MyApp\Core\Router;
$user   = new \MyApp\App\Models\User;

或者像这样:

namespace MyApp;
$router = new Core\Router;
$user   = new App\Models\User;
严承允
2023-03-14

为什么你不应该总是做"psr-4": {"": ""}

理由1:它具有成本效益。定义说,对于每个需要自动加载的类,Composer都应该查看根目录。这些类不仅是包中的类,而且也是所有其他类。

Composer试图通过记住没有结果的搜索来优化这种努力,但是只有当你加载具有相同前缀的另一个类时,这种努力才会有回报。

原因2: PSR-4的本质是您不必将整个命名空间路径映射到目录路径。假设您有一个包,它处理一个非常特定的类组,如\Vendor\Temboard\Escape ing\Output\*,而没有其他东西(有小包可以更容易地重用它们,而不需要添加太多代码),您可以在 src/供应商/模板/转义/输出/AnyClass.php并定义

"psr-4": {
        "\\Vendor\\Template\\Escaping\\Output\\": "src/Vendor/Template/Escaping/Output/"
}

还可以将类放入src/AnyClass.php并定义

"psr-4": {
        "\\Vendor\\Template\\Escaping\\Output\\": "src/"
}

这大大缩短了目录路径,略微提高了速度(我想-虽然没有数字),但主要是由于较少打开空文件夹而提高了开发速度。

在同一个包中同时包含Core名称空间和App名称空间,这让我怀疑:为什么没有一个包来对应这两个名称空间?

 类似资料:
  • 我和许多其他人一样,似乎很难弄清楚何时以及如何使用自动加载。我想我理解作曲家和PSR-0/PSR-4的概念和这需要的目录结构。但是如果我用自己的MVC框架构建自己的项目 > 由于composer自带了自动加载器,它将加载我希望包含在项目中的所有依赖项,如果我不打算将我的网站变成分布式项目,我甚至需要自己的名称空间吗?为什么我不坚持使用include/requires? 最后,如果我采用名称空间,使

  • 我有自己的小MVC框架,我使用composer psr-4自动加载。 在我自己的计算机上,它工作得非常好,但当我将它部署到我的Ubuntu服务器上时,它就不再工作了。(它再也找不到任何类了)我已经尝试了很多东西,但无论我尝试什么,它都不起作用。。。 我所尝试过的: 作曲家转储自动加载 作曲家更新 删除所有内容并再次上载 在互联网上搜索几个小时…:( 这是我的composer.json: 我只是不明

  • 我有一个在本地运行良好的Laravel项目(Mavericks),但是psr-4下的类没有加载到我们的后台服务器(CentOS)上。每次尝试composer更新或运行artisan命令时,我都会收到一个反射“未找到类”错误。 我的所有特定于应用程序的类都存储在我的Laravel项目的app/heatherland下,例如: 我的composer.json包含以下条目: 在本地,psr-4类被添加到

  • 1. 概述 本 PSR 是关于由文件路径 自动载入 对应类的相关规范, 本规范是可互操作的,可以作为任一自动载入规范的补充,其中包括 PSR-0,此外, 本 PSR 还包括自动载入的类对应的文件存放路径规范。 关于「能愿动词」的使用 为了避免歧义,文档大量使用了「能愿动词」,对应的解释如下: 必须 (MUST):绝对,严格遵循,请照做,无条件遵守; 一定不可 (MUST NOT):禁令,严令禁止;

  • 我已经试着让psr-4自动加载工作一个多星期了,但没有成功。 我的文件结构如下: 我创建了psr-4自动加载功能,如下所示: 在使用作曲家转储-自动加载-0后,在我的session.php类中,我给出了命名空间: 然后我需要自动加载器,并使用use函数将会话类命名如下: 打开index.php页面后,我得到一个 致命错误:在第10行的/var/www/test/Project/index.php中

  • 我开始学习Composer,并正在开发一个系统,在该系统中,我将文件与核心应用程序文件分开,如下所示: 所以,要在composer中设置此设置。json文件并访问所有类/App much/Core会这样吗? 还是有更正确的方法? 我也读过PSR-0和PSR-4的比较,我仍然有点怀疑应该使用哪一种。在我的情况下,我应该实现什么,PSR-0还是PSR-4?