包自动加载问题

时间:2014-06-29 22:56:28

标签: php package composer-php

我正在努力研究如何正确构建和自动加载我的第一个作曲家包。我知道如果我遵循PSR-0命名约定,自动加载应该"只是工作"。我正试图建立:

  • vendor:Programster
  • 包名:CoreLibs

我设法通过在findFileWithExtension()文件的ClassLoader.php函数中添加打印件来调试包含包的项目到我输出搜索路径的位置

/home/stuart/Desktop/test-project/vendor/Programster/CoreLibs/Programster/Programster/CoreLibs/Core.php

我知道该文件实际位于:

/home/stuart/Desktop/test-project/vendor/Programster/CoreLibs/Core.php

我的Package' 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");

项目的composer.json文件包含包:

{
    "repositories": [ { "type": "composer", "url": "http://satis.mydomain.com/" } ],
    "require": {
        "Programster/CoreLibs": "dev-trunk"
    }
}

我的软件包配置是否有问题,或者我是否真的需要在CoreLibs存储库源代码中创建Programster / CoreLibs /子目录?

2 个答案:

答案 0 :(得分:1)

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

您的班级名称评估为\Programster\CoreLibs\Core

使用此PSR-0自动加载,

    "psr-0": {
        "Programster": "Programster"
    }

类名将完全转换为路径名,如“Programster / CoreLibs / Core.php”,此路径将在相对于库composer.json位置的“Programster”目录中搜索。

使用PSR-4自动加载,

    "psr-4": {
        "Programster\\CoreLibs\\": ""
    }

此定义中的前缀将从类名中删除,其余部分将转换为路径(即“Core.php”)并在提到的路径中搜索(在本例中,在库的主目录中) ,因为“”+“Core.php”指向没有任何子目录的文件。)

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

答案 1 :(得分:0)

我设法通过使用其他人在评论中建议的PSR-4标准并更新我的软件包的composer.json文件(参见自动加载部分)来实现它的工作:

{
    "name": "Programster/CoreLibs",
    "type": "library",
    "description": "Core libraries for PHP 5.3+",
    "keywords": ["core","library"],
    "homepage": "http://svn.mydomain/core-libs",
    "license": "none",
    "authors": [
        {
            "name": "MY name",
            "email": "my.email@email.com",
            "homepage": "http://my-website.com/",
            "role": "Developer"
        }
    ],
    "require": {
        "php": ">=5.3.0"
    },
    "autoload": {
        "psr-4": {
            "Programster\\CoreLibs\\": ""
        }
    }
}

这是我安装软件包的项目中的脚本:

require_once(__DIR__ . '/../vendor/autoload.php');
\Programster\CoreLibs\Core::println("hello world");

@sectus是对的,我不需要使用$loader = new \Composer\Autoload\ClassLoader();$loader->register();