2

私はphpを初めて使用し、ヒアドキュメント構文を元々使用していたテンプレートシステムを使用していますが、その後、いくつかの理由でそれを削除することにしました。

私はこのように見えるものを持っています:

    public function display_admin() {

    return <<<ADMIN_FORM

    <form action="{$_SERVER['PHP_SELF']}" enctype="multipart/form-data" method="post">
      <label for="title">Title:</label><br />
      <input name="title" id="title" type="text" maxlength="220" />
      <div class="clear"></div>
      <label for="bodytext">Body Text:</label><br />
      <textarea name="bodytext" id="bodytext"></textarea>
      <input type="submit" value="Create This Entry!" />
    </form>

    ADMIN_FORM; }

そして、私はこれを使用してページ上でそれを呼び出します:

$obj = new myCMS();
echo $obj->display_admin();

ヒアドキュメント構文を置き換えるにはどうすればよいですか?HTMLの大きなブロックをPHP関数に挿入するための別の効率的な方法はありますか?簡単な解決策があるはずですが、ここでグーグルするたびに、ブロック全体ではなく、HTMLの1行を挿入するのに適していると思われる回答が得られます。

4

2 に答える 2

3

まず第一に、HTMLの大きなブロックをPHP関数に挿入する理由はあまりありません。
呼び出す$obj->display_admin();ことはあまり意味がありません。
その間

$data = array('bodytext' => $text);
$obj->set_data($data);
$obj->set_template('admin_form')
$obj->display();

作る。

次に、ヒアドキュメントは絶対にテンプレートソリューションではありません。
PHP自体はそうですが。

だから、ファイルを作るadmin_form.tpl.php

<form action="" enctype="multipart/form-data" method="post">
  <label for="title">Title:</label><br />
  <input name="title" id="title" type="text" maxlength="220" />
  <div class="clear"></div>
  <label for="bodytext">Body Text:</label><br />
  <textarea name="bodytext" id="bodytext"><?=$data['bodytext']?></textarea>
<? if ($data['id']): ?>
  <input name="id" id="id" type="hidden" value="<?=$data['id']?>" />
<? endif ?>
  <input type="submit" value="Create This Entry!" />
</form>

そして、それが収まるところにそれを含めるだけです-おそらくあなたのテンプレートクラスに。

于 2011-03-29T16:56:34.520 に答える
3

ヒアドキュメントは、この種の複数行のテキスト作成の唯一の実用的な選択肢です。他の唯一のオプションは、行ごとの連結、またはPHPモードを「解除」して、出力バッファリングを使用することです。

$text = "blah blah blah";
$text .= "blah blah blah";
$text .= "blah blah blah";

ob_start(); ?>
blah blah blah
blah blah blah
blah blah blah
<? $text = ob_get_clean(); 

$text = <<<EOL
blah blah blah
blah blah blah
blah blah blah
EOL;

3つのうち、ヒアドキュメントははるかに使いやすくなっています。テキスト本文内で引用符をエスケープすることを心配する必要はありません。変数関数を使用すると、テキスト内で関数呼び出しを実行してhtmlspecialchars()、ヒアドキュメントブロック外でそのようなテキストを事前に定義しなくても呼び出しなどを実行できます。

$formfield = htmlspecialchars($_POST['somefield']);
$txt = <<<EOL
<input type="text" value="$formfield" />
EOL;

対。

$hsc = function($x) { return htmlspecialchars($x); };

$txt = <<<EOL
<input type="text" value="{$hsc($_POST['somefield'])}" />
EOL;

コメントフォローアップ:

ヒアドキュメントを連結できないということは何もありません。

$txt = <<<EOL
blah blah blah
EOL;

$txt .= <<<EOL
more blah
EOL;

結局のところ、ヒアドキュメントは、たまたま複数行のテキストを含む文字列を生成するだけです。モノリシックな単一のヒアドキュメントを2つ以上のセクションに分割し、条件付きif()のものを2つのセクションの間に置くことができます。

一方、変数関数を使用すると、簡単に1つを作成して、単一のヒアドキュメント内に条件付きテキストを挿入できます。

$conditional = function($parameter) { return (($parameter == 1) ? 'Success' : 'Failure'); }

$txt = <<EOL
Your login attempt
resulted in {$conditional($somevalue)}.
How does that make you feel?
EOL;

vs

$txt = <<<EOL
Your login attemp
resulted in
EOL;
$txt .= (($somevalue == 1) ? 'Success' : 'Failure');
$txt .= <<<EOL
.
How does that make you feel?
EOL;
于 2011-03-29T16:47:05.820 に答える