gpt4 book ai didi

php - SPL 自动加载最佳实践

转载 作者:可可西里 更新时间:2023-11-01 13:59:02 25 4
gpt4 key购买 nike

在服务器端的 include_path 中,我有一个 pear 目录的引用,位于“/usr/share/pear/”中。在我的应用程序中,我包含来自公共(public)库的文件,这些文件位于“/usr/share/pear/library/”中,require_once“library/file.php”

我最近开始使用 spl 自动加载器,我注意到在加载器函数中您必须确定包含文件的逻辑。我这样做的第一种方法是尝试包含一个文件并用 @ 抑制它以查看它是否会失败,例如@include 'library/file.php' 但是我认为主要是因为我读了很多关于 @ 的坏习惯我决定通过分解 get_include_path 通过 PATH_SEPARATOR 并查看目录是否是我想要的目录,然后执行 file_exists 并包含它。

像这样:

function classLoader( $class ) {
$paths = explode( PATH_SEPARATOR, get_include_path() );
$file = SITE_PATH . 'classes' . DS . $class . '.Class.php';
if ( file_exists( $file) == false )
{
$exists = false;
foreach ( $paths as $path )
{
$tmp = $path . DS . 'library' . DS . 'classes' . DS . $class . '.Class.php';
if ( file_exists ( $tmp ) )
{
$exists = true;
$file = $tmp;
}
}
if ( !$exists ) { return false; }
}
include $file;
}

spl_autoload_register('classLoader');

我走错路线了吗?我应该刚刚完成 @include 业务还是我正在朝着正确的方向做?

最佳答案

有一件事 Habari project autoloader有趣的是将整个类文件列表缓存在内存中,这样它就不会在每次请求类时都对文件进行磁盘搜索。

本质上,您在 __autoload() 中声明了一个静态变量,它包含所有类文件的数组,由将导致它们加载的类索引。例如,代码将使用 Dir 或 glob() 生成此静态数组:

$class_files = array(
'user' => '/var/www/htdocs/system/classes/user.class.php',
);

然后您只需包含 $class_files[$class] 即可获得正确的文件。这很好而且很快,因为它一次从磁盘中获取目录,而不是在每次引用新类时生成列表或搜索特定文件名。 (您会惊讶于它产生的速度差异有多大。)

如果类名不是数组中的键,您可以抛出自定义异常或生成 stub /模拟类以返回。此外,如果您查看 Habari 系统自动加载器,您会看到 Habari 在自动加载的类中实现了 __static(),这就像静态类的构造函数。

include_once() 是要避免的,如果您已经检查了要包含的文件,则 @ 运算符是不必要的。

关于php - SPL 自动加载最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1713820/

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