【问题标题】:PHP autoload oddityPHP自动加载奇怪
【发布时间】:2011-05-01 22:38:22
【问题描述】:
function __autoload($class_name) {
    echo("Attempting autoload ");
    if (substr($class_name, -6) == "Mapper") {
        $file = 'mappers/'.$class_name.'.php';
        echo "Will autoload $file ";
        include_once($file);
    }
}
__autoload("UserMapper");
$user = new UserMapper($adapter);

die("done");

结果: 尝试自动加载将自动加载映射器/UserMapper.php 完成

function __autoload($class_name) {
    echo("Attempting autoload ");
    if (substr($class_name, -6) == "Mapper") {
        $file = 'mappers/'.$class_name.'.php';
        echo "Will autoload $file ";
        include_once($file);
    }
}
//__autoload("UserMapper");
$user = new UserMapper($adapter);

die("done");

(我刚刚注释掉了对 __autoload() 的手动调用...)

结果: 致命错误:在第 13 行的 C:\Program Files\EasyPHP-5.3.5.0\www\proj\29letters\login.php 中找不到类“UserMapper”

有什么想法吗? 是的,我正在运行 PHP 5.3.5

【问题讨论】:

  • 您是否在 CLI 交互模式下运行?
  • 我能想到的可能是在其他地方声明了其他一些 __autoload 函数,但我认为这应该会产生某种错误,以通知您您正在尝试重新声明 __autoload .代码中没有任何内容可以解释为什么它根本不会输出任何东西,它至少应该输出“尝试自动加载”。
  • phpinfo 说:“服务器 API:Apache 2.0 句柄”。据我所知,这不是 CLI。我也不认为其他地方有自动加载功能,因为我能够定义它并手动调用它,而且它主要是我的代码。这很奇怪,但我没有太多精力去调查,spl_autoload_register 对我来说效果很好!

标签: php autoload


【解决方案1】:

不知道为什么您的示例不起作用,因为它应该按照手册。

你试过用spl_autoload_register注册自动加载功能吗?

【讨论】:

【解决方案2】:

您是否设置了正确的include_path?您正在使用相对路径来包含类的文件。请尝试使用绝对路径。

$dir  = __DIR__ . '/../path/to/mappers';
$file = $dir . '/' . $class_name . '.php';
require $file;

// do this outside of __autoload
set_include_path(get_include_path() . PATH_SEPARATOR . __DIR__ . '/../path/to/mappers';

// inside __autoload
$file = $class_name . '.php';
require $file;

【讨论】:

  • 我使用的是相对于根文件的路径。同样的路径适用于 include() 和 require()。 __autload() 是否以不同的方式读取路径?
  • __DIR__ 表示定义它的文件的路径。
  • 我猜 __autoload 将使用定义函数的路径。但不确定。
  • 它没有在任何函数中定义。根文件是 admin.php,其中包括 login.php。两个文件都在同一个目录中,并且路径是相对于该目录的。
  • 我的意思是__autoload函数。
猜你喜欢
  • 2012-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-14
  • 1970-01-01
相关资源
最近更新 更多