在我的Codeigniter项目中经历了设置作曲家的痛苦后,我把它放在:
require_once "./vendor/autoload.php";
进入我的index.php文件。将所有内容上传到服务器后,我收到错误消息,指出在main.php控制器中找不到MY_Mainconroller(位于application / core中)。由于一些奇怪的原因,作曲家自动加载会破坏我的CI。
我在config.php中使用此方法来自动加载我的客户控制器扩展程序:
function __autoload($class)
{
if(strpos($class, 'CI_') !== 0)
{
@include_once( APPPATH . 'core/'. $class . EXT );
}
}
之前完美无缺。关于为什么会发生这种情况的任何指示都非常感谢。
我修改了composer.json文件并添加了:
"autoload": {
"classmap": ["application/core"]
}
在CI论坛上提出了建议,但也没有解决问题......
答案 0 :(得分:0)
不确定发生了什么事,但我第一次尝试时似乎记得类似的东西。我现在总是把:
$vendor_path = './vendor/autoload.php';
if (file_exists($vendor_path))
{
require $vendor_path;
}
在我的index.php文件的最顶层,在其他任何地方之前,它总是顺利运行
答案 1 :(得分:0)
您只能拥有一个__autoload
功能,并且与使用spl_autoload_*
功能完全相同,就像documented in the PHP.net page一样。
提示 spl_autoload_register()为自动加载类提供了更灵活的替代方法。因此,不鼓励使用__autoload(),将来可能会弃用或删除。
来自http://php.net/spl_autoload_register
如果您的代码具有现有的__autoload()函数,则必须在__autoload堆栈上显式注册此函数。这是因为spl_autoload_register()将通过spl_autoload()或spl_autoload_call()有效地替换__autoload()函数的引擎缓存。
现在解决方案非常简单:使用Composer的自动加载功能。您所要做的就是在现有的composer.json
文件中添加新密钥“autoload”。如果您的代码符合PSR-0标准,则可能有效:
"autoload": {
"psr-0": {
"MY\\" : "application/core/"
}
}
这种变体在开发时是最省力的,因为可以立即找到新类。
否则,您可以使用类映射:
"autoload": {
"classmap": ["application/core/"]
}
这会强制您在每次添加新类或重命名时重新创建自动加载器,因为旧的类图将不知道在哪里找到它。
请注意,我发现您自己的自动加载功能有点奇怪。您说的是,对于每个不以其名称中的“CI_”开头的类,您都包含一个文件。在其名称的其他地方使用“CI_”的课程怎么样?无论是否可以在您的目录中找到,您都在大量尝试自动加载不以“CI_”开头的所有内容。正确的做法是只加载你知道自己负责的类,如下所示:
if(strpos($class, 'MY_') === 0) // starts with "MY_"
{
require_once( APPPATH . 'core/'. $class . EXT );
}
请注意,PSR-0标准定义了在不使用名称空间时,类名中的每个下划线都会转换为目录分隔符。因此,如果您的类名为“MY_foo”,则相对路径为“MY / foo.php”,即“application / core / MY / foo.php”。如果您目前有“application / core / MY_foo.php”,那将与PSR-0不兼容。
答案 2 :(得分:0)
修改composer.json后,您可能忘记运行'composer dump-autoload'。
以下是详细步骤。请注意我使用的是与Phil Sturgeon的博客完全相同的自动加载脚本,就像原始问题一样,当我添加Composer位时它就破了。
首先,从index.php(Phil Sturgeon位)中删除它:
function __autoload($class)
{
if(strpos($class, 'CI_') !== 0)
{
@include_once( APPPATH . 'core/'. $class . EXT );
}
}
然后,将以下内容添加到index.php,就在“LOAD THE BOOTSTRAP FILE”位之前。这是作曲家自动加载。
/*
* --------------------------------------------------------------------
* LOAD COMPOSER PACKAGES
* --------------------------------------------------------------------
*
*/
include_once './vendor/autoload.php';
将它添加到您的composer.json中。现在,composer将负责加载应用程序/核心文件夹中的文件。
"autoload": {
"classmap": ["application/core/"]
}
最后,这非常重要,在作曲家中转储自动加载。
composer dump-autoload
现在应该可以了。