Php 包自动加载问题

Php 包自动加载问题,php,package,composer-php,Php,Package,Composer Php,我正在努力解决如何正确构建和自动加载我的第一个作曲家软件包。我理解如果我遵循PSR-0命名约定,自动加载应该“正常工作”。我正试图建立以下关系: 供应商:Programster 软件包名称:CoreLibs 通过在ClassLoader.php文件的findFileWithExtension()函数中添加一个打印项,我成功地调试了一个包含包的项目,直到输出搜索路径为止 /home/stuart/Desktop/test-project/vendor/Programster/CoreLibs/

我正在努力解决如何正确构建和自动加载我的第一个作曲家软件包。我理解如果我遵循PSR-0命名约定,自动加载应该“正常工作”。我正试图建立以下关系:

  • 供应商:Programster
  • 软件包名称:CoreLibs
通过在
ClassLoader.php
文件的
findFileWithExtension()
函数中添加一个打印项,我成功地调试了一个包含包的项目,直到输出搜索路径为止

/home/stuart/Desktop/test-project/vendor/Programster/CoreLibs/Programster/Programster/CoreLibs/Core.php
我知道该文件实际位于:

/home/stuart/Desktop/test-project/vendor/Programster/CoreLibs/Core.php
我的包的composer.json文件:

{
    "name": "Programster/CoreLibs",
    "type": "library",
    "description": "Core libraries for PHP 5.3+",
    "keywords": ["core","library"],
    "homepage": "http://svn.yadda-yadda.com/php/core-libs",
    "license": "none",
    "authors": [
        {
            "name": "xxxx",
            "email": "my.email@email.com",
            "homepage": "http://mywebsite.com/",
            "role": "Developer"
        }
    ],
    "require": {
        "php": ">=5.3.0"
    },
    "autoload": {
        "psr-0": {
            "Programster": "Programster"
        }
    }
}
以下是项目中的一个小脚本,其中包括要测试是否正常工作的包:

<?php

require_once(__DIR__ . '/../vendor/autoload.php');

$loader = new \Composer\Autoload\ClassLoader();
$loader->register();

use \Programster\CoreLibs as programster;
programster\Core::println("hello world");

我的包的配置是否错误,或者我真的需要在CoreLibs存储库源代码中创建Programster/CoreLibs/子目录吗?

我通过使用其他人在评论中建议的PSR-4标准并更新我的包的composer.json文件(请参阅自动加载部分),使其正常工作:

这是我在安装了包的项目中的脚本:

require_once(__DIR__ . '/../vendor/autoload.php');
\Programster\CoreLibs\Core::println("hello world");
@sectus是对的,我不需要使用
$loader=new\Composer\Autoload\ClassLoader()$加载程序->寄存器()

您的类名计算结果为
\Programster\CoreLibs\Core

使用此PSR-0自动加载

    "psr-0": {
        "Programster": "Programster"
    }
类名将完全转换为路径名,如“Programster/CoreLibs/Core.php”,并且将在目录“Programster”中相对于库
composer.json
位置搜索此路径

使用PSR-4自动加载

    "psr-4": {
        "Programster\\CoreLibs\\": ""
    }
此定义中的前缀将从类名中删除,其余部分将转换为路径(即“Core.php”),并在所述路径中搜索(在本例中,在库的主目录中,因为“+”Core.php”指向中的文件,而没有任何子目录)


你的第二个定义在某些方面更好。它使用一个较长的前缀,如果包含多个使用相同前缀的库,这是相关的,因为Composer必须搜索多个路径才能找到该类。而且它使用了较短的路径,这也允许稍微快一点的磁盘I/O操作(不过我还没有做任何性能测量)。

PSR-0已被弃用,您可能需要使用更友好的PSR-4来代替。@Ryanyosefi,找不到关于PSR-0弃用的消息。你能为我分享一些关于它的链接吗?你是在寻求建议还是解决一些问题?也许“不推荐”这个词不合适,但PSR-4更干净,而且是在考虑作曲家的情况下设计的。像Drupal这样的项目已经采用了它@sectus我正在试图找到解决方案来修复我的包的自动加载。这可能需要更改配置,或者更改目录结构。谢谢您提供的信息。关于
如果包含多个使用相同前缀的库
,我的目的是,我以后会有另一个库,名为Programster\\Package2等。这应该是“合并”的因此,目录结构将是
vendor/Programster/CoreLibs
vendor/Programster/Package2
,除非Composer在组织库的方式上有所改变(这一点您不必担心,因为这不关您的事-您只需要关心能够自动加载类),当前模式是为包含的每个包创建“vendorname/packagename”子文件夹。
use \Programster\CoreLibs as programster;
programster\Core::println("hello world");
    "psr-0": {
        "Programster": "Programster"
    }
    "psr-4": {
        "Programster\\CoreLibs\\": ""
    }