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

Var*_*ath 210 php psr-0 laravel composer-php psr-4

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

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

我的理解:

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

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

Sel*_*aek 265

它们非常相似,所以它有点令人困惑也就不足为奇了.总结是PSR-0具有PSR-4丢弃的PEAR样式类名的一些向后兼容性功能,因此它只支持命名空间代码.最重要的是,PSR-4不会强制您将整个命名空间作为目录结构,而只是使用锚点之后的部分.

例如,如果你定义的Acme\Foo\命名空间中固定src/,与PSR-0这意味着它会寻找Acme\Foo\Barsrc/Acme/Foo/Bar.php同时PSR-4将在寻找它src/Bar.php,允许较短的目录结构.在另一方面有些人喜欢有充分的目录结构清楚地看到什么是其中的命名空间,所以你也可以说,Acme\Foo\是在src/Acme/Foo与PSR-4这将让你上述的PSR-0行为等同.

对于新项目以及大多数意图和目的而言,您可以使用PSR-4而忘记PSR-0的所有内容.

  • 如果你说'Acme\Foo\=> src /`,它会选择`src/Bar.php` (16认同)
  • PSR-4比PSR-0慢,不是吗? (4认同)
  • @NguyenLinh我不这么认为.它做同样的事情,但可能用较少的目录级别,所以实际上可能会更快一些.测量它.你可以创建一个可以在PSR-0和PSR-4之间切换的包 - 我认为你不会看到差别. (2认同)

Adi*_*asi 42

以下是主要区别,

1.例如,如果您定义Acme\Foo\名称空间是锚定的src/,

  • 与PSR-0这意味着它会寻找Acme\Foo\Barsrc/Acme/Foo/Bar.php
  • 而在PSR-4将查找Acme\Foo\Barsrc/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类)不起作用


wbs*_*wjc 29

PSR-4就像'相对路径',PSR-0,'绝对路径'.

例如

配置:

'App\Controller' => 'dir/'
Run Code Online (Sandbox Code Playgroud)

PSR-0自动加载:

App\Controller\IndexController --> dir/App/Controller/IndexController.php
Run Code Online (Sandbox Code Playgroud)

PSR-4自动加载:

App\Controller\IndexController --> dir/IndexController.php
Run Code Online (Sandbox Code Playgroud)

PSR-0和PSR-4之间的细节有所不同,请参见此处:http://www.php-fig.org/psr/psr-4/


Udh*_*iya 7

命名空间/文件夹约定.

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

通常,您将在根文件夹中创建一个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
Run Code Online (Sandbox Code Playgroud)

psr-0和psr-4之间的区别

PSR-0

它已被弃用.查看vendor/composer/autoload_namespaces.php文件,您可以看到命名空间和它们映射到的目录.

composer.json

"autoload": {
        "psr-0": {
            "Book\\": "src/",
            "Vehicle\\": "src/"
        }
} 
Run Code Online (Sandbox Code Playgroud)
  • src/Book /History/UnitedStates.php中寻找Book\History\Unitedstates
  • src/Vehicle /Air/Wings/Airplane.php中寻找车辆 \空气\翅膀\飞机

PSR-4

查看vendor/composer/autoload_psr4.php文件,您可以看到命名空间和它们映射到的目录.

composer.json

"autoload": {
    "psr-4": {
        "Book\\": "src/",
        "Vehicle\\": "src/"
    }
}   
Run Code Online (Sandbox Code Playgroud)
  • src /History/UnitedStates.php中寻找Book\History\UnitedStates
  • src /Air/Wings/Airplane.php中寻找车辆 \空气\翅膀\飞机

composer.json

"autoload": {
    "psr-4": {
        "Book\\": "src/Book/",
        "Vehicle\\": "src/Vehicle/"
    }
}    
Run Code Online (Sandbox Code Playgroud)
  • 寻找书籍 \历史\美国src/Book /Hrory/UnitedStates.php
  • src/Vehicle /Air/Wings/Airplane.php中寻找车辆 \空气\翅膀\飞机

  • 在此问题上挣扎了一段时间,直到这篇文章。非常感谢您提供简洁的示例! (2认同)