54

PHP の EOF 文字列を使用して、引用符などをエスケープする手間をかけずに HTML コンテンツをフォーマットします。この文字列内で関数を使用するにはどうすればよいですか?

<?php
    $str = <<<EOF
    <p>Hello</p>
    <p><?= _("World"); ?></p>
EOF;
    echo $str;
?>

まず、Java 5 以降を使用している場合は、代わりにProcessBuilderRuntime.getRuntime().exec()を使用することをお勧めします。まず、引数の引用について心配する必要はありません。個別のコマンドライン引数はそれぞれ個別のパラメーターです。例えば:

ProcessBuilder builder = new ProcessBuilder("cmd.exe", "/C", "java net/com/codeusa/Server 43594");
Process process = builder.start();

ProcessBuilder または を使用してプロセスを開始する場合Runtime.getRuntime().exec()、選択した Process のサブクラスをインスタンス化して返すのは完全に JVM 次第であり、JVM の決定に影響を与える方法はありません。あなたの ProcessHandler クラスはあなた自身が書いたものだと思います (その名前の Java API クラスは見つかりません)。Process をサブクラス化する可能性がありますが、その場合でも、ProcessBuilder またはRuntime.getRuntime().exec(). したがって、上記のコード行は、他の例外をスローしないと仮定して、ClassCastException をスローすることが保証されています。

メソッドに応答しないプロセスの過去の経験がいくつかありdestroy()ます。通常、これは、プロセスによって書き込まれる標準出力または標準エラーが読み取られず、1 つ以上の I/O バッファーがいっぱいになったためにプロセスが停止したことが原因でした。上記のプロセスは、標準出力または標準エラーに何かを書き込みますか? もしそうなら、それを読んでいますか?

ProcessBuilder を使用すると、標準出力と標準エラー ストリームの両方を簡単に読み取ることができbuilder.redirectErrorStream(true);ます。上記の 2 行の間に次の行を追加すると、プロセスの標準出力から読み取るだけで済みます。Java 1.4 以前とRuntime.getRuntime().exec()に行き詰まっている場合は、2 つの異なるスレッドで 2 つの異なるオブジェクトを設定する必要があります。1 つは各ストリームから読み取ります。

ProcessHandler クラスで何を達成しようとしているのかわかりません。ソースコードを提供していません。destroy()その上、メソッドを使用するよりも強制的にプロセスを強制終了する必要があったことはありません。

4

2 に答える 2

98

マニュアルを見る限り、HEREDOC 文字列内で関数を呼び出すことはできません。面倒な方法は、事前に単語を準備することです。

<?php

    $world = _("World");

    $str = <<<EOF
    <p>Hello</p>
    <p>$world</p>
EOF;
    echo $str;
?>

頭に浮かぶ回避策のアイデアは、魔法の getter メソッドを使用してクラスを構築することです。

次のようにクラスを宣言します。

class Translator
{
 public function __get($name) {
  return _($name); // Does the gettext lookup
  }
 }

ある時点でクラスのオブジェクトを初期化します。

  $translate = new Translator();

次に、次の構文を使用して、HEREDOC ブロック内で gettext ルックアップを実行できます。

    $str = <<<EOF
    <p>Hello</p>
    <p>{$translate->World}</p>
EOF;
    echo $str;
?>

$translate->Worldマジック getter メソッドのおかげで、自動的に gettext ルックアップに変換されます。

スペースまたは特殊文字を含む単語 (たとえば、 という名前の gettext エントリ) に対してこのメ​​ソッドをHello World!!!!!!使用するには、次の表記法を使用する必要があります。

 $translate->{"Hello World!!!!!!"}

これはすべてテストされていませんが、動作するはずです。

更新: @mario が発見したように、結局、HEREDOC 文字列から関数を呼び出すことが可能です。このようにゲッターを使用するのは洗練されたソリューションだと思いますが、直接関数呼び出しを使用する方が簡単かもしれません。これを行う方法についてのコメントを参照してください。

于 2010-09-12T09:26:55.930 に答える
-1

私が見る限り、あなたは間違ってヒアドキュメントを追加しただけ
です。ここで醜いヒアドキュメント構文を使用する必要はありません。
それを削除するだけで、すべてが機能します。

<p>Hello</p>
<p><?= _("World"); ?></p>
于 2010-09-12T11:12:03.933 に答える