多言語Webサイトの翻訳を含むXMLを読み込むSimpleXMLElementを拡張したクラスを作成しました。 このクラスには、getとtranslateという2つのプライベート関数があります。 前者は、引数として渡されたxpathによってアクセスされたノードに含まれる変換を返します。
後者は、 を介して得られた翻訳を用いて、文字列中のタグ様の部分文字列を置換する(例えば、 "Lorem ipsum#{dolor} sit amet、consectetur adipiscing elit")。私のget()関数での処理。
私はpreg_replace_callbackをtranslate()で使用しています - preg_replace内の関数に引数として後方参照を渡すことはできません - 一致したオカレンスをget()に送ることはできません。PHP OOPがcreate_functionのコールバックとしてプライベート関数を呼び出す
$translation = new Translation('path_to_my_xml', null, true);
class Translation extends SimpleXMLElement {
function get($xpath){
// xpath is of the form 'parent_node/child_node'
// After some processing and the wanted node being found - it returns the translation
}
function translate($string){
$string = preg_replace_callback('/#\{([a-z0-9-\/]+)\}/', create_function('$matches', 'return $this->get($matches[1]);'), $string);
}
}
はもちろん、私は致命的なエラーを取得する:$を使用して、このオブジェクトのコンテキストでは、クラスのための私のする。create_function呼び出しでインスタンス化されていないではない。ここ
は私のクラスの短縮バージョンです - 私はself::get($matches[1])
も成功裏に試しました。
これらの関数は、自分のクラスがSimpleXMLElementの拡張である場合は公開できません。コンストラクタ内のXMLへのパスが必要です。 これはできません:
create_function('$matches', 'return Translation::get($matches[1]);')
。
私は自分自身を明確にしたいと思う。私が見る唯一の回避策は、私のtranslate()関数でXMLへのパスを渡してパブリックにすることですが、これは非常に不便です。 他の方法がありますか?ラムダ/無名関数で$これを使用する
おかげ
ありがとう、それは完璧に動作します。ちょうどあなたがそれを難しい方法で行うことができるとき、なぜそれを簡単な方法で行うのですか?私はちょうどあなたがコールバックとして配列を使用することができるか分からなかった。 – rgandoin