好的,这就是我真正陷入困境的交易。
我将我的 cms 与设计模式一起使用。最后的最终输出在哪里(在设计模板的主文件中:'design.php'):
<div>{CONTENT_HEADER}</div>
<div style='float:left;width:25%'>{CONTENT_LEFT}</div>
<div style='float:left;width:50%'>{CONTENT_CENTER}</div>
<div style='float:left;width:25%'>{CONTENT_RIGHT}</div>
<div>{CONTENT_FOOTER}</div>
CONTENT_XXXX在哪里是生成器认为站点模块:
ob_start("gz_handler");
<....... LOAD ALL THE HEADER MODULES .......>
$output0 = ob_get_contents();
ob_end_clean();
ob_start("gz_handler");
<....... LOAD ALL THE LEFT SIDE MODULES .......>
$output1 = ob_get_contents();
ob_end_clean();
ob_start("gz_handler");
<....... LOAD ALL THE CENTER SIDE MODULES .......>
$output2 = ob_get_contents();
ob_end_clean();
ob_start("gz_handler");
<....... LOAD ALL THE RIGHT SIDE MODULES .......>
....
// That's I talk about, but this is just for static html, not variables
// Push to header finalizers to override default <title></title>
$header_finalizers_array['change_head_title_attr_to'] = $thread_data['topic_title'];
<....... END OF ALL THE RIGHT SIDE MODULES .......>
$output3 = ob_get_contents();
ob_end_clean();
ob_start("gz_handler");
<....... LOAD ALL THE FOOTER MODULES .......>
$output5 = ob_get_contents();
ob_end_clean();
define("CONTENT_HEADER", finalize_output($output0,$header_finalizers_array));
define("CONTENT_LEFT", finalize_output($output2,$left_finalizers_array));
define("CONTENT_CENTER", finalize_output($output3,$center_finalizers_array));
define("CONTENT_RIGHT", finalize_output($output4,$right_finalizers_array));
// No need finalizations, because there are no more parts, which call content changes
define("CONTENT_FOOTER", $output5);
在 95% 的情况下一切正常。但是,在某些情况下,我需要获取仅在 NEXT SIDE 中定义的变量内容(在左侧模块中)(例如在右侧模块中)
使用我的代码,我可以定义站点标题在“标题模块”中,但如果我想要,我可以在 ex. 右侧,因为我可以将替换数据要求添加到数组中,这将在所有侧面内容将生成器生成到变量之后但在打印到客户端浏览器之前执行。
所有这一切只能通过 1 行函数来完成:
function finalize_output($output="",$fin_array=array()) {
<...>
$output = preg_replace("#<title>.*</title>#i", "<title>".$fin_array['change_head_title_attr_to']."</title>", $output, 1);
<...>
}
现在谈谈我的问题。
如何对变量做同样的事情:
在左侧模块中,我有一句话(问题:$object):
if(isset($object)) {
$best_product = sqlArray(sqlQuery("SELECT * FROM tableA WHERE b='$object'"));
<..All the rest code of BEST's product..>
}
在右侧模块中,我有句子(问题:$object):
<... Print LAST 10 PRODUCTS ***>
$res = sqlquery("SELECT * FROM tableA ORDER BY id DESC LIMIT 100);
while($data = sqlarray($res)) { <..PRINT PRODUCT INFO..> }
$new = rand(0,secured($_POST['user_input_new_products']));
for($i=1;$i<=$new;$i++) {
$price_diff_old_new1 = change_products_to_sql('fish_$i', 19.99);
$price_diff_old_new2 = push_product_to_sql('crab_$i', 16.99);
if($i==$new) {
$object = $price_diff_old_new1+$price_diff_old_new2;
}
}
这只是我需要做的示例代码(所以不要详细说明),但重点是,我需要以某种方式将变量提交到较早的源点:解决方案之一是“使用 GOTO ” ,但它是否变量会被记住。
我是说:
echo "JOB IS STARTED";
LABEL HOME:
<INCLUDED FILE : procuts.php >
if(isset($object) && check_is_number($object)) {
$a = $object;
}
if(isset($break_me) && $break_me) {
GOTO FINAL;
}
<END OF INCLUDE>
...
<INCLUDED FILE : upload.php >
$object = 999;
$break_me = true;
GOTO HOME;
<END OF INCLUDE>
}
LABEL FINAL:
echo "JOB IS DONE";
而且,有没有其他方法可以在没有 GOTO 的情况下执行此操作(如果 GOTO 解决方案是可能的(?))?
我个人认为这是不可能编码的,但是自从 PHP 5.3.0 是可能的,我变得很可能被编码。不幸的是,我不确定公司是否会在他们的服务器上使用 Php 5.3.0,所以我希望有另一种解决方案。
此外,我仍然不确定GOTO是否会在那里提供帮助。