我尽力找到适用的问题/答案,但我认为我对自动加载器的理解不足以识别合适的答案。
我有一个包含以下composer.json的包:
{
"name": "Pva_agent",
"type":"library",
"description" : "query the pva agent",
"version":"0.1b",
"authors" : [
{
"name":"Ed Greenberg",
"email":"ed@precisionpros.com"
}
],
"minimum-stability":"dev",
"require": {},
"autoload": {
"psr-0": {
"Pva_agent": "."
}
}
}
我在编写器安装包后的目录结构:
.
./vendor
./vendor/autoload.php
./vendor/Pva_agent
./vendor/Pva_agent/Agent.php
./vendor/Pva_agent/composer.json
./vendor/Pva_agent/.gitignore
./vendor/composer
./vendor/composer/autoload_psr4.php
./vendor/composer/autoload_real.php
./vendor/composer/autoload_classmap.php
./vendor/composer/autoload_namespaces.php
./vendor/composer/installed.json
./vendor/composer/autoload_static.php
./vendor/composer/ClassLoader.php
./vendor/composer/LICENSE
./composer.lock
./composer.json
./test_pva_agent.php
我的测试程序:
<?php
require_once('vendor/autoload.php');
use Pva_agent\Agent;
$agent = new Agent();
我的结果:
edg@arthur pva_project $ php test_pva_agent.php
PHP Fatal error: Class 'Pva_agent\Agent' not found in /home/edg/PhpstormProjects/pva_project/test_pva_agent.php on line 6
PHP Stack trace:
PHP 1. {main}() /home/edg/PhpstormProjects/pva_project/test_pva_agent.php:0
edg@arthur pva_project $
我认为我不需要'use'语句,因为自动加载器应该找到类,对吧?
有人可以告诉我问题在哪里吗?
谢谢,
艾德·格林伯格答案 0 :(得分:0)
您的 Pva_agent 库不应位于vendor/
目录中。此目录应仅包含Composer中自动生成的数据。此目录通常不存储在VCS中。
您应该考虑将您的目录结构重构为与此类似的内容:
.
|____composer.json
|____composer.lock
|____src
| |____Pva_agent
|____vendor
您的库功能应添加到src/Pva_agent
目录。
考虑使用PSR-4而不是PSR-0来实现autoload功能,因为在添加类时无需重新生成自动加载器。添加分类后,必须在PSR-0的情况下运行dump-autoloader。
对于上面的目录结构和PSR-4自动加载器,您的composer.json
自动加载部分应该与此类似:
"autoload": {
"psr-4": { "Pva_agent\\": "src/Pva_agent" }
}
此后您的图书馆应自动加载。您的自动加载库将在Pva_agent
命名空间下注册。