gpt4 book ai didi

php - 自动检测类的 Autoloader 的问题

转载 作者:行者123 更新时间:2023-12-04 05:29:05 27 4
gpt4 key购买 nike

我目前正在用 PHP 对我的框架进行编程(主要是出于教育原因,也是一种打发时间的方式)。我编写了一个自动加载器,它会自动扫描目录树并检测其中的所有类,并按以下格式创建一个数组:

Array(
'MyAwesomeClass' => 'path/to/file/in/some/subdirectory/MyAwesomeClass.php',
'MyOtherAwesomeClass' => 'path/to/file/MyOtherAwesomeClass.php'
// ....
);

起初这是非常整洁的。因为我不需要担心我把课放在哪里。

但后来我发现这是非常资源密集型的。所以我创建了一个缓存机制,并将索引序列化并保存到一个文件中。这将 PHP 脚本的响应时间减少了至少 50%。但它带来了一些问题。

在框架中的其他类中,我经常使用以下内容:
class_exists('MyAwesomeClassController');

问题是如果我添加了新类 MyAwesomeClassController该类(class)尚未在索引中,并且 class_exists返回假。现在的问题是我每次向框架添加新类时都必须删除缓存文件(让自动加载器再次重新创建索引)。

我尝试过的另一件事(有点hacky):
在 Autoloader 类中,我检查了是否使用 class_exists() 调用了自动加载方法。如果是这种情况,我会重新创建索引以查看是否可以在某处找到请求的类。但这似乎并不奏效,因为有时 class_exists使用一个通常不存在的类来调用,所以这与在每个请求上重新创建索引基本上是相同的解决方案。

任何解决方案?还是我必须完全重写我的自动加载器?

最佳答案

我前段时间走这条路,得出了同样的结论:资源密集型。您实际上在这里做的是构建某种链接器。

我切换到命名空间和 map 的组合。我将一个命名空间映射到一个文件夹,当调用自动加载器时,它会剥离命名空间,查找相应的文件夹,并包含该文件。

我的 map 看起来像这样(我选择 xml 作为格式):

<?xml version="1.0" encoding="UTF-8"?>
<autoloader>
<namespace id="Ganymedes\Core">/system/core</namespace>
<namespace id="Ganymedes\Core\Debug">/system/core/debug</namespace>
</autoloader>

和类加载器:
  public function ClassLoader( $class )
{
if( class_exists( $class, false ))
return true;

$classparts = explode( '\\', $class );
$classfile = '/' . strtolower( array_pop( $classparts )) . '.php';
$namespace = implode( '\\', $classparts );

if( isset( $this->namespaces[$namespace] )) {
foreach ( $this->namespaces[$namespace] as $path )
if( is_readable( $path . $classfile ))
include_once $path . $classfile;

return true;
}

return false;
}

关于php - 自动检测类的 Autoloader 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12859687/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com