-1

好的,这就是我真正陷入困境的交易。

我将我的 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是否会在那里提供帮助。

4

1 回答 1

1

我建议重新考虑你的架构。

无意冒犯,但代码在我看来相当混乱。

指出几点:

  • 你说你使用设计模式,但唯一的模式似乎是模板视图。您似乎没有使用MVC,也没有使用Two-Step View,这两者都适合您的情况。
  • 您不使用OOP有什么特别的原因吗?并不是说过程编码是一件坏事,而是对概念上结合在一起的事物进行适当的封装关注点的分离将使您的应用程序更易于维护。
  • 你的变量名没有意义。一个$output0真的没有告诉你里面有什么。为什么要$object持有一个号码?push_to_sql()您的函数名称也是如此:change_to_sql()听起来很相似。我猜一种表示insert,一种表示update,但语义可能更清晰。
  • 为什么要将保存内容块的变量分配给常量?这一步完全是多余的,因为您也可以在模板视图中使用变量。

现在,我了解您在问题描述中使用了示例代码,所以如果我解决了不适用于您的生产代码的点,请多多包涵。但是,您的模块无法在不影响其他模块的情况下重新排列这一简单事实表明存在代码异味。模块应该是独立的。

但是,让我们现在解决您的问题。

您说您需要将变量提交到源中的较早点。我对示例代码的理解不足以找出原因。但是如果你必须保持你的Big Ball of Mud当前架构,你可以将模块之间共享的所有代码重构为一个单独的函数。然后预加载所有需要的数据并将其注入到渲染内容块的函数中。这样,您应该能够根据需要推动它们。

如果您不必保留当前架构,请帮自己一个忙,看看上面链接的模式。大多数PHP 框架都使用它们,您可能需要考虑将您的应用程序迁移到其中。要进一步改进您的代码,请查看这些QA 工具并查看以下站点:

于 2009-12-27T00:36:00.690 回答