所以我有一个想法,但我认为在做一些愚蠢的事情之前我需要通过StackOverflow来运行它。
我希望有一个类名称的关联数组=>文件路径。如果PHP遇到了未定义类的致命错误,它将检查我的数组中是否存在该键,然后require_once该类。这样可以防止不必要的批量加载可能永远不会使用的类。
不好主意?
答案 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关键字那样,父类运行时也会抛出自动加载器,所以你不需要预先加载接口和类等。
希望这会对你有所帮助。
注意: 所有提供的代码都是未经测试和编写的,仅供参考。我建议您在完成任何实施之前更详细地研究这些技术。