我正在努力解决如何正确地构建和自动加载我的第一个作曲家包。我明白,如果我遵循PSR-0命名惯例,自动加载应该“正常工作”。我试图设置与:
我已经设法调试了一个项目,该项目包括包,通过在ClassLoader.php
文件的findFileBackExtense()
函数中放置一个打印来输出搜索路径
/home/stuart/Desktop/test-project/vendor/Programster/CoreLibs/Programster/Programster/CoreLibs/Core.php
我知道该文件实际位于:
/home/stuart/Desktop/test-project/vendor/Programster/CoreLibs/Core.php
我的包裹是作曲的。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");
这个项目的作者。包含包的json文件:
{
"repositories": [ { "type": "composer", "url": "http://satis.mydomain.com/" } ],
"require": {
"Programster/CoreLibs": "dev-trunk"
}
}
是我的包的配置错误,还是我真的需要在CoreLibs存储库源代码中创建Programster/CoreLibs/子目录?
use \Programster\CoreLibs as programster;
programster\Core::println("hello world");
您的类名计算结果为\Programster\CoreLibs\Core
。
有了这个PSR-0自动加载,
"psr-0": {
"Programster": "Programster"
}
类名将完全转换为路径名,如“Programster/CoreLibs/Core.php”,该路径将在相对于库composer的目录“Programster”中搜索。json
位置。
使用PSR-4自动加载,
"psr-4": {
"Programster\\CoreLibs\\": ""
}
此定义中的前缀将从类名中删除,其余部分将被转换为路径(即路径)。Core.php)并且在所提到的路径中被搜索(在这种情况下,在库的主目录中,因为Core.php是指向没有任何子目录的文件)。
你的第二个定义在某些方面更好。它使用较长的前缀,如果您包含使用相同前缀的多个库,这是相关的,因为这样Composer将不得不搜索多个路径来查找类。它使用更短的路径,这也允许稍微快一点的磁盘I/O操作(不过,我还没有做任何性能测量)。
我使用了其他人在评论中建议的PSR-4标准,并更新了我的软件包的编写器,从而使它能够正常工作。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()$装载机-