加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php – __autoload的最佳解决方案

发布时间:2020-12-13 14:07:49 所属栏目:PHP教程 来源:网络整理
导读:随着我们的 PHP5 OO应用程序的增长(大小和流量),我们决定重新访问__autoload()策略. 我们总是通过它包含的类定义来命名文件,所以Class Customer将包含在Customer.php中.我们曾经列出可能存在文件的目录,直到找到正确的.php文件. 这是非常低效的,因为您可能会
随着我们的 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();

?>

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

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读