【发布时间】:2013-07-22 19:41:51
【问题描述】:
我一直在尝试使用自动加载器类目录映射技术,这有点困难。我设法提出了一个相当简单的解决方案(表面上),但我完全不知道它是否有效,而其他“更明显”的解决方案却失败了。下面是一些代码 sn-ps 说明了我的困惑。
这是工作代码:
<?php
spl_autoload_register('my_autoloader');
function my_autoloader($class) {
$classMap = array(
'classes/',
'classes/sites/',
'classes/data/'
);
foreach ($classMap as $location) {
if (!@include_once($location . $class . '.php')) { // @ SUPPRESSES include_once WARNINGS
// CLASS DOESN'T EXIST IN THIS DIRECTORY
continue;
} else {
// CLASS IS AUTO-LOADED
break;
}
}
}
?>
这是一个我觉得应该工作的sn-p,但没有:
<?php
spl_autoload_register('my_autoloader');
function my_autoloader($class) {
$classMap = array(
'classes/',
'classes/sites/',
'classes/data/'
);
foreach ($classMap as $location) {
if (file_exists($location . $class . '.php')) {
require_once ($location . $class . '.php');
}
}
}
?>
后者对我来说更有意义,因为虽然这两个版本都有效:
<?php
spl_autoload_register('my_autoloader');
function my_autoloader($class) {
require_once ('classes/sites/' . $class . '.php');
}
?>
<?php
spl_autoload_register('my_autoloader');
function my_autoloader($class) {
$location = 'classes/sites/';
require_once ($location . $class . '.php');
}
?>
这个抛出“没有这样的文件或目录...”(注意路径中缺少“sites/”。
<?php
spl_autoload_register('my_autoloader');
function my_autoloader($class) {
require_once ('classes/' . $class . '.php');
}
?>
“没有这样的文件或目录...”错误让我觉得我可以简单地检查一个类的支持文件,如果 (file_exists()) {require_once();休息;}否则{继续;}
为什么这不起作用?而且,为什么第一个 sn-p 有效?支持路径/文件从未明确包含或要求。
【问题讨论】:
-
是你include_paths中classes路径的父目录吗?
-
包含支持文件,只是合并到if语句中: if (!@include_once($location . $class . '.php'))
-
是的,我有点想,john500,但希望得到确认,所以谢谢你。不过,这感觉像是一种非常草率的方式来实现我所需要的,所以这只会让我更加渴望改进解决方案。 Orangepill,我不知道该怎么做...我已经有一段时间没有使用 PHP 了,当我上次使用 PHP 时,我的编程能力还没有现在的一半...所以我基本上是在 PHP 上尝试做一些我已经知道如何在 Java 和 ColdFusion 中做的事情;)。
-
抱歉,我失去了编辑最后一篇文章的能力,而且它有太多绒毛...... Orangepill,我应该说,我不确定如何利用 include_path 来解决这个问题,但我肯定认为我错误地引用了 /classes 目录。它不在根目录下,而我正在处理的站点位于子目录中,我有点/有点认为我没有以编程方式构建正确的路径。
标签: php spl-autoloader