- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
跟进 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/
我正在使用 Amazon Payments PHP SDK,并且 __autoload() 在浏览器中工作正常,但当我切换到 CLI 脚本时,它似乎没有调用该函数。 我得到的只是“PHP fatal
我有一个脚本使用 autoload 来加载找不到的类。我没有故意包含该文件(尽管我可以),但我希望自动加载功能包含所需的文件。 因为脚本可以递归,也就是说,如果类已经加载,我不想在脚本的每次递归时检查
我开始使用 PHP __autoload 函数,现在我遇到了那些奇怪的 fatal error :无法重新声明类 xxx 错误。 这很奇怪,因为这些错误发生在我什至没有使用自动加载功能加载的类上。我还
在main.php中,添加了自动加载并创建了一个新对象: function __autoload($class) { require_once($class . '.php'); } ...
随着我们的 PHP5 OO 应用程序的增长(大小和流量),我们决定重新审视 __autoload() 策略。 我们总是根据文件包含的类定义来命名文件,因此类 Customer 将包含在 Custome
我今天发现了 __autoload 函数,在阅读了该函数的官方手册页后,有一点我完全不明白。 使用 __autoload() 和 require_once 之间有什么明显的区别? 因为它看起来自动加载
介绍 对于php性能问题,议论最多的就是__autoload()方法,很多人提到这个方法非常影响性能。还有人说opcode也能影响到__autoload()方法,所以针对这两点我做了个
我正在尝试自动加载不同文件夹中的类。这可能吗? function __autoload($class){ require $class.'.php';
跟进 question ,似乎只需使用下面的 __autoload 代码就可以解决重复问题, function __autoload($class_name) { include AP_SIT
我在我的脚本中使用 __autoload 来根据需要包含类。我的脚本使用类名中的提示来查找包含它的文件。如果它以模型结尾,它在模型目录中, Controller 在 Controller 目录中,等等
所以,我有 xampp。我在 ZendServer 上测试了这段代码,结果相同。 在 php.exe -a index.php 之后我有这个: Interactive mode enabled Fa
你好,除了我们可以使用自己的名字自动加载外,使用这个有什么不同吗?有什么性能差异吗?他们如何在内部运作? 之间 function __autoload_libraries($class){ i
我正在通过 __autoload特点 PHP提供。 然而这是index.php我有:- define('app_path', realpath('../')); $paths = array(
我正在学习 PRO PHP AND JQUERY 书中的一些示例,但由于某些原因这些示例不起作用。即使是我从图书站点下载的示例也不起作用。不知道哪里出了问题,因为我完全按照书上的那样做了.. /pub
我是 php 的新手,我想在我的代码中使用 php5 的 __autoload 功能。我在 index.php 中写了下面的代码,但我不明白应该如何以及何时调用 __autoload 函数。 func
如何让 PHPUnit 遵守 __autoload 函数? 例如我有这三个文件: 加载器.php function __autoload($name) { echo "foo\n";
抱歉,如果这是基本的,我正在尝试尽可能多地了解 PHP 中的 OO,并且我正在慢慢学习如何使用它(非常有限)。 所以我想知道 __autoload() 是否对 PHP 操作码缓存有任何影响? 最佳答案
根据 http://php.net/manual/en/language.oop5.autoload.php魔法函数 __autoload() 从 PHP 7.2.0 开始被弃用,从 PHP 8.0.
这个问题在这里已经有了答案: How to use spl_autoload() instead of __autoload() (1 个回答) 关闭去年。 我在实时服务器上遇到 PHP 错误。我相
我创建了一个名为 class_one 的类带命名空间 MyClassOne如下。 class_one.php namespace MyClassOne; class class_one { f
我是一名优秀的程序员,十分优秀!