-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 (右側のモジュールなど) でのみ定義される VARIABLE のコンテンツ (左側のモジュール) を取得する必要がある場合があります。

私のコードでは、サイト ヘッダーを定義できます「ヘッダーモジュール」で、しかしそれが必要な場合は、元で変更できます。右側は、配列にデータ置換要件を追加できるためです。これは、すべてのサイド コンテンツが変数のジェネレーターになった後に実行されますが、クライアント ブラウザーに出力する前に実行されます。

これはすべて、関数内の 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);
   <...>
}

今私の問題について。

VARIABLES で同じことを行う方法:

左側のモジュールには、次の文があります (問題: $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;
  }
}

これは私がする必要があることの単なるサンプルコードです(詳細には行か​​ないでください)が、要点は、変数を以前のソースポイントに送信する必要があるということです:解決策の1つは「USE 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

アーキテクチャを再考することをお勧めします。

不快ではありませんが、コードはかなり面倒に見えます。

いくつかのことを指摘するには:

  • あなたはDesign Patternsを使用すると言いましたが、唯一のパターンはTemplate Viewのようです。MVCTwo-Step Viewも使用していないようです。どちらもあなたの場合に適しています。
  • OOPを使用していない特別な理由はありますか? 手続き型のコーディングが悪いというわけではありませんが、概念的にまとまりのあるものを適切にカプセル化し、関心を分離することで、アプリの保守性が大幅に向上します。
  • 変数名は意味がありません。An$output0は中身について何も教えてくれません。なぜ$object数字を保持するのですか?push_to_sql()関数名についても同じことが言えchange_to_sql()ます。1 つはinsertを意味し、もう 1 つはupdateを意味すると思いますが、セマンティクスはもっと明確になる可能性があります。
  • コンテンツブロックを保持する変数を定数に割り当てるのはなぜですか? テンプレート ビューでも変数を使用できるため、この手順はまったく不要です。

さて、質問の説明でサンプルコードを使用したことを理解していますので、本番コードに当てはまらない点に対処した場合はご容赦ください。それでも、他のモジュールに影響を与えずにモジュールを再配置できないという単純な事実は、コードの匂いを示しています。モジュールは自己完結型である必要があります。

しかし、今あなたの問題に取り掛かりましょう。

ソース内の以前のポイントに変数を送信する必要があると言います。理由を理解するのに十分なほどサンプルコードを理解していません。しかし、Big Ball of Mudの現在のアーキテクチャを維持する必要がある場合は、モジュール間で共有されるすべてのコードを別の関数にリファクタリングできます。次に、必要なすべてのデータをプリロードし、コンテンツ ブロックをレンダリングする関数に挿入します。このようにして、必要に応じてそれらをプッシュできるはずです。

現在のアーキテクチャを維持する必要がない場合は、上にリンクされているパターンを見てください。ほとんどのPHP フレームワークはそれらを利用しており、アプリを 1 つに移行することを検討することをお勧めします。コードをさらに改善するには、これらのQA ツールを見て、これらのサイトをチェックしてください。

于 2009-12-27T00:36:00.690 に答える