【问题标题】:PHP Autoloader and Unix Case-Sensitive File-SystemPHP 自动加载器和 Unix 区分大小写的文件系统
【发布时间】:2011-01-27 10:04:30
【问题描述】:

我有 index.php

<?php
    include('_controller/Autoloader.php');
    Gold_Autoloader::init();

    $mysql = new Gold_MySQL();

_controller/Autoloader.php

<?php
class Gold_Autoloader
{

    public static $loader;

    public static function init()
    {
        if (self::$loader == NULL)
            self::$loader = new self();

        return self::$loader;
    }

    public function __construct()
    {
        spl_autoload_register(array($this, 'controller'));
        spl_autoload_register(array($this, 'resources'));
    }

    public function resources($className)
    {
        $className = preg_replace('#Gold_#', '', $className);
        $className = preg_replace('#_#', DIRECTORY_SEPARATOR, $className);

        set_include_path(PROJECT_ROOT . '_resources');
        spl_autoload_extensions('.php');
        spl_autoload($className);
    }

    public function controller($className)
    {
        $className = preg_replace('#Gold_#', '', $className);
        $className = preg_replace('#_#', DIRECTORY_SEPARATOR, $className);

        set_include_path(PROJECT_ROOT . '_controller');
        spl_autoload_extensions('.php');
        spl_autoload($className);
    }
}

我有文件 _controller/MySQL.php 和 Gold_MySQL.class。 在 Windows 系统上,此代码正在运行,包括 MySQL.php,但在托管此代码时不起作用((

[Thu Jan 27 12:55:57 2011] [error] PHP Fatal error: Class 'Gold_MySQL' not found in /home/u91167/youd0main.com/www/index_.php on line 5

编辑

如何使 Unix 可以查看任何文件? Zend 没有小写字母的文件。

【问题讨论】:

  • 仅供参考,您对 DIRECTORY_SEPARATOR 的使用是多余的。包含文件时,Windows 仍将接受 Unix 分隔符,即。 C:/folder/MyClass.php 仍然有效。展开系统生成的路径时应使用 DIRECTORY_SEPARATOR,例如 $_SERVER['DOCUMENT_ROOT']。 ...我猜只是偏好。
  • 另外,你不需要使用 preg_replace,因为你实际上并没有使用任何正则表达式,切换到 str_replace 并且它仍然可以工作......只是快一点。

标签: php spl autoloader


【解决方案1】:

听起来您的文件名区分大小写,并且您尝试以错误的大小写加载文件。即您可能需要gold_mysql.php 而不是Gold_MySql.php

【讨论】:

    【解决方案2】:

    这听起来像是服务器文件系统的区分大小写的问题。 检查路径和文件名是否正确。

    linux/unix 注意大小写。 窗户没有。


    注意:这回答了之前版本的问题

    【讨论】:

    • 我想提问者知道这一点。问题是“如何让 Unix 可以查看任何文件?”,而不是“怎么了?”。
    • 你迟到了。我的回答来自 2011 年 1 月 27 日 - 由于我的回答,问题被修改了 4 次。 2011 年 1 月 29 日接受的答案是关于案例。
    • 你是绝对正确的。打扰一下。老版本确实问“怎么了”。
    【解决方案3】:

    可能是您覆盖了包含路径。在你的 index.php 中尝试类似

    <?php
    
    set_include_path(
        implode(PATH_SEPARATOR,
        array(
            realpath('./_controller'),
            realpath('./_resources'),
            get_include_path()
        ))
    );
    

    并删除 Autoloader 类中的 set_include_path() 调用。

    恕我直言,如果您使用 Zend Framework,最好编写两个分隔自动加载器并将它们推送到 Zend 的自动加载器堆栈。

    【讨论】:

      猜你喜欢
      • 2020-01-16
      • 1970-01-01
      • 2012-03-24
      • 2020-03-09
      • 1970-01-01
      • 2016-02-15
      • 1970-01-01
      • 2010-11-20
      • 1970-01-01
      相关资源
      最近更新 更多