嵌套输出缓冲与外部类依赖[请帮助]

时间:2010-08-18 18:58:26

标签: php output-buffering

提前感谢任何建议。

我有一个文件(内容文件),其中创建了一个数组:

$config['plugins']['BannerRotate'] = array(
    'container'    =>    'abroadView',
    'arrows'    =>    true,
    'auto'        =>    true,
    'speed'        =>    '15000',
    'width'        =>    '300px',
    'height'    =>    '220px',
    'tags'      =>    'slider'
);

反过来又被所谓的“模板系统”拾取,并且使用页面(和那个数组)作为参数(非常标准)来呈现布局。

然后模板系统使用该数组生成一个新对象,如下所示:

if(isset($GLOBALS['config']['plugins'])){
    foreach($GLOBALS['config']['plugins'] as $plugin => $ary){
        $$plugin = new Ispweb_Plugindaemon(CURRENTSRV,getcwd().'/',
        $GLOBALS['config']['plugins'][$plugin],$plugin);
        // this statement is simply the result of the eval statement below
    }
}

那么,因为在这种情况下插件的名称是BannerRotate,所以对象是$ BannerRotate(变量变量)。我这样做,所以每页可以有多个插件对象。然后使用该对象使用成员函数$ BannerRotate-> getJS()来调用jQuery插件。这些成员函数调用位于模板系统中(重要)。

如果我在与初始数组[OUTSIDE THE TEMPLATING SYSTEM]相同的文件中调用成员函数(我正在缓冲的文件,以便首先创建对象),一切都会死掉。这对我没有意义,因为如果我var_dump($ BannerRotate),我会得到一个完整的对象。但是,在那个内容文件中我说$ BannerRotate-> printNoscript(),一切都消失了,永远不会创建对象。然后我得到一个致命的错误,我正在调用非对象的成员函数。这就是问题。

以下是我在模板系统中进行缓冲内容文件(并创建对象)的内容:

ob_start();
include $core_page_content; // the content file (where initial array is)
if(isset($GLOBALS['config']['plugins'])){
    foreach($GLOBALS['config']['plugins'] as $plugin => $ary){
        $ins[] = $plugin;
    }
}
$t = ob_get_contents();
ob_end_clean();
foreach($ins as $in){
    $a = CURRENTSRV; // a,b,c,d are just making the eval statement more clean
    $b = getcwd().'/';
    $c = array();
    foreach($GLOBALS['config']['plugins'][$in] as $key => $value){
        $c[$key] = $value;
    }
    $d = $in;
    eval("\$$in = new Ispweb_Plugindaemon(\"$a\",\"$b\",\$c,\"$d\");");
    echo $$in;
}
include $core_page_content;
$page_content = ob_get_contents();
ob_end_clean();

有没有人知道为什么我可以访问该对象,除非我在同一个文件中调用它的一个成员函数?

我该怎么办?

P.S。我知道设置不理想。我无能为力。

谢谢!

TL; DR 我正在文件A中创建一个对象,其中包含来自文件B的变量。我缓冲文件B以获取要提供给文件A的参数,创建对象,打印它进入另一个缓冲区并在该缓冲区中包含文件B.如果文件B对可能创建的对象进行了函数调用,则会出现致命错误:调用非对象的成员函数。

附加说明:

档案B:

$config['plugins']['BannerRotate'] = array(
    'container'    =>    'abroadView',
    'arrows'       =>    true
);
// page content (XHTML)

档案A:

ob_start();
$core_page_content = 'file_b';
include $core_page_content;
if(isset($config['plugins'])){
foreach($config['plugins'] as $plugin => $ary){
    $ins[] = $plugin;
}
ob_end_clean();
foreach($ins as $in){
    $$in = new Ispweb_Plugindaemon(CURRENTSRV,getcwd().'/',$config['plugins'][$in],$in);
}
include $core_page_content;
$page_content = ob_get_contents();
ob_end_clean();

// later on in the file
include 'top.htm';
include $page_content;
include 'bot.htm';

1 个答案:

答案 0 :(得分:0)

问题是variable scope.