gpt4 book ai didi

php - 如何使用 __autoload 从多个目录加载类?

转载 作者:可可西里 更新时间:2023-11-01 00:25:36 24 4
gpt4 key购买 nike

跟进 question ,似乎只需使用下面的 __autoload 代码就可以解决重复问题,

function __autoload($class_name) 
{
include AP_SITE."classes_1/class_".$class_name.".php";
}

$connection = new database_pdo(DSN,DB_USER,DB_PASS);
var_dump($connection);

结果,

object(database_pdo)[1]
protected 'connection' =>
object(PDO)[2]

但这只能从一个目录加载类,其他目录呢?因为我将类分组在不同的目录中。所以如果我想从其他目录加载类,我会得到错误,

function __autoload($class_name) 
{
include AP_SITE."classes_1/class_".$class_name.".php";
include AP_SITE."classes_2/class_".$class_name.".php";
}

留言,

Warning: include(C:/wamp/www/art_on_your_doorstep_2011_MVC/global/applications/CART/classes_2/class_database_pdo.php) [function.include]: failed to open stream: No such file or directory in ...

指的是这一行 - include AP_SITE."classes_2/class_".$class_name.".php";

所以,我的问题是 - 如何使用 __autoload 从多个目录加载类?

可能的解决方案:

function autoload_class_multiple_directory($class_name) 
{

# List all the class directories in the array.
$array_paths = array(
'classes_1/',
'classes_2/'
);

# Count the total item in the array.
$total_paths = count($array_paths);

# Set the class file name.
$file_name = 'class_'.strtolower($class_name).'.php';

# Loop the array.
for ($i = 0; $i < $total_paths; $i++)
{
if(file_exists(AP_SITE.$array_paths[$i].$file_name))
{
include_once AP_SITE.$array_paths[$i].$file_name;
}
}
}

spl_autoload_register('autoload_class_multiple_directory');

最佳答案

您可以使用 spl_autoload_register 注册多个自动加载函数而不是单个 __autoload 函数。这是推荐的方式。

如果一个自动加载器能够加载文件,则不会调用堆栈中的下一个自动加载器。

然而,每个自动加载器应该只加载它所针对的类,因此您需要通过类名和/或使用 is_file 进行检查。按类名通常更好,因为如果您的应用程序增长,在文件系统上疯狂尝试会给系统带来压力。

为了不重复发明轮子,您甚至可以使用已经存在的自动加载器,它能够在文件名调用方面处理 PSR-0 标准。这些通常允许在基本目录上注册特定的 namespace 。在您的情况下,这意味着您必须根据 PSR-0 convention 重命名和组织文件。 .


快速解决方案(绑定(bind)到您的问题):

function __autoload($class_name) 
{
$file = sprintf('%sclasses_1/class_%s.php', AP_SITE, $class_name);
if (is_file($file))
{
include $file;
return;
}
$file = sprintf('%sclasses_2/class_%s.php', AP_SITE, $class_name);
if (is_file($file))
{
include $file;
return;
}
}

如您所见,已经有重复的代码(如您的)。所以这应该只是一个临时解决方案,因为您最终会为每个要测试的目录得到越来越多的重复行。如果您考虑更改设计,请考虑 PSR-0 shema,它有助于简化代码库,并且可以轻松地重用 PHP 世界中的其他现有组件。


function autoload_class_multiple_directory($class_name) 
{

# List all the class directories in the array.
$array_paths = array(
'classes_1/',
'classes_2/'
);

foreach($array_paths as $path)
{
$file = sprintf('%s%s/class_%s.php', AP_SITE, $path, $class_name);
if(is_file($file))
{
include_once $file;
}

}
}

spl_autoload_register('autoload_class_multiple_directory');

关于php - 如何使用 __autoload 从多个目录加载类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7713072/

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