我使用的自动加载功能如下: -
function __autoload($moduleName)
{
//Logic to check file existence- include if exists else redirect to fallback page
}
不接受任何其他论点吗?我想根据自动加载功能中的一些变量执行一些逻辑。如何在不使用全局变量的情况下完成?
由于
其他详细信息
我认为这在__autoload()类中是不可能的,但仍然试图用一个例子来解释。
我有一个modules.config文件,它有一个数组: -
$viewClassMap = array('search_classes' => 'commonClassListings',
'search_packs' => 'commonPackListings',
);
上述数组意味着在search_classes视图的情况下必须包含类commonClassListings,在search_packs视图的情况下必须包含类commonPackListings。对于所有其他视图,默认情况下,将包含commonDisplay类
function __autoload($viewName,$viewClassMap)
{
if(in_array($viewName,$viewClassMap))
{
$viewTobeIncluded = $viewClassMap[$viewName];
include path/to/$viewTobeIncluded;
}
else
{
include path/to/commonDisplay;
}
}
现在,我认为必须移出__autoload函数中的逻辑,首先必须计算要加载的视图,然后才能调用自动加载。这也是自动加载的目的(包括其对象被启动的类文件)。
更新
我的自动加载功能不在视图类中,我将在运行时启动它的对象(与Blizz的示例不同)。我有一个常见的自动加载功能,在pageLoader.php文件中定义,该文件包含在公共froncontroller中。对于每个模块,视图类都像
一样初始化$view = new search_classes();
然后常见的自动加载函数必须检查相应的父视图类(在这种情况下是commonClassListings)是否存在,如果是这样,则包括它和search_classes视图本身并将对象包含在内,否则回退。为此,我需要将$viewClassMap
数组传递给自动加载功能。这可能吗?
答案 0 :(得分:3)
我能想到的唯一方法是将一个类对象注册为自动加载处理程序(使用spl_autoload_register)。您可以通过指定数组($ oInstance,“functionName”)作为回调来随时注册实例。
在执行将触发自动加载的操作之前,您可以在该类实例上设置变量。
编辑: 根据您的要求,这是一个很好的例子。 请注意,我通常在自动加载的类中使用静态方法,所以我不知道它是否适用于实例,但我检查了文档,它应该。如果它不起作用,你可以使函数和数组静态
class Test
{
public $viewClassMap = array('search_classes' => 'commonClassListings',
'search_packs' => 'commonPackListings',
);
public function autoload($viewName)
{
if (in_array($viewName,$this->viewClassMap))
...
}
}
$test = new Test;
spl_autoload_register(array($test, 'autoload'));
答案 1 :(得分:0)
您没有调用__autoload函数,因此将参数传递给它是没有意义的。如果要在其中保留某些状态(例如,跟踪所有已加载的类/时序或其他内容),则可以使用静态变量。
您能告诉我们更多关于您想要做的逻辑吗?可能有更好的方法。
答案 2 :(得分:0)
意思是,使用常数。至少努力解决我的问题。
当然,您只能为每个文件定义一次常量,并且您必须根据您的情况调整以下代码(例如$dir
到$viewClassMap
)。
这就是我如何将另一个“param”传递给自动加载:
define('DIR',$dir);
function foo_autoload($class){
$packages=array('pack','pack2');
foreach($packages as $v){
if(file_exists(DIR.$v.'/'.$class.'.php')==true){
require(DIR.$v.'/'.$class.'.php');
break;
}
}
}
spl_autoload_register('foo_autoload');
如果似乎没有意义用变量定义常量,那么,如果该变量来自方法的参数,则确实如此。在我的情况下,所有代码都在另一个方法中。