php – __autoload的最佳解决方案

前端之家收集整理的这篇文章主要介绍了php – __autoload的最佳解决方案前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
随着我们的 PHP5 OO应用程序的增长(大小和流量),我们决定重新访问__autoload()策略.

我们总是通过它包含的类定义来命名文件,所以Class Customer将包含在Customer.PHP中.我们曾经列出可能存在文件的目录,直到找到正确的.PHP文件.

这是非常低效的,因为您可能会经历一些您不需要的目录,并且在每个请求(因此调用stat())的情况下执行此操作.

我想到的解决方

– 使用命名规则来指定目录名称(类似于PEAR).缺点:不会太大,造成可怕的班级名称.

使用某种预先构建的阵列阵列(推动它的__autoload).缺点:需要在任何部署新代码之前进行重建.

在“飞行”中建立数组并缓存它.这似乎是最好的解决方案,因为它允许你想要的任何类名和目录结构,并且完全灵活的新的文件只是被添加到列表中.关心的是:在哪里存储它以及删除/移动的文件.对于存储,我们选择了APC,因为它没有磁盘I / O开销.关于文件删除,没关系,因为你可能不想要任何地方要求他们.至于移动…这是未解决的(我们忽视它在历史上并没有发生很多次我们).

任何其他解决方案?

我也一直在玩autoload一段时间,最后我实现了一些命名空间的自动装载机(是的,它也适用于PHP5.2).

策略很简单:
首先我有一个单例类(loader),它有一个模拟导入的调用.此调用需要一个参数(要加载的完整类名称),并在内部计算其调用文件名(使用debug_backtrace()).该调用将此信息存储在关联数组中以便稍后使用(使用调用文件作为关键字,以及每个键的导入类列表).

典型代码如下:

<?PHP

    loader::import('foo::bar::SomeClass');
    loader::import('foo::bar::OtherClass');

    $sc = new SomeClass();

?>

自动加载被触发时,存储在数组中的完整类名被转换为真正的文件系统位置(双冒号被目录分隔符替换),并且包含生成文件名.

我知道这不是你要求的,但它可能会解决目录遍历问题,因为加载程序直接知道文件在哪里(附加的功能,你可以让你的类组织在目录中,没有明显的性能罚款).

我可以为您提供一些工作示例,但是我很害羞地向公众显示我的肮脏的代码.希望以上解释是有用的…

猜你在找的PHP相关文章