プライベートインスタンスメソッドをコールバックとして使用できますか?
-
06-07-2019 - |
質問
特定のシナリオでは、プライベートメソッド内で正規表現を使用してテキスト変換を行います。プライベートメソッドは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でテスト済み
他のヒント
テキスト処理用に別のヘルパークラスを作成し、そのクラス内にコールバックメソッドを作成できますか(そこでパブリックにできます)?特定のインスタンスデータへのアクセスが必要な場合は、元のクラス(オブジェクト)への参照を渡すことができます。
メインクラスへのパブリックインターフェイスは一貫性があり、クリーンであり、特定の文字列処理を、おそらくとにかくクラスに属していません...
protectedを使用できませんか?これら2つのクラスの関係がより明確になるように、これらの2つのクラスの関係を知る必要がありますが、クラスを拡張し、それらを公開せずに継承した新しい保護されたメソッドを使用できる必要があります。
これがお役に立てば幸いです!
乾杯
所属していません StackOverflow