PHP - 如何在__autoload()函数中使用变量

时间:2010-08-04 06:02:28

标签: php scope autoload

我使用的自动加载功能如下: -

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数组传递给自动加载功能。这可能吗?

3 个答案:

答案 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');

如果似乎没有意义用变量定义常量,那么,如果该变量来自方法的参数,则确实如此。在我的情况下,所有代码都在另一个方法中。