2010-11-30 3 views
0

私が取り組んでいるWebサイトのテンプレートシステムを作成しようとしています。私は、特定のタグで囲まれたデータを処理する関数を呼び出すためにpreg_replaceを使用しようとしています。たとえば、process( 'date')は今日の日付を返し、$ の日付 $としてコードに入れられます。私は変更する必要がある文字列を見つけるためにpreg_replaceを使用していますが、関数を呼び出すことはできません - PHPは関数が代わりにプロパティであると考えるようです。preg_replaceがプロパティとしての関数を処理しています

これは私が使用していたコードです:

$view = preg_replace("/\$_([a-zA-Z0-9_]+)_\$/e", "$this->process('\\1')", $view); 

これは私が取得エラーです:

お知らせ:未定義のプロパティ:/location/ClassName.class.phpのclassname :: $プロセスオンラインX

私はこれを十分に説明したいと思います。プログラムをプロパティとして表示するのではなく、メソッドとして実行するためにpreg_replaceを取得するにはどうすればよいですか?

+0

は、文字列を置き換えるときに正しいスコープで '$ this'ですか? – stillstanding

+0

私はそう信じています...私はラインエコー$ this-> process( 'date')を追加できます。 preg_replaceの上で動作します。 – Wige

答えて

1

preg_replace_callbackが実際にやっているように設計されているので、preg_replaceの代わりにpreg_replace_callbackを使用することをお勧めします。スコープ/関数のアクセシビリティに問題がある可能性があります。 preg_replaceを呼び出しているコードが呼び出ししようとしている関数にアクセスできない場合、このエラーが発生する可能性があります。なぜなら、PHPは関数を見つけることができず、パラメータとして扱うことをデフォルトにしているからです。関数がこのpreg_replaceと同じファイルにない場合は、その関数を変更しているかどうかを調べてください。

+0

この関数は、preg_replaceを呼び出すメソッドと同じクラスのメソッドです。私はpreg_replace_callbackの使用を検討していましたが、スコープが適切に維持されているかどうかはわかりませんでした。私はそれをpreg_replace_callback( "/ \ $ _([a-zA-Z0-9 _] +)_ \ $ /"、 "this-> process"、$ view)と呼びますか?どのようにプロセスの範囲を示していますか? – Wige

+0

これをテストした後、クラスのメンバー関数で呼び出されるか、またはクラス変数を渡したpreg_replace_callbackはまったく機能しません。基本的に、preg_replace_callbackで$ thisを使用するものはエラーを投げるので、preg_replaceを動作させることに戻ります。 – Wige

+0

呼び出されたメソッドを静的メソッドに変更してみてください。私は以前これを見て、オブジェクトとしてコード化されたコンパイル時にテンプレートオブジェクトがコードを呼び出しているが、コードが呼び出されたときにオブジェクトとして作成されていないという事実を扱っている。 –

関連する問題