随着我们的
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(); ?>
当自动加载被触发时,存储在数组中的完整类名被转换为真正的文件系统位置(双冒号被目录分隔符替换),并且包含生成的文件名.
我知道这不是你要求的,但它可能会解决目录遍历问题,因为加载程序直接知道文件在哪里(附加的功能,你可以让你的类组织在目录中,没有明显的性能罚款).