1

泣く準備ができました。私はphp.netのマニュアルページを読み、さまざまなフレーズで12回のGoogle検索を試し、何百ものstackoverflowスレッドをスキャンしました。この方法が使用されているのを見たことがありますが、うまくいきません。それはとても基本的なようです。答えを見つける方法がわからない、いくつかの関連する質問や問題があります。

PHPファイルの重要な部分は次のようになります。

switch() {
…other cases…
default:
  $tpl['title'] = "Newsletter Signup";
  $tpl['description'] = "Newsletter description";
  $tpl['page-content'] = file_get_contents('signup.html');
}

$tpl_src = addslashes(file_get_contents('index.tpl'));
eval("\$html = \"$tpl_src\";");
echo $html;

私のindex.tplファイルには、次のような行が含まれています。

<title>{$tpl['title']}</title>
<meta name="description" content="{$tpl['description']}" />
nav, etc…<br> <div id="main-content"> {$tpl['page-content']} </div>

余分なものをたくさん使わずに、コードがいかにすっきりときれいであるかが好き<?=…?>です。

まず、中括弧{}が文字列に表示される場合、それは何と呼ばれますか?知っていれば調べて使い方を学べるかもしれません。

次に、これはまったく機能しません。変数キーから一重引用符を削除するのは良いことですが、php.netは、ある時点で私の名前が言語定数になった場合に備えて、絶対に削除しないように指示しています。けっこうだ。しかし、どうすればこれを修正できますか?evalTemplateサブルーチンを作成し、それに$ tplを渡すことができる場合に備えて、varsに配列を使用するのが好きです。

最後に、$tpl['page-content']は出力されません。変数は正常に設定されています。テストに使用できますecho $tpl['page-content']が、最終的なHTMLでは1行の空白行として表示されます。

私がまだ知らない言語のいくつかの側面があると確信しています。どんな助けでも大歓迎です!!

4

3 に答える 3

0

通常、文字列変数の展開では''文字列区切り文字を使用しません。つまり"$tpl[content]"、の代わりに"$tpl['content']"

中括弧は、名前の直前または直後に識別子文字が来る場合に変数を区切ります。例えば:

$item = "Cup";
$text = "I smashed four $items"; // won't work
$text = "I smashed four {$item}s"; // will work.

// 2nd output: "I smashed four Cups"
于 2010-01-11T05:23:23.830 に答える
0

addlashes()は、文字列内の単一引用符と二重引用符の両方の前にスラッシュを追加します。あなたの例のために生成されたコードは

$html = "<title>{$tpl[\'title\']}</title>
<meta name=\"description\" content=\"{$tpl[\'description\']}\" />
nav, etc…¦
<div id=\"main-content\"> {$tpl[\'page-content\']} </div>";

そして、{$ tpl[ \ 'title \ ']}はうまく解析されません。

于 2010-01-11T05:25:04.487 に答える
0

Volkerが指摘したaddslashesように、問題のようです。addcslashes代わりに試してください。また、サニタイズ/解析を簡素化するために、これを関数にすることを強くお勧めします。

function render ($file, $vars)
{
    // .. extra sanitisation, validation, et al.
    $_html = '';
    $_raw_file = addcslashes (file_get_contents ($file), '"\\');
    extract ($vars, EXTR_SKIP);
    eval ('$_html = "'.$_raw_file.'"');

    return $_html;
}

そしてこう呼ばれる:

switch() {
// …other cases…
default:
  $tpl['title'] = "Newsletter Signup";
  $tpl['description'] = "Newsletter description";
  $tpl['page-content'] = render ('signup.html');
}

echo render ('index.tpl', $tpl);

PS:上記の使用はextract、変数が単に$title、ではなく$tpl['title']、など になることを意味します。

于 2010-01-11T05:44:36.220 に答える