2

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

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

4

3 回答 3

4

我能想到的唯一方法是将类对象注册为自动加载处理程序(使用 spl_autoload_register)。您可以随时通过指定 array($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'));
于 2010-08-04T06:14:17.410 回答
0

您不调用 __autoload 函数,因此将参数传递给它没有意义。如果您想在其中保留某些状态(例如跟踪所有加载的类/时间或其他),您可以使用静态变量。

你能告诉我们更多关于你想做的逻辑吗?可能有更好的方法。

于 2010-08-04T09:59:41.347 回答
0

想法是,使用一个常数。至少努力解决我的问题。

当然,您只能为每个文件定义一次常量,并且您必须根据您的情况调整以下代码(即$dirto $viewClassMap)。

这就是我如何将另一个“参数”传递给自动加载:

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

如果用变量定义一个常量似乎没有意义,那么如果该变量来自方法的参数,它就有意义。在我的例子中,所有这些代码都在另一个方法中。

于 2014-01-23T13:33:49.510 回答