クロージャーのPHPリフレクション

こんにちはHabr! 今日は、松葉杖についてお話したいと思います。これは、 PHP Reflectionのジャングルに飛び込まないようにするのに役立ちました。 結局のところ、誰もが松葉杖を書き、誰かが大きく書き、誰かが小さく書きます。







画像







私はプロジェクトでLaravelを積極的に使用しています。 このフレームワークに慣れていない人にとっては、私があいまいな点を説明するので、絶望しないでください。







今回は、検証ルールの拡張をいくつか作成しました。







Validator::extend('someRule', function ($attribute, $value, $parameters, $validator) { // some code... return $result; // boolean }, ':attribute is invalid');
      
      





そして、バリデーターに渡されるすべてのルールのリストを取得する必要がありました。 結局のところ、この一見単純な作業に、思ったより少し時間がかかりました。 プロパティはプライベートでした。 また、クラスの実装にはゲッターがありませんでした。 もちろん、 作曲家の更新後、この編集はすぐに表示されるため、クラスは変更しませんでした。







私は以前にReflectionを使用したことはありませんでしたが、それが何に使用されるのか聞いたことがあります。 それで、私はドキュメントを読み始めました。 当然、この例のコードは最初は起動せず、さらに探す必要がありました。 そして、解決策はもっとシンプルにすべきだと思いました。







そして、私はシンプルでエレガントな松葉杖を見つけました。 それでも、そうしない方がいいです。 私有財産は私有なので、そこに登ることはありません。 しかし、状況が必要なので、...







 Validator::extend('someRule', function ($attribute, $value, $parameters, $validator) { //  -.        . //     ,       (,    ) $ninja = function() { //           return $this->initialRules; }; $initialRules = $ninja->call($validator); //  $newThis // some code return $result; }, ':attribute is invalid');
      
      





他の誰かが理解していない場合、私は説明します:いくつかのプロパティを返す匿名関数を作成しました。 そして、コンテキストをバリデーターコンテキストに置き換えただけです(laravelはこのクラスのインスタンスを渡します)。 つまり、クロージャは内部からこのオブジェクトにアクセスできるようになり、プライベートプロパティとメソッドにアクセスできるようになりました。







このすべての機能は、 PHP 5.4以降で機能します。







実際に私が伝えたかったのはそれだけです。 私の前に発明されたかもしれませんが、それは自分の頭に浮かんだので、共有することにしました。 突然、この決定は誰かの生活を簡素化します。







ご清聴ありがとうございました。








All Articles