我在使用Composer设置类自动加载方面没有遇到任何麻烦,我此时已阅读并观看了数百万参考资料&不知怎的,我似乎仍然缺少一些至关重要的东西。
一些快速版本信息:
项目布局相对简单:
.
├── composer.json
├── framework
│ ├── classes
│ │ ├── Test1.php
│ ├── config
│ │ ├── Test2.php
│ ├── financial.html
│ ├── form.html
│ ├── index.php
│ ├── models
│ │ ├── Base.php
│ ├── sample.html
│ └── services
│ └── validate.service.php
├── phpunit.xml
├── test
│ └── FormTest.php
└── vendor
├── autoload.php
├── composer
│ ├── autoload_classmap.php
│ ├── autoload_files.php
│ ├── autoload_namespaces.php
│ ├── autoload_psr4.php
│ ├── autoload_real.php
│ ├── ClassLoader.php
│ ├── installed.json
│ └── LICENSE
└── constants.php
" composer.json"目前包含以下内容:
{
"name": "testframework",
"require": {
"PHP": ">=5.6.17"
},
"autoload": {
"psr-4": {
"Config\\": "framework/config/",
"Classes\\": "framework/classes/",
"Models\\": "framework/models/"
},
"files": [
"vendor/constants.php"
]
}
}
每当我更改目录结构时,重命名类或修改" composer.json"我跑:
% composer validate (only when modifying "composer.json")
% composer dump-autoload -o
我的目标是从"类"," config"中自动加载所有类。和"模特" "框架内的文件夹&#34 ;; "的index.php"目前实现" framework / models / Base.php",如下所示。
<?php
require_once( dirname( __DIR__ ) . '/vendor/autoload.php' );
use Models\Base;
$derp = new BaseModel();
?>
我已经确认以上指向了正确的位置&amp;返回:&#34; /var/www/testproject/vendor/autoload.php"
Base.php包含以下脚本:
<?php namespace Models;
class BaseModel {
public $submitAction = null;
protected $complete;
public function __construct() {}
/**
* Expose
* Exposes the error code names for external processing.
*
* @return An array containing all error code names in this object.
*/
public static function Expose() {
$reflector = new ReflectionClass( 'ErrorCodes' );
return $reflector->getConstants();
}
}
我已经完成了我能想到的命名空间的每一个排列,一直在无休止地修改&#34; composer.json&#34;,根据文档添加和删除段,纯粹使用classmap(它没有工作,测试&#34; PSR-0&#34; (也没有工作),使用更大的锤子(也没有工作)。
显然,我做了某些事情可怕的错误,我似乎无法弄清楚是什么;任何人都可以看到我误入歧途的地方吗?
非常感谢, N00B
编辑:巨大的疏忽,&#34;供应商/作曲家&#34;目录包含有关Composer自动加载的以下内容。
&#34; autoload_classmap.php&#34;:
<?php
// autoload_classmap.php @generated by Composer
$vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname($vendorDir);
return array(
'Models\\BaseModel' => $baseDir . '/framework/models/Base.php',
);
&#34; autoload_files.php&#34;:
<?php
// autoload_files.php @generated by Composer
$vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname($vendorDir);
return array(
'a9da57e70f975fe4a3c7dad63939dcd8' => $vendorDir . '/constants.php',
);
和&#34; autoload_psr4.php&#34;:
<?php
// autoload_psr4.php @generated by Composer
$vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname($vendorDir);
return array(
'Models\\' => array($baseDir . '/framework/models'),
'Config\\' => array($baseDir . '/framework/config'),
'Classes\\' => array($baseDir . '/framework/classes'),
);
我所看到的错误来自PHP:
致命错误:Class&#39; BaseModel&#39;找不到 第8行的/var/www/testproject/framework/index.php
来自PHPUnit:
用户%phpunit Sebastian Bergmann的PHPUnit 4.2.6。
从/var/www/testproject/phpunit.xml读取配置
PHP致命错误:Class&#39; BaseModel&#39;找不到 第6行的/var/www/testproject/test/FormTest.php
答案 0 :(得分:2)
在您的index.php
中,您没有导入正确的课程:
use Models\Base;
$derp = new BaseModel();
您应该导入Models\BaseModel
类:
use Models\BaseModel;
$derp = new BaseModel();
此外,文件名应与类名匹配。 BaseModel
类应位于framework/models/BaseModel.php
文件中,而不是framework/models/Base.php
。
请注意,您不需要在开发期间优化自动加载器(这就是-o标志正在执行的操作)。仅在生产中使用它,否则每次添加新类时都必须转储自动加载器。
有关自动加载标准的更多信息,请参阅此处: