我对使用composer和自动加载来组织代码相对陌生。我有一个git存储库,在本地机器上,我在项目的根目录中设置composer。我在composer.json中指定了运行所需的所有内容。使用"composer install
",将自动安装所有库。
{
"name": "my/repo",
"description": "bla",
"version": "1.2.3",
"require":
{
"php": "5.6.*",
"geraintluff/jsv4": "1.*",
"lcobucci/jwt": "^3.0"
},
"autoload":
{
"psr-4":
{
"MyNamespace\": "src/"
}
}
}
所以,一旦我在本地机器上运行了"composer install
",所有的东西都会自动加载到我的代码中。好的
但现在我需要在另一个linux系统上部署整个系统。所以我从git中提取并运行composer install
。提取所有库,自动加载文件显示在vendor/
中
但是,我不能使用自动加载(是的,我使用了require_once(__DIR__ . '/../vendor/autoload.php');
)。每次我试图实例化一个类,我都会得到一个
PHP Fatal error: Class 'X' not found in /var/www/bla/x.class.php on line 123
使用use X;
并不能解决问题,也不能尝试用其完整的命名空间名称(例如$x = new ABX();
)实例化类
以下是文件夹结构(如果这很重要的话):
+ src/
| + X.class.php // namespace here is "MyNamespace"
| + Y.class.php // same namespace
+ test/
+ run.php // namespace is "Test"
以下是此代码的一个片段(run.php):
<?php namespace Test; // different namespace than the rest of the code
// making the namespace also "MyNamespace" wouldnt work either
require_once(__DIR__ . '/../vendor/autoload.php');
use MyNamespaceY; // whether this line is here or not does not change the error
session_start();
// same error as with "just" implements Y {}
class SomeClass implements MyNamespaceY {
// ...
}
?>
因此,在这里,对Y被扩展的行抛出致命错误。不管我是否使用完整的命名空间。唯一有帮助的是require_oce()。。。
所以,这迫使我回到繁琐的方式去做所有需要/包括我自己的事情!?有什么办法解决这个问题吗?
附言:composer dumpautoload
对没有帮助
PPS:composer validate
显示无错误
为了符合PSR-4,您的文件结构应该是:
+ src/
| + X.php
| + Y.php
注意删除了.class.php后缀。http://www.php-fig.org/psr/psr-4/