最近我读到了有关命名空间及其好处的内容。我目前正在 Laravel 中创建一个项目,并尝试从类映射自动加载转移到命名空间。但是,我似乎无法理解 PSR-0 和 PSR-4 之间的实际区别。
我读过的一些资源是...
我的理解:
解释差异的示例将不胜感激。
它们非常相似,所以有点令人困惑也就不足为奇了。总而言之,PSR-0 对 PEAR 风格的类名有一些向后兼容的功能,而 PSR-4 则放弃了这些功能,因此它只支持命名空间代码。除此之外,PSR-4 并不强制您将整个命名空间作为目录结构,而只是将锚点后面的部分作为目录结构。
例如,如果您定义
Acme\Foo\
命名空间锚定在 src/
中,则 PSR-0 意味着它将在 Acme\Foo\Bar
中查找 src/Acme/Foo/Bar.php
,而在 PSR-4 中它将在 src/Bar.php
中查找。 ,允许更短的目录结构。另一方面,有些人更喜欢拥有完整的目录结构,以便清楚地看到哪个命名空间中有什么,因此您也可以说 Acme\Foo\
位于 src/Acme/Foo
中,带有 PSR-4,这将为您提供相当于 PSR-0 的功能上述行为。
长话短说,对于新项目来说,对于大多数意图和目的,您可以使用 PSR-4 并忘记 PSR-0。
以下是主要区别,
1. 例如,如果您定义
Acme\Foo\
命名空间锚定在 src/
,
Acme\Foo\Bar
中寻找
src/Acme/Foo/Bar.php
Acme\Foo\Bar
中查找 src/Bar.php(where Bar class is)
。2. PSR-4 不会将下划线转换为目录分隔符
3. 您更喜欢将 PSR-4 与命名空间一起使用
4. 即使类名与文件名不同,PSR-0 也不会工作,就像考虑上面的例子:
Acme\Foo\Bar
---> src/Acme/Foo/Bar.php
(针对 Bar 课程)可以使用Acme\Foo\Bar
---> src/Acme/Foo/Bar2.php
(对于 Bar 类)不起作用PSR-4 类似于“相对路径”、PSR-0、“绝对路径”。
例如
配置:
'App\Controller' => 'dir/'
PSR-0自动加载:
App\Controller\IndexController --> dir/App/Controller/IndexController.php
PSR-4自动加载:
App\Controller\IndexController --> dir/IndexController.php
PSR-0 和 PSR-4 之间还有更多细节差异,请参见此处:http://www.php-fig.org/psr/psr-4/
命名空间/文件夹约定。
类应根据其名称空间存储在文件夹中。
一般来说,您将在根文件夹中创建一个 src/ 目录,与供应商/处于同一级别,并在其中添加您的项目。以下是文件夹结构的示例:
.
+-- src
|
+-- Book
| +-- History
| | +-- UnitedStates.php - namespace Book\History;
+-- Vehicle
| +-- Air
| | +-- Wings
| | | +-- Airplane.php - namespace Vehicle\Air\Wings;
| +-- Road
| | +-- Car.php - namespace Vehicle\Road;
+-- tests
+-- test.php
+-- vendor
psr-0 和 psr-4 的区别
psr-0
它已被弃用。查看
vendor/composer/autoload_namespaces.php
文件,您可以看到名称空间及其映射到的目录。
composer.json
"autoload": {
"psr-0": {
"Book\\": "src/",
"Vehicle\\": "src/"
}
}
psr-4
查看
vendor/composer/autoload_psr4.php
文件,您可以看到名称空间及其映射到的目录。
composer.json
"autoload": {
"psr-4": {
"Book\\": "src/",
"Vehicle\\": "src/"
}
}
composer.json
"autoload": {
"psr-4": {
"Book\\": "src/Book/",
"Vehicle\\": "src/Vehicle/"
}
}
即使我尝试过,但 Composer 还是一团糟。可悲的是,这是市场上唯一的选择。
为什么乱七八糟?.
如果您可以控制代码,Composer 的自动完成功能就可以正常工作。但是,如果您要导入不同的项目,您会发现自己有很多样式和方法来创建文件夹。例如,有些项目是/company/src/class.php,有些项目是company/class.php,有些项目是company/src/class/class.php
我创建了一个库来解决这个问题:
https://github.com/EFTEC/AutoLoadOne(它是免费的,麻省理工学院)。
它通过扫描文件夹的所有类来生成自动包含,因此它适用于每种情况(psr-0 psr-4、没有命名空间的类、具有多个类的文件..
编辑:再次,无缘无故地投了反对票。 ;-)