我下面的第二个自动加载方法会有更好的性能吗?
<?php
// regular __autoload function
function __autoload( $name )
{
include( $class . '.php' );
}
// SPL autoload
spl_autoload_register("MyClass::Autoloader");
class MyClass
{
public static function Autoloader($class)
{
// list of classes and their location
$classes = array();
$classes['spooncookie'] = 'cookie/cookie.php';
$classes['spoondatabase'] = 'database/database.php';
$classes['spoondatagrid'] = 'datagrid/datagrid.php';
$classes['spoondatagridcolumn'] = 'datagrid/column.php';
$classes['ispoondatagridpaging'] = 'datagrid/paging.php';
// ....list of all the other class files.......
if(isset($classes[$class])){
include( $classes[$class] );
}
}
}
?>
答案 0 :(得分:1)
准确了解哪种方法可以为您自己的用途提供最佳性能的最佳方法是测试每种方法。作为一般规则,不同的自动加载方法在不同的场景中是最佳的,因素包括:总共有多少文件/类,目录结构有多深,以及每个请求平均加载多少个类。 使用自动加载器的关键不在于让您的代码运行得更快,而是为了提高您编写代码的速度。
对于生产代码,我真的建议从框架中使用一个使用良好的自动加载器,而不是自己动手,至少开始。如果你知道它的瓶颈并且可以改进它,那么可能稍后修改它。
作为旁注,你见过这个吗? http://weierophinney.net/matthew/archives/245-Autoloading-Benchmarks.html
编辑:
答案 1 :(得分:1)
除非您已将自动加载器(以及基础文件系统戳戳和刺激)识别为性能瓶颈,否则您真的不必担心它。 Profile, profile, profile!自动加载器可以成为真正的拖累,但通过实际对代码进行基准测试,您可能会在其他地方找到更大的性能提升。
说实话,我会去a PSR-0 compliant autoloader寻找一个新项目。
答案 2 :(得分:0)
我倾向于选择spl方法,理由是某些库(如Smarty)实现了spl自动加载器,因此使用__autoload方法可能会导致冲突。
函数内路径检查也是一个好主意,因为任何将文件拉入程序的函数都有潜在危险,尤其是在启用了allow_url_fopen的环境中!由于这些原因,我倾向于使用SPL功能完成路径检查。
我可能建议的一个优化是使路径数组保持静态。这应该消除每次调用函数时创建数组的开销(尽管实际上这样的开销应该非常小)