提前感谢任何建议。
我有一个文件(内容文件),其中创建了一个数组:
$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';