LINQ for PHP。 パヌト1.私は圌に䜕があったのか、そしお䜕があったのかを盲目にし、それから私は恋に萜ちたした

LINQがPHPにどのように移怍されたかの物語。 タブレットを䜿甚した既存のラむブラリずグラフなしの比范が添付されおいたす。



泚目を集める画像 コヌド 写真を埅぀こずはできたせん
echo Phinq::create($people) ->groupBy(function($person) { return $person->residence->region; }) ->select(function($grouping) { $obj = new stdClass(); $obj->people = $grouping; $obj->region = $grouping->getKey(); return $obj; })->orderBy(function($obj) { return $obj->people->count(); }, true) ->aggregate(function($current, $next) { $count = $next->people->count(); return $current . sprintf( "%d %s (%s) live in the %s region\n", $count, $count === 1 ? 'person' : 'people', $next->people->aggregate(function($current, $next) { if ($current !== null) { $current .= ', '; } return $current . sprintf('%s [%s]', $next->name, $next->residence->code); }), $next->region ); });
      
      



Cたたは関数型蚀語を誰が芋たのか-この傑䜜を芋るず、目を䞞くしたす最初に軌道から飛び出さない堎合。 そしお、おそらく、圌は正しいでしょう。 しかし、あなたはただこれを奜きにするこずができたす
 $lowNums = from('$n')->in($numbers)-> where('$n < 5')-> store($digits)->into('digits')-> select('$digits[$n]');
      
      



LINQをPHPに移怍する動物園ラむブラリから2匹の動物を芋たした。 LINQは実際には蚀語統合ク゚リ、぀たり蚀語に統合されたSQLのようなク゚リです。 Cでは、LINQは構文ツリヌに䟝存しおおり、2぀の圢匏の蚘述がありたすが、次の千幎玀に向けおPHPでこのような安物を埅぀必芁はないため、LINQはSQLに䌌たメ゜ッドを備えたラむブラリであるず芋なされたす。



LINQをPHPに移怍する倚くのラむブラリがありたす。 1぀だけが実際に移怍された堎合...しかし、その詳现に぀いおは埌で、ただし今のずころ、アルファベット順に、䜿甚可胜なすべおの遞択肢を怜蚎したす。 読み取りは、シヌケンシャルたたは最埌からのいずれかになりたす。



LINQ for PHP

それは圌のコヌドがどんなに奇劙に芋えおも、どんな蚀語でも自分の奜きなものにリメむクする準備ができおいる人によっお曞かれたものです。 最初の疑問は、LinqSamples.phpを芋るず魂に忍び蟌みたす。
 class Console { public static function WriteLine() { $args = func_get_args(); $string = array_shift($args); foreach ($args as $i => $value) { if (is_bool($value)) { $value = $value ? 'True' : 'False'; } $string = str_replace('{'.$i.'}', $value, $string); } echo $string.'<br />'; } ...
      
      



このアプロヌチでは、移怍されたLINQを元のLINQず区別するのが難しいず思いたすか そしお、あなたは正しいでしょう。 C
 from n in new int[] { 1, 2, 3 } where n % 2 == 0 select n * 2;
      
      



なったPHP
 from('$n')->in(array(1,2,3))->where('$n % 2 == 0')->select('$n *2');
      
      



きれいですね。



叙情的な䜙談。 なぜ線ですか <私のお気に入りのIDE>のそれらのコヌドは同じものを匷調しおいたせん しかし、リファクタリングはどうですか しかし、県鏡はどうですか しかし、たさか。 匷調衚瀺もリファクタリングもありたせん。小さなものがごちそうを支配したす。 PHPのクロヌゞャヌ構文は非垞に冗長であるため x => x + 1



ずfunction ($x) { return $x + 1; }



ず比范しおください、ほずんどすべおのLINQポヌト開発者が「ラむンラムダ」を発明したす。 どこかでクロヌゞャヌを䜿甚できる堎所、どこか-ファンキヌな「関数ポむンタヌ」文字列'strlen'



および配列array($object, 'methodName')



、どこか-ラムダ、どこか-そしお、別ず3番目の䞡方。 すべおのオプションは、LINQ for PHPで䜿甚できたす。



ラむブラリの䞊べ替えを芋おみたしょう。 「肉」はLinqForPhp_Objects_Sequence :: doIterationメ゜ッドに隠されおいたすgetIteratorが呌び出されるず、operations配列に入力されたすべおの操䜜が順番に実行されたす。 操䜜は、チェヌンの「遅延」なしで連続しお実行されたす。぀たり、where-> anyを呌び出すず、シヌケンス党䜓がフィルタリングされたす。 最初の呌び出しの埌、結果はキャッシュされたす。



著者は、PHPDocにコメントを远加するよう求められたしたが、長い間、それだけでは䞍十分でした。コヌドの5番目の郚分は、せいぜい文曞化されおいたす。 はい。PHPDocの構文は䜜成者によっお䜜成されたものではありたせん。1぀のパラメヌタヌに匕数名がありたせん。



暙準メ゜ッドが実装されたすAggregate、All、Cast、DefaultIfEmpty、Except、FirstOrDefault、GroupBy、OrderBy、Reverse、Single、Takeなど。 合蚈玄50個。 List、Dictionary-事前収集コレクションのポヌトぞの倉換があり、いく぀かの未知の理由でメ゜ッドの䞀郚がNotImplementedExceptionをスロヌし、offsetExistsがarray_key_exists array_key_exists($index)



ずしお実装されarray_key_exists($index)



読み取り。 質問ぞの答えを残したす、なぜこれらのコレクションが必芁なのですか



IDEになかったものは非垞に良い感じです-PhpStormは即座に明瀺的なバグを衚瀺したす。 分割テストれロ点れロ。



結論奜奇心syntax盛な構文、遅延蚈算、テスト、ドキュメント、ク゜コレクション、倚数のバグはありたせん。 䜿甚は掚奚されおいたせん。



フィンク

それは奇劙な明るい未来を信じる人によっお曞かれたした。 関数を受け入れるすべおの匕数には、クロヌゞャヌタむプに関する制限がありたす。 比范者比范者-EqualityComparerむンタヌフェむスなど。 コレクションには配列がありたす。 次のようになりたす。
  public function groupJoin(array $collectionToJoinOn, Closure $innerKeySelector, Closure $outerKeySelector, Closure $resultSelector, EqualityComparer $comparer = null)
      
      



䞀芋論理的ですが、ここで思い出しおください...クロヌゞャヌに加えお、文字列ず配列[オブゞェクト、メ゜ッド名]の圢匏のネむティブな足のような「関数ポむンタヌ」があり、それらは突然フォレストを通過したす。 EqualityComparerむンタヌフェむスには、equalsメ゜ッドが1぀しかありたせんハッシュを取埗する方法はありたせん。これは、ネむティブのポカペシュ連想配列の内郚の管理です。 そしお、それぞれの比范のために、新しいクラスを䜜成しおください。関数を枡したせん。 groupJoinでは、Phinqク゚リの実行結果を枡すのが論理的であり、そのタむプは配列ではありたせん。 そしお、IteratorやIteratorAggregateのようなSPLむンタヌフェむスは、突然配列でもなくなりたす。 数字ずfrom-where-selectを䜿甚しおサンプルのフレヌムワヌク内にずどたっおいる限り、すべお順調です。 厳しい珟実に盎面するず、困難になりたす。



すべおのメ゜ッドがPHPDocドキュメントを怜出したす。 メ゜ッドごずに独立しお正盎に曞かれおいたす。 たあ、ほずんど正盎に-䞀郚の堎所ではコピヌペヌストを感じるこずができたす。
 /** * Correlates elements into groupings of the two collections based on matching keys * * This is basically an outer join. * * @param array $collectionToJoinOn * @param Closure $innerKeySelector Takes one argument, the element's value, and returns the join key for that object * @param Closure $outerKeySelector Takes one argument, the element's value, and returns the join key for that object * @param Closure $resultSelector Takes two arguments, the matching elements from each collection, and returns a single value * @param EqualityComparer $comparer * @return Phinq */ public function groupJoin(...
      
      



関数の機胜を理解しおいたすか そしお、䜕がresultSelectorを受け入れお返したすか 理解したら、䞊蚘のドキュメンタリヌのコメントを読んでいないので、CでGroupJoinを1回䜿甚しただけです。



合蚈50個の暙準メ゜ッドを実装したしたが、なんずなく遅延的に実装したした。 コレクション内の唯䞀の芁玠がnullの堎合、䜕らかの理由でシングルは䟋倖をスロヌしたす。 䜕らかの理由で配列はキヌに関する情報をスロヌしたす。 反埩子は、Phinqオブゞェクトを䜜成するずすぐに配列に倉換されたすもちろん、キヌに関する情報もありたせん。 出力内のキヌを䜿甚しお䜕かを取埗する唯䞀の方法は、ON䟡栌のoffsetGetおよびoffsetSet実装を持぀Dictionaryコレクションに倉換するこずです。 前のラむブラリずは異なり、少なくずもListは実装されおいたせんそれぞれtoListメ゜ッド、no。



前のラむブラリの堎合のように、蚈算のすべおの遅延は、結果をキャッシュするこずに垰着したす。



ラむブラリで䜕が良いのですか テストがありたす。 やったヌ もちろん、衚面的です。 最良の堎合、メ゜ッドごずのピヌスのペア。 境界ケヌスなし。 しかし、テストがありたす。 これはいいです。



結果匕数のタむプには厳しい制限があり、キヌはありたせん。衚面テストはありたす。衚面ドキュメンテヌションはありたす。バグはほずんどありたせん。ク゜コレクションがありたす。 䜿甚は掚奚されおいたせん。



Phinq 2.0

それは明るい未来に幻滅した男によっお曞かれたした文字列ラムダにこんにちは、これたでのずころ、関数の匕数の制限。 唯䞀の方法を備えたEqualityComparerは匕き続き䜿甚できたす。 SQLの調味料を䜿甚しおSQLク゚リを䜜成したす。 「Phinqには括匧で囲たれた匏が続く単項ブヌル挔算子 ''が必芁です」ずいう圢匏の䟋倖を䜿甚したPHPによるPHP解析。 私たちは長い間曞くでしょう...



...そしお、もちろん、私たちは远加したせん。 叀いPhinqを新しい方法で曞き換えるために、著者は釘を打ちたした。 遠隔サヌバヌ䞊のSVNのブランチ/branches/2.0は、明るいスタヌトず悲しい゚ンドの唯䞀の蚀及です。



結論䜕もありたせん、私たちは通り過ぎたす。 䜿甚は掚奚されおいたせん。



PHPLinq

誰かが別のDALを必芁ずしおいるず信じ、元のLINQの機胜に぀いお挠然ずした考えを持っおいる人によっお曞かれたした。 圌の理解では、orderBy、select、skip、take、および残りの関数は、アプリケヌションの順序が厳密に蚭定されおいるためたた、どこにも文曞化されおいないため、重芁ではない任意の順序で呌び出すこずができたす。 圌の理解では、閉鎖は誰にずっおも䞍必芁な新しい぀たらないものです。 圌の理解では、シングルずファヌストはたったく同じものです。 圌の理解では、テストはprint_rを呌び出すPHPスクリプトです。 圌の理解では、ドキュメンタリヌコメントはコピヌされたメ゜ッド名ず匕数型の列挙です。 圌の理解では、プロゞェクトのドキュメントはVisualStudioの圢匏のクラス図です。



もちろん、LINQ to Objects、LINQ to ZendDb、LINQ to Azure、LINQ to MS SQL、LINQ to MySQL、LINQ to SQLiteのサポヌトに぀いお話すこずができたす。 しかし、このラむブラリが、䞀般的な関数型プログラミング、特にドキュメントやテストなしのLINQずは関係のない䜎コヌドコヌドである堎合、この倚様性が必芁なのは誰ですか



ボトムラむン LINQ to *の壮倧な量、他のすべおの壮倧な䞍足。 䜿甚は掚奚されおいたせん。



おそらく、熱心な読者はすでに疑問を抱いおいたすい぀䜕かが掚奚されるのでしょうかい぀ですか埅っおいたす、願っおいたす...信じおいたす。そしお、私たちはさらに読みたす。



Plinq

これは、PHPでLINQを䜿甚したかったが、コヌディングが非垞に面倒だったミニマリストの人によっお曞かれたした。 したがっお、20個を少し超えるメ゜ッドがサポヌトされおいたすが、そのうちThenByもAggregateもありたせん。 レむゞヌコンピュヌティングはたったくありたせん。 行「ラムダ」はありたせん-クロヌゞャヌのみ、ハヌドコアのみです匕数のタむプに制限がなく、PHPの珟圚のバグがない堎合、行「関数ぞのポむンタヌ」も機胜したす。 アグリゲヌタヌ関数にクロヌゞャヌを枡すこずは必須です。 ほずんどの堎合、Plinqメ゜ッドは暙準関数のラッパヌであり、さらに配列ずむテレヌタ間の倉換を行っおいたす。



ラむブラリは䜕が良いですか テストの倖芳がありたす-関数ごずのassert'ovのペア。 次のようになりたす。

 function TestOrderBy(&$testArray) { $p = new Plinq($testArray); $result = $p->OrderByDescending(function($k, $v){ return $v['int']; }); assert('key($result) == "key_999"'); $p = new Plinq($testArray); $result = $p->OrderByDescending(function($k, $v){ return $v['date']; }); assert('key($result) == "key_999"'); $p = new Plinq($testArray); $result = $p->OrderBy(function($k, $v){ return $v['string']; }); assert('key($result) == "key_0"'); }
      
      



$ testArrayに぀いおは聞かないでください-ここでは説明したせん。138057文字のこのような1行のむチゞク文字列だず蚀いたす。これは、IDEがギアできしむようにしたす。アレむの性質に぀いおは調べおいたせん。



ドキュメンタリヌのコメントに䌌たリモヌトのものがありたす。 それらから、Diff関数が「さたざたなアむテムを芋぀ける」こずがわかりたす嘘を぀いたずは蚀えたせん。



結論ミネラルはなく、氎はありたせん、怍物はありたせん、それは人口がありたす...しかし、それは䜕によっおも人口がありたせん。 䜿甚は掚奚されおいたせん。



それだけです 映画は終わりたした。 PHPのLINQポヌトは終了したした。



...わかりたした、わかりたした、そのような悲しいメモで終わらないように、LINQポヌトではないラむブラリに぀いお蚀及したす。 しかし、魚の無さやカワカマスは魚です。



Underscore.php

Underscore.jsが倧奜きな男性によっお曞かれたしたありがずう、K.O。。



Underscore.jsずは䜕ですか これは、JavaScriptのすべおの機胜を実装するラむブラリです。 名前は、マップ、フィルタヌ、削枛、平坊化、時間で䜕かわかりたすか そうでない堎合、マップが遞択されおいるこず、reduceが集玄されおいるこず、timesが繰り返されおいるこずなどを芚えおおく必芁がありたす。 䞀般的に、LINQを匷く思い出させたすが、そうではありたせん。 遅延蚈算はありたせん。



したがっお、Underscore.phpは、PHPのUnderscore.jsポヌトです。 ラむブラリは非垞に関連しおいるため、バヌゞョン番号も同期されたす。



ドキュメンタリヌのコメントはたったくありたせん。 各メ゜ッドには、定期的か぀簡朔な方法がありたす。 もちろん䞍䟿ですが、あなたは生きるこずができたす。 サむトにはただドキュメントがあり、かなり正気です。



テストがありたすUnderscore.jsからコピヌされたものず、远加のテストの䞡方です。



コヌドの品質は䞍十分です。 静的関数は静的ずしおマヌクされたせん。 コヌルバックは$ fずしお呌び出されたす。぀たり、関数ポむンタヌ配列を忘れるこずができたすPHPにはこのような欠陥がありたす。 ラムダはサポヌトされおいたせん。



コヌドは次のようになりたす。
 $numbers = __($numbers)->chain() ->select(function($n) { return $n % 2 === 0; }) ->reject(function($n) { return $n % 4 === 0; }) ->sortBy(function($n) { return -$n; }) ->value();
      
      





結論他のメ゜ッド名があり、ドキュメンタリヌのコメントはありたせん。テストがあり、ラムダはありたせん。 䜿甚が掚奚されたすが、関数型プログラミングに察する匷い衝動がある堎合のみです。



最終結果

銘板







結論蚘事の2番目の郚分「口ひげのある自分」を埅ちたす。



虫

本質ずポむントですが、バグや機胜に投祚しお、そのようなラむブラリでの開発を悪倢から少し枛らすこずができたす。



Php

  1. むテレヌタ::キヌは、数字ず文字列のみを返すこずができたす。
    1. 45684 foreachがキヌタむプに䟝存しないずいう芁求
  2. クロヌゞャヌの構文を短瞮する機胜があり、パッチ、分析などが添付されたした-機胜を蚭蚈した開発者が最善を尜くしたした。 しかし、この機胜は「nafig need」ずいう結果で閉じられたした。 :-(


PHPStorm IDE

  1. 行内のPHPコヌド
    • WI-3477 assert 'literal'、evalなどにPHP蚀語を挿入
    • WI-2377挿入された蚀語で文字列内のphp倉数のオヌトコンプリヌトがありたせん
  2. PHPコヌド分析
    • WI-11110未定矩のメ゜ッドクロヌゞャヌを䜿甚するず、未定矩のメ゜ッドが誀っお報告されたす
  3. PHPDocコメント
    • {link}が2回続けお䜿甚された堎合、PhpDocクむックドキュメントのWI-8270゚ラヌ


参照資料



PS同様の蚘事を英語で投皿できる堎所を教えおください。



All Articles