PHP中基于异常的类加载

时间:2010-09-10 18:45:54

标签: php class

所以我有一个想法,但我认为在做一些愚蠢的事情之前我需要通过StackOverflow来运行它。

我希望有一个类名称的关联数组=>文件路径。如果PHP遇到了未定义类的致命错误,它将检查我的数组中是否存在该键,然后require_once该类。这样可以防止不必要的批量加载可能永远不会使用的类。

不好主意?

5 个答案:

答案 0 :(得分:4)

如何尝试内置autoloading的PHP。

答案 1 :(得分:1)

如果您使用的是PHP5,则可以使用__autoload()

使您的代码更易于管理,虽然性能方面,但这是一个糟糕的选择。但除非我正在建立Facebook,否则我不会担心。

答案 2 :(得分:1)

你要做的事情已经由php __autoload函数处理了。你可以在这里阅读所有相关内容:http://php.net/manual/en/language.oop5.autoload.php

所以,根本不是一个坏主意;)

答案 3 :(得分:1)

自动加载是正确的方法,但是spl_autoload_register比__autoload更简洁,因为它允许多个自动加载器。函数__autoload AFAIK在调用spl_autoload_register时也会停止工作,除非__autoload也被注册。

您可以编写自己的自动加载或使用现有的自动加载。例如,Zend Framework有一个使用约定的自动加载器(Foo_Bar在Foo / Bar.php中)。 Nette Framework具有RobotLoader,它可以为您的类编制索引并在必要时使用索引。但是,除非您使用框架中的其他内容,否则它可能太大了。

请参阅:http://www.php.net/manual/en/function.spl-autoload-register.php

答案 4 :(得分:1)

你应该使用带有指定clas名称结构的自动加载,这是一个例子

类名应该只对alpha_不区分大小写。

让我们采用这个目录结构和文件

/classes/class.php
/classes/input/input.php
/classes/output/output.php
/classes/regex/regex.php
/classes/interface/parser/interface_parser.php
/classes/parser/parser.php
/classes/parser/xml/parser_xml.php
/classes/parser/html/parser_html.php

具有这样的结构是好的,因为它鼓励你在OOP时更好地编码。

现在,如果我们看一下/classes/parser/html/html_parser.php文件:

class Parser_Html extends Parser implements Interface_Parser
{
    //looks nice in here
}

通常你必须确保加载了接口和扩展类,但如果它们还没有加载,它们也会被自动加载。

为此创建自动加载系统并不复杂,只有1个功能。

function __autoload($name)
{
    //Classes
    $parts = explode('_',strtolower($name));

    $path = '/classes/';
    foreach($parts as $p)
    {
        $path .= $p;
    }
    $path .= '/' . $name . '.php';

    if(file_exists($path))
    {
        require_once $path;
    }
}

所以不要先包含类文件,而是先运行类启动。

$HtmlParser = new Parser_Html();

由于文件尚未包含,__ autoload是使用类名的参数运行的,因此自动加载会查找与类名相关的目录以尝试加载它。

同样如你在上面显示的类文件中使用extend关键字那样,父类运行时也会抛出自动加载器,所以你不需要预先加载接口和类等。

希望这会对你有所帮助。

注意: 所有提供的代码都是未经测试和编写的,仅供参考。我建议您在完成任何实施之前更详细地研究这些技术。