【问题标题】:spl_autoload not loading (case sensitivity?)spl_autoload 未加载(区分大小写?)
【发布时间】:2012-12-31 03:35:01
【问题描述】:

我使用 ZF2 作为库。我有一个相当标准的spl_autoload_register 实现,如下所示:

set_include_path(join(PATH_SEPARATOR, array(
    get_include_path(),
    ROOT . DS . 'library',
    ROOT . DS . 'application',
)));

spl_autoload_register();

地点:

define('DS', DIRECTORY_SEPARATOR);
define('ROOT', dirname(dirname(__FILE__)));

在我的 Mac 上,一切正常。在我的 CentOS 服务器上,不。我唯一一次看到spl_autoload_register 不喜欢这样的问题是当我尝试使用 CamelCasing 等时。显然,情况并非如此。我正在尝试加载:

\Zend\Config\Config

现在,我的目录结构如下:

/application
    /controller
    /model
       /objects
       /dao
       /weeeeeeee 
    /view
      /template_html
/library
    /core
    /Zend
      /Config

你明白了。

那么,为什么这不起作用?

编辑:请告诉它不是在寻找 config.php 而不是 Config.php...

【问题讨论】:

  • spl_autoload_register() 的回调是什么样的?
  • @alex 我没有这样的回调。
  • 只是检查它。有什么理由用dirname() 包裹__FILE__ 两次?另外,您的 PHP 是否支持 __DIR__
  • 几年前我开始使用这段代码,所以我现在无法给出理由。我还没有检查 m PHP 是否支持 __DIR__ - 但是 - 它与我的其他库一起工作正常,而不是 Zend 的东西。
  • 您可以注册一个回调,并转储它传递的类名以及常量的串联,以确保不会出现问题。

标签: php zend-framework2 spl-autoload-register


【解决方案1】:

spl_autoload 区分大小写。所有类都映射到小写文件名。是的,这太疯狂了。 Google php bug #49625 和 #48129 的一些背景故事。

解决方案:

  1. 将所有包含的类重命名为小写,包括所有包含路径
  2. 编写更好的自动加载器来处理混合大小写路径
  3. 使用 Composer 的自动加载器。

重命名所有内容既不现实又愚蠢,我不想重新发明轮子,但我很幸运能够使用 Composer 的自动加载器加载自定义库。

Composer autoload reference

Composer 有一个 ZF2 package,但您可以通过将自动加载定义添加到您的 composer.json 文件来手动加载您的:

{
    "autoload": {
        "psr-0": {"Zend": "library/"}
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-01
    • 2013-03-06
    • 2020-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-03
    • 1970-01-01
    相关资源
    最近更新 更多