私の特定のシナリオでは、プライベートメソッド内で正規表現を使用してテキスト変換を行います。プライベートメソッドはpreg_replace_callbackを呼び出しますが、コールバックはオブジェクトに対してパブリックである必要があるようです。そのため、プライベートの世界から抜け出し、実装の詳細を公開したくないときに立ち往生しています。
つまり、簡単に言うと、カプセル化を失うことなく、インスタンスメソッドをコールバックとして使用できますか?
ありがとう。
私の特定のシナリオでは、プライベートメソッド内で正規表現を使用してテキスト変換を行います。プライベートメソッドはpreg_replace_callbackを呼び出しますが、コールバックはオブジェクトに対してパブリックである必要があるようです。そのため、プライベートの世界から抜け出し、実装の詳細を公開したくないときに立ち往生しています。
つまり、簡単に言うと、カプセル化を失うことなく、インスタンスメソッドをコールバックとして使用できますか?
ありがとう。
はい、できるようです:
<?php
//this works
class a {
private function replaceCallback($m) { return 'replaced'; }
public function test() {
$str = " test test ";
$result = preg_replace_callback('/test/', array($this, 'replaceCallback'), $str);
echo $result;
}
}
$a = new a();
$a->test();
//this doesn't work
$result = preg_replace_callback('/test/', array(new a(), 'replaceCallback'), ' test test ');
echo $result;
したがってpreg_replace_callback()
、またはPHPのコールバックメカニズムは、それが呼び出されたスコープを認識しているようです。
5.2.8でテスト済み
テキスト処理用に別のヘルパークラスを作成し、そのクラス内にコールバックメソッドを作成できますか(そこでパブリックにすることができます)?特定のインスタンスデータにアクセスする必要がある場合は、元のクラス(オブジェクト)への参照を渡すことができます。
メインクラスへのパブリックインターフェイスは一貫性がありクリーンなままであり、特定の文字列処理をクラスから引き出します。おそらく、クラスには属していません...
保護されたものは使えませんか?より明確にするために、これら2つのクラスの関係がどのようなものであるかを知る必要がありますが、クラスを拡張して、継承した新しい保護されたメソッドを公開せずに使用できるはずです。
お役に立てれば!
乾杯