psr-0 与作曲家自动加载不工作,但它与 psr-4 自动加载完美配合

Posted

技术标签:

【中文标题】psr-0 与作曲家自动加载不工作,但它与 psr-4 自动加载完美配合【英文标题】:psr-0 autoloading with composer not wotking, but it works perfectly with psr-4 autoloading 【发布时间】:2016-10-31 16:42:50 【问题描述】:

我尝试使用 PSR-0 自动加载文件,但它不会自动加载该文件。我尝试使用 PSR-4 自动加载相同的文件。使用 PSR-4,它可以完美运行。 PSR-0 所需的文件夹结构有什么不同吗?

即使保留What is the difference between PSR-0 and PSR-4? 中提到的文件夹结构,我也无法使 PSR-0 工作

这是我的文件夹结构。

Test
    --Package
        --Test.php

我在Test.php:

<?php
namespace Test\Package;

class Test

    public function __construct()
    
        echo "In Test class";
    

composer.json 看起来像


  "autoload": 

    "psr-0": 
            "Test\\Package\\": "Test/Package/"
             
  

【问题讨论】:

What is the difference between PSR-0 and PSR-4?的可能重复 @Wazelin 但是即使保留***.com/questions/24868586/… 中提到的文件夹结构,我也无法使 PSR-0 工作,这是我的结构测试 --Package --Test.php Test.php // ////////////////////////////////////////// 正如您所描述的,它们应该可以工作。你的实际类名和文件夹结构是什么? 那是我在描述中指定的:) @jwriteclub 测试文件夹外@jwriteclub 【参考方案1】:

与直觉相反,the composer documentation on PSR-0 包含一个部分路径,这使得 PSR-0 似乎需要一个包的路径才能加载类。实际上,PSR-0 是根据包构建路径,因此它只需要指定路径,如果代码位于像 src/lib/ 这样的文件夹中,不是命名空间的一部分小路。如果基于命名空间的目录结构与composer.json 在同一目录中开始,则不需要路径。

假设问题中指定了一个目录结构,有几种方法可以使用 composer 加载这个类。

PSR-0


  "autoload": 
    "psr-0":  "Test\\Package\\": "" 
  

请注意,即使代码位于 Test/Package/ 中,此文件夹在 PSR-0 中指定。

PSR-4

对于 PSR-4 自动加载,包源的路径必须出现在 composer.json 文件中。


  "autoload": 
    "psr-4":  "Test\\Package\\": "Test/Package/" 
  

类图

当需要加载未组织到典型命名空间文件夹树中的类时,也可以使用 classmap 数组简单地指定要在其中搜索类的文件夹列表。


  "autoload": 
    "classmap": [ "Test/Package/" ]
  

不过,一般而言,使用 PSR-0 或 PSR-4 会提供更轻松的体验,因为 classmap 方法需要单独指定每个文件夹。

【讨论】:

以上是关于psr-0 与作曲家自动加载不工作,但它与 psr-4 自动加载完美配合的主要内容,如果未能解决你的问题,请参考以下文章

PSR-0 自动加载错误

PSR规范

PSR规范

使用命名空间自动加载 Composer 和 PSR-0 类

Composer 的自动加载机制

Composer、Laravel 和本地包