我有点困惑,我应该如何在作曲家中使用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中设置这个“空”条目,我相信它会说“从根目录开始,在任何目录中查找任何命名空间中的类”,如果遵循正确的文件夹命名/命名空间结构,我可以自动加载我的任何类。
所以我的问题是,如果后者有效且简单得多,我为什么要做前者?这是表演吗?还是有其他原因?
PSR-4是将名称空间转换为物理目录的标准。
通常,在使用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;
为什么你不应该总是做"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?