2012-02-10 7 views
2

多言語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へのパスを渡してパブリックにすることですが、これは非常に不便です。 他の方法がありますか?ラムダ/無名関数で$これを使用する

おかげ

答えて

3

ハングオンでは、このような古いスタイルのPHPコールバックを使用できませんか?

function translate($string){ 
    $string = preg_replace_callback('/#\{([a-z0-9-\/]+)\}/', 
            array($this, 'translateCallback'), 
            $string); 
} 

public function translateCallback($matches) 
{ 
    return return $this->get($matches[1]); 
} 
+0

ありがとう、それは完璧に動作します。ちょうどあなたがそれを難し​​い方法で行うことができるとき、なぜそれを簡単な方法で行うのですか?私はちょうどあなたがコールバックとして配列を使用することができるか分からなかった。 – rgandoin

0

施設が、これは類似している疑いがある、PHP 5.4で追加されました。私はチェックするために私のテストベッドを起動する必要があります。おそらくひどく有用ではない

$string = preg_replace_callback('/#\{([a-z0-9-\/]+)\}/', function($matches) use ($this) { return $this->get($matches[1]); }, $string); 
+0

私はPHP 5.2を使用していますが、どちらもお試しいただきありがとうございます。 – rgandoin

0

を、しかし、PHP 5.4で匿名関数は$thisにアクセスすることができます。

あなたは試みることができます。あなたの出荷日はいつですか?

+0

残念ながら、私はPHP 5.2で動作しています。 – rgandoin

+0

アップグレードできますか? – Flukey

2

1:

preg_replace_callback($regexp, array($this, 'someMethod'), $string) 

2:

$myFunc = function($matches) use ($this) ... 
... 
preg_replace_callback('/#\{([a-z0-9-\/]+)\}/', $myFunc, $string) 

3:最後のインスタンスを保存する訳 オーバーライド__construct、翻訳:: getLastInstanceを(実装)とする。create_function内部にそれを使用するか、または翻訳を実装します。 :最後のインスタンスを使用するget($ m)をarray( 'Translation'、 'get')としてpreg_replace_callbackに渡すか、preg_replace_callbackの前に保存してself :: $ currentInstanceに現在のインスタンスにリンクします。 いずれにしても、インスタンスへのリンクを静的なプロパティに保存しています。

関連する問題