在PHP中动态加载类时遇到问题

时间:2010-10-29 02:33:29

标签: php class zend-framework

这是类加载器的样子:

loader.php

class Load
{
    public static function init($class)
    {
        require_once 'classes/' . $class . '.php';
        return new $class();
    }
}

$class = Load::init('MyClass');

返回的错误是:

Fatal error:  Class 'MyClass' not found in /www/website/application/models/Database/loader.php on line 5

如果我将echo 'WORKS';放入MyClass.php,我可以看到它没有包含在内。 echo不执行。

更新:我似乎一直在编辑代码的缓存版本,而不是实际的文件......代码可以运行:}

4 个答案:

答案 0 :(得分:2)

试试这个。

function __autoload($class_name) {
    include $class_name . '.php';
}

将其放在任何可公开访问其余代码的位置。那时,当你做这样的事情时。

$class = new Foobar();

如果该类尚未包含在内,php将运行该__autoload函数并为您包含该文件。确保将include语句指向存储类的任何位置。

有关详细信息,请查看此处的php文档。

http://php.net/manual/en/language.oop5.autoload.php

答案 1 :(得分:0)

classes/MyClass.php是否包含MyClass的类定义?

我假设require能够在包含路径中找到classes/MyClass.php,但它是否正在加载正确的文件?

答案 2 :(得分:0)

可能是几件事......

  • classes/的文件系统路径是什么?它在你的包含路径上吗?如果没有,则需要使用绝对路径。

  • 如果你在* nix上,大多数都使用区分大小写的文件系统 - 你的文件是MyClass.php还是myclass.php

答案 3 :(得分:0)

三个提示:

  1. 如果您使用Zend Framework,则应使用Zend_Autoloader或子类Zend的自动加载器之一。要使用Zend Autoloader,您需要配置自动加载器命名空间,例如在application.ini中根据PEAR(Zend)命名约定命名/放置文件。
  2. 您应该使用绝对路径,因为相对路径可能会有所不同并指向其他资源,例如: APPLICATION_PATH . '/../your/path'
  3. 检查文件权限/所有权