我使用的框架(Zend)有一个自动加载器构建它。我认为这个自动加载器负责加载,不仅是Zend本身,还有开发人员可能添加到项目中的任何其他库。
框架是否正常使用自动加载器?任何没有?
拥有自动加载器是否必要?
答案 0 :(得分:4)
ZF's Autoloader只会加载ZF的类。它可以(并且应该)配置为加载自定义类,您还可以从其他框架添加其他Autoloader。除了PSR-0 autoloader之外,ZF 2还将有一个类图自动加载器。请参阅Blog Post by ZF's Matthew Weier O'Phinney on Autoloading Benchmarks
是的,拥有自动加载器很常见,因为您不希望代码中出现require语句。但这并不是绝对必要的。实现自动加载的本地方式是使用spl_autoload_register
。
答案 1 :(得分:2)
不是没有必要,但非常方便。您不需要大量的includes
或requires
,只有当您需要它所包含的类时才会加载单位。这也可以帮助您构建代码,因为不正确的命名会导致自动加载器失败。
答案 2 :(得分:2)
许多框架都有自动加载器,其中一个不是 CodeIgniter ,您必须指定要一直加载哪些类以及要在控制器/模型/视图中加载哪些类/ libraries。
这不是完全必要的,但它很好,因为它通常强制执行文件结构,您也不必担心记住在脚本顶部包含文件。
<强> [编辑] 强>
我的CodeIgniter
声明显然需要澄清。是的,有一个auto_load
位置,允许您指定要在每个脚本开头自动加载的库/模块,是的,有一个加载程序库,但它们与真正的自动加载器不同。
您必须在开始时指定您想要的那些,在您使用自定义
之前,它不知道您要加载Pizza_Store模型$this->load->model->('foo');
相当于
include 'application/models/foo.php';
$this->Foo = new foo();
但实际上只需要调用$this->foo = new Models_Foo();
和CodeIgniter就知道你的意思了,这就是使用自动加载器时会发生的情况。
[编辑零件代表]
现在代码中有__autoload
,spl_autoload
或spl_autoload_register
。这是因为它保持了PHP 4的兼容性。这就是构建框架的方式,如上所述,有一个错误的自动加载,但它为每个“自动加载”类执行此操作:
foreach($autoloaded_class as $type=>$class){
if(is_application_class($class)){
include "application/{$type}/{$class}.php";
}
elseif(is_core($class)){
include "core/{$type}/{$class}.php";
}
}
$array['Foo'] = new Foo();
$controller($array);
本质上是在呼唤:
包括'foo.php';
位于每个文件的顶部,无论您是否需要它。
答案 3 :(得分:2)
是,通常的做法在框架中包含自动加载器。
不,我没想到没有自动加载器的任何主要框架。
是的,如果您希望框架足够灵活,则有必要。它简化了模块/类的添加,只需将文件复制到正确的目录并从代码中调用它们即可。 Autoloader只包含适当的文件,而不是包含所有文件(即使目前不需要它们)。
此外,类自动加载的方式可以由自动加载器机制完全确定,例如强制执行。正确的目录结构或强制事先声明可以自动加载的类/文件。
答案 4 :(得分:2)
正如其他成员所说,并非每个框架都有自动加载器,但我相信每个框架都应该。
如果您能理解框架的作用,那么您应该了解其设计为模块化,能够轻松添加和删除组件,如果您要对所有库模型,控制器等进行硬编码,那么在添加新库时你必须重新编码才能使用它。
这是自动加载器的便利部分,另一部分是性能和资源管理方面,自动加载器的基本思想是仅在需要时加载文件。
所以在你的index.php页面上你可能需要5个库,但是在你的register.php上你可能只需要2个库,所以使用自动加载器可以在你的注册页面上保存3个包含。
它还允许更好的文件结构,因为您的组件是分开和组织的。
因为您可能正在考虑将自动加载器放入您的框架中,我强烈建议您查看当前在Zend和许多其他高端框架中使用的 PSR-0 标准,链接可以在下面找到:
http://groups.google.com/group/php-standards/web/psr-0-final-proposal