2

使用自动装载机的一件坏事是,它不知道在哪里看。我的框架已经在大约 15 个不同的目录中有大约 70 个类。正因为如此,我没有去自动加载,而是在生成路径方面挣扎。所以我有一个关联路径数组,它给我从根文件到我想去的地方的路径。它有效,但它真的变得很痛苦。

首先,我的框架的用户很可能不知道类所在的位置。所以创建一个 FormViewController 已经很痛苦了,因为你需要包含它的路径。

一开始,我认为如果 PHP 在要自动加载文件时必须通过多个目录“搜索”文件,那会很好。所以呢?PHP是否应该这样做并为我们节省很多痛苦。但我怎样才能最有效地做到这一点?

我从全局上下文对象中得到了一个名为 $paths 的数组。路径可以以最合理的顺序在数组中定义:从最常用的路径开始。

我知道 PEAR 库有一个有趣的命名约定,例如 system_views_specialviews_SpecialView.php,它在 Autoloader 中转换为 system/views/specialviews/SpecialView.php ...但老实说,这太可怕了。不想像这样弄乱我的文件名。对于创建自己的类的开发人员来说,这会立即变得很糟糕。

在我为这项任务重新发明轮子之前,也许有人知道这个解决方案?

4

4 回答 4

1

注意:我假设您正在通过spl_autoload_register等创建自己的自定义自动加载器。

如果您正在创建一个自动加载器并且您要包含的类分布在 15 个不同的目录中,我看不出您如何希望避免使用某种形式的类名到目录路径映射,尽管这显然没有t需要与您引用的示例一样深。

简单来说,如果您将所有系统库保存在一个区域中,则可以进行快速案例匹配......

switch(true) {

    case substr($className, 0, 6) == 'System': { $libraryPath = 'xxx'; break; }
    ...
}

...应该是相当有效的方法,尽管它显然取决于您需要手动检查多少条路径。

此外,我假设您在尝试自动加载之前检查该类的存在?(即:您正在执行 class_exists($className) 以确保它尚未被包含在内。)同样,对此的要求取决于您重用对象的频率。

于 2009-12-31T16:41:26.610 回答
1

您可能想查看Nette Framework 的 RobotLoader

基本思想是它扫描您指定的目录,解析.phptoken_get_all)文件并找出哪个文件中有哪些类/接口。类/接口的位置被缓存,所以速度很快。Loader 已注册,spl_autoload_register()当 PHP 解释器找不到某个类时,它会调用 loader 的tryLoad()方法。

于 2009-12-31T16:49:43.343 回答
0

我确定您已经知道这一点,但以防万一,您可以编写一个__autoload()( API ) 函数,该函数将类名作为您的前端控制器(或它包含的任何文件)中的参数,根据任何搜索您的目录你想要的标准。一旦找到它,您所做的就是require_once正确的文件,或者如果类名无效则抛出异常。

根据您的描述,我没有得到任何迹象表明您正在这样做。听起来您只是在笨拙的全局数组中附加 PHP 的包含路径和值。

于 2009-12-31T16:41:49.760 回答
0

PHP 自动加载器可以满足您的所有需求。如果您有不同的位置,您只需为每个类路径创建几个自动加载器实例。

看起来它和上面提到的 RobotLoader 一样,除了第一次搜索是用一些智能完成的。与类名的 Levenshtein 距离较小的文件优先作为潜在的类定义。但这仅与没有索引的第一次搜索相关。

于 2010-01-10T23:52:05.890 回答