PSR-0和PSR-4之间有什么区别?

时间:2014-07-21 15:12:22

标签: php laravel composer-php psr-0 psr-4

最近我读到了名称空间及其有益的方法。我目前正在Laravel中创建一个项目,并试图从类地图自动加载转移到命名空间。但是,我似乎无法掌握PSR-0和PSR-4之间的实际差异。

我读过的一些资源是......

我的理解:

  • PSR-4不会将下划线转换为目录分隔符
  • 作曲家的某些特定规则会导致目录结构变得复杂,从而使PSR-0命名空间变得冗长,从而创建了PSR-4

可以理解解释差异的例子。

5 个答案:

答案 0 :(得分:256)

它们非常相似,所以它有点令人困惑也就不足为奇了。总结是PSR-0具有PSR-4丢弃的PEAR样式类名的一些向后兼容性功能,因此它只支持命名空间代码。最重要的是,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 :(得分:40)

以下是主要差异,

1。例如,如果您定义Acme\Foo\命名空间锚定在src/

  • 使用PSR-0表示它会在Acme\Foo\Bar
  • 中查找src/Acme/Foo/Bar.php
  • 在PSR-4中,它会在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类)无法正常工作

答案 2 :(得分:25)

PSR-4类似于'相对路径',PSR-0,'绝对路径'。

e.g。

配置:

'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/

答案 3 :(得分:6)

命名空间/文件夹约定。

应根据命名空间将类存储在文件夹中。

通常,您将在根文件夹中创建一个src /目录,与vendor /位于同一级别,并在那里添加项目。以下是文件夹结构的示例:

.
+-- 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/"
        }
} 
  • src / Book /History/UnitedStates.php
  • 中寻找预订 \历史\美国
  • src / Vehicle /Air/Wings/Airplane.php
  • 中寻找车辆 \ Air \ Wings \ Airplane

<强> PSR-4

查看vendor/composer/autoload_psr4.php文件,您可以看到名称空间及其映射到的目录。

composer.json

"autoload": {
    "psr-4": {
        "Book\\": "src/",
        "Vehicle\\": "src/"
    }
}   
  • src /History/UnitedStates.php
  • 中寻找预订 \历史\美国
  • src /Air/Wings/Airplane.php
  • 中寻找车辆 \ Air \ Wings \ Airplane

composer.json

"autoload": {
    "psr-4": {
        "Book\\": "src/Book/",
        "Vehicle\\": "src/Vehicle/"
    }
}    
  • 寻找图书 \历史\美国 src /图书 /History/UnitedStates.php
  • src / Vehicle /Air/Wings/Airplane.php
  • 中寻找车辆 \ Air \ Wings \ Airplane

答案 4 :(得分:-5)

即使我尝试过,但Composer还是一团糟。可悲的是,它是市场上唯一的选择。
为什么会一团糟?。
如果您控制代码,则Composer的自动完成功能可以正常工作。但是,如果要导入其他项目,则会发现自己有很多样式和创建文件夹的方式。例如,某些项目是/company/src/class.php,而其他项目是company / class.php,而其他项目是company / src / class / class.php

我创建了一个解决该问题的库:

https://github.com/EFTEC/AutoLoadOne(麻省理工学院免费)。

它通过扫描文件夹的所有类来生成自动包含,因此在每种情况下都可以使用(psr-0 psr-4,不带名称空间的类,具有多个类的文件。.

edit:再次,毫无理由地投票。 ;-)