こんにちは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以降で機能します。
実際に私が伝えたかったのはそれだけです。 私の前に発明されたかもしれませんが、それは自分の頭に浮かんだので、共有することにしました。 突然、この決定は誰かの生活を簡素化します。
ご清聴ありがとうございました。