1

私は、PHPの醜さが引き起こす可能性のある恐怖と足の射撃の程度を直接体験しました。私は次のプロジェクトに取り組んでいます(なぜ私が言語を切り替えるだけではないのか疑問に思われるかもしれませんが、それが私がここにいる理由ではありません)。

いくつかのモデルを定義し、メインコントローラーから始めました。私は、ビューを実装する方法についての私の決定の分岐点にいます。これまでのところ、メインコントローラーには呼び出す表示機能のリストを指定でき、1回の呼び出しでページ全体を吐き出すことができます。次のようになります。

function Parse_Body()  
{  
    foreach ($this->body_calls as $command)  
    {  
        $call = $command['call'];  
        if (isset($command['args'])) $call($command['args']);  
        else $call();  
    }  
}

私のジレンマはこれです:

すべての表示関数が生成したHTMLを返すようにして、メインコントローラーがecho $page;PHPの外部で生のHTMLを使用できるようにするか、または使用する必要があります。これは、読み取られるとすぐに出力されます。

前者を使用すると、メインのアプリコントローラーは、ディスプレイの気まぐれに完全な制御を放棄することなく、出力を取得するタイミングを正確に制御できます。言うまでもなく、呼び出す表示関数のリスト(上記)はすべて、渡されない限り、表示ファイルから実際に実行することはできません。後者の方法では、巨大なPHP文字列ブロックを実行する代わりに、実際のHTMLでHTMLを実行できるという利点があります。さらに、関数を呼び出す代わりに、ファイルをインクルードして実行することもできます。したがって、その方法では、ファイルは関数のようなものだと思います。

何か入力やアドバイスをお願いしますか?

4

3 に答える 3

1

出力制御関数を使用すると、HTML の文字列を取得しながら PHP コード内に HTML を埋め込むことで、両方の利点を得ることができます。

PHP マニュアル @ http://www.php.net/manual/en/ref.outcontrol.phpから:

<?php

function callback($buffer)
{
  // replace all the apples with oranges
  return (str_replace("apples", "oranges", $buffer));
}

ob_start("callback");

?>
<html>
<body>
<p>It's like comparing apples to oranges.</p>
</body>
</html>
<?php

ob_end_flush();

?>
于 2009-09-04T01:38:08.453 に答える
1

メインコントローラーが $page; を単にエコーできるように、すべての表示関数が生成した HTML を返すようにしたほうがよいでしょうか。または、表示ファイルは、読み取られるとすぐに出力を取得する PHP の外部で生の HTML を使用する必要がありますか?

PHP の利点の 1 つは、処理が出力に似ていることです。

そう:

<h1> <?= $myHeading; ?> </h1>

以下よりも明確です。

echo "<h1>$myHeading</h1>";

さらに:

echo heading1($myHeading); //heading1() being an hypothethical user defined function.

それに基づいて、ビューで HTML を使用し、php を使用して適切な動的フィールドを出力する方がよいと考えています。

出力を細かく制御するには、ob_start を使用できます。

もちろん、そこにあるいくつかの php MVC フレームワークのいずれかを使用できます。私の好みは次のとおりです:Solarphp

しかし、Zend FrameworkCakephpも役に立ちます。

最後に、フレームワークを使用したくない場合でも、非常にスリムなテンプレート エンジンphpSavantを使用できます。これにより、ビューの開発におけるいくつかの頭痛の種が解消されます。番目

于 2009-09-04T01:55:45.063 に答える
0

最初にすべてをバッファリングします。次に、スクリプトの最後でパーサーを使用してタグを置き換えます。

<?php

$page_buffer = '';

function p($s){
   global $page_buffer;
   $page_buffer .= $s;
}

$page_buffer = str_replace(
     array('<$content$>','<$title$>'),
     array($pagecontent,$pagetitle),
     $page_buffer);

echo $page_buffer;

?>

Samstyle PHP フレームワークは、この方法で出力バッファリングとビュー モデルを実装します

そして、「エコー」する前に出力を変数にバッファリングすることの利点について言及しましたか? http://thephpcode.blogspot.com/2009/02/php-output-buffering.html

于 2009-09-05T15:17:05.483 に答える