Czy w PHP jest coś równoważnego LINQ w C#? [zamknięte]

zamknięte. to pytanie nie spełnia wytycznych dotyczących przepełnienia stosu . Obecnie nie przyjmuje odpowiedzi.

chcesz poprawić to pytanie? Update the pytanie więc to on-topic {[3] } dla przepełnienia stosu.

Zamknięte 4 lata temu .

Popraw to pytanie

Czy w PHP jest coś równoważnego LINQ W C#?

Author: dreftymac, 2011-04-26

7 answers

 29
Author: Justin Niessner,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-01-15 15:48:37

Try YaLinqo . Jest to najlepszy LINQ dla PHP.

Oto tabela porównawcza:

Tutaj wpisz opis obrazka

 35
Author: cystbear,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-04 18:28:35

(programista YaLinqo tutaj.)

Obecnie istnieją trzy główne implementacje LINQ w PHP:

  • YaLinqo - najbardziej minimalistyczna Architektura biblioteczna (4 klasy), ale najbardziej funkcjonalna, najbardziej wydajna, z najlepszą dokumentacją i jedyną obsługującą "string lambda".

  • Ginq - biblioteka średniej wielkości (70 klas), na równi z YaLinqo w liczbie funkcji, około 1,5-3x razy wolniejszy, zawiera własne kolekcje, Iteratory i komparatory, dokumentacja zawiera co najwyżej typy argumentów.

  • Pinq - ogromna biblioteka (500 klas), obsługuje parsowanie PHP i przekształcanie w SQL i wszystko inne, znacznie wolniejsze niż reszta, ma ładną stronę internetową, ale jej dokumentacja jest średnia i brakuje funkcjonalności.

O innych bibliotekach nie warto wspominać (OK, LINQ dla PHP, Phinq, PHPLinq i Plinq). Są ledwo testowane, oceny w nich nie są leniwe, opierają się na dziwnych pojęciach obcych zarówno programistom PHP, jak i. NET. PHPLinq jest jedynym, który faktycznie obsługuje bazy danych, ale bardziej przypomina DAL do generowania SQL ze stałą kolejnością połączeń, a nie LINQ.

Jeśli zapytasz mnie, jaką bibliotekę wybrać, po prostu powiem, aby użyć YaLinqo, jeśli potrzebujesz pracować z tablicami i obiektami oraz dowolną biblioteką ORM (nie LINQ), gdy musisz pracować z bazami danych. Ale postaram się wyjaśnić dlaczego.

Wydajność

YaLinqo jest zdecydowanie najszybszą biblioteką. Jest zaprojektowany tak, aby był szybki: opiera się tylko na generatorach (które produkują najszybsze Iteratory); używa tylko tablic (żadnych niestandardowych kolekcji zaimplementowanych jako owijki wokół tablic). Jego ewolucją jest pozbycie się powolnych i przestarzałych funkcji: usuwanie niestandardowych kolekcji, usuwanie jawnych iteratorów; i pogorszenie jakości kodu, jeśli poprawia wydajność: wybór pomiędzy wieloma funkcjami sortowania zamiast używania jedno ogólne rozwiązanie, kopiowanie-wklejanie kodu w celu zmniejszenia liczby wywołań funkcji.

Ginq i Pinq przyjęły inne podejście, używają jawnych klas iteratora. To gryzie dużą część z wydajności, ale pozwala na korzystanie z iteratorów oddzielnie od składni metody płynnej.

Ponadto obie mają pułapki wydajności. Gdy używasz składni właściwości accessors w Ginq, Twój kod staje się 5 razy wolniejszy. Czekają na ciebie również niespodzianki, gdy spróbujesz używać tablic jako kluczy. kiedy używasz łączenia w Pinq, Twój kod staje się setki lub tysiące razy wolniejszy (nie żartuję, patrz linki poniżej) wydajność łączenia w Pinq została naprawiona po moim zgłoszeniu błędu.

Z YaLinqo jest to prostsze: albo nie działa (jak tablice w kluczach), albo działa z oczekiwaną wydajnością. Wersja 1 miała kilka hacków, aby to umożliwić, jak w oryginalnym LINQ, ale obecna wersja nie. może wymagać pewnych korekt: na przykład, zamiast używać równości comparer, trzeba będzie produkować klucze, które są równe w tych samych przypadkach.

Zobacz artykuły: LINQ dla PHP porównanie: YaLinqo, Ginq, Pinq na CodeProject, LINQ dla PHP: speed matters na Habrahabr (rosyjski). Obejmują one yalinqoperf, repozytorium git z testami wydajności porównującymi surowe PHP, YaLinqo, Ginq i Pinq.

Funkcje

Liczba metod LINQ w YaLinqo i Ginq, jak również ich funkcjonalność, są dość bliskie. Powiedziałbym nie ma jednoznacznego zwycięzcy, ponieważ obie biblioteki zapewniają metody, których nie ma druga. Są to w większości dodatkowe metody niedostępne w oryginalnym LINQ, więc nie martwiłbym się o to zbytnio.

Pinq wygląda jak opuszczone miasto. Metody są barebones i często są ledwo użyteczne. Podczas pisania testów peformance często musiałem uciekać się do niestandardowych bardziej złożonych rozwiązań dla Pinq, podczas gdy kod dla YaLinqo i Pinq różnił się zwykle tylko nazwami metod (różne konwencje nazewnictwa: "desc" vs. "malejąco" i tym podobne).

Z drugiej strony, Pinq jest jedynym, który obsługuje parsowanie PHP i generowanie SQL z niego. Niestety jedynym dostawcą zapytań jest MySQL, a jego stan to "demonstracja". Tak więc, chociaż Pinq ma tę unikalną funkcję, niestety nie można jej jeszcze użyć.

Jeśli chcesz, aby bazy danych LINQ stały się rzeczywistością, myślę, że nie masz wyboru, jak tylko rozpocząć pracę nad dostawcą zapytań dla Pinq. To bardzo złożone zadanie i wątpię w jedno. programista jest w stanie samodzielnie tworzyć wysokiej jakości dostawców zapytań dla wszystkich baz danych.

To, co ma Ginq, czego nie ma Yalinqo, to bardziej zaawansowana architektura. Gdzie klasy Set i Dictionary są używane w Ginq, zobaczysz tablice i tylko tablice w YaLinqo. Gdzie Comparer i EqualityComparer są używane w Ginq, zobaczysz zamknięcia (lub brak odpowiednika) w YaLinqo. Zasadniczo jest to decyzja projektowa-czy biblioteka powinna używać pojęć naturalnych dla programistów w tym języku, czy dla programistów używanych do biblioteki w innych językach. Biblioteki dokonały wyboru.

Należy zauważyć, że bardziej złożona Architektura nie równa się dobrej implementacji. Ginq używa public function hash($v) { return sha1(serialize($v)); } do obliczania skrótów klawiszowych w "zestawach", na przykład.

Dokumentacja

YaLinqo wyróżnia się dobrą dokumentacją referencyjną w PHPDoc i online (generowaną z PHPDoc). Jest to głównie dokumentacja LINQ w. Net z MSDN dostosowana do PHP. Jeśli wiesz, czym jest MSDN, znasz jego jakość.

Ginq ' s dokumentacja prawie nie istnieje, zwykle zawiera tylko podpowiedzi typu argumentu.

Dokumentacja Pinqa jest stosunkowo dobra( każda główna metoda ma zdanie lub dwa wyjaśniające, co robi), ale nie pasuje do dokumentacji YaLinqo.

Zarówno Ginq, jak i Pinq mają dobre wprowadzające artcicles w internecie, które wyjaśniają koncepcje nowym programistom. YaLinqo nie ma żadnej dokumentacji wprowadzającej poza szalonym przykładem w ReadMe, który nie wyjaśnia cokolwiek.

Pinq ma też ładną stronę internetową, jedyną z trzech bibliotek.

Wszystko inne

Wszystkie trzy biblioteki mają dobry zasięg testowy, integrację kompozytora, licencje open-source i inne właściwości bibliotek gotowych do użycia w produkcji.

Dla tych, którym zależy na starożytnych wersjach PHP, YaLinqo 1.x wymaga PHP 5.3, YaLinqo 2.x wymaga PHP 5.5, Ginq wymaga PHP 5.3, Pinq wymaga PHP 5.4.

P. S. Jeśli masz wszelkie dodatki, lub myślę, że jestem stronniczy, proszę o komentarz. Komentarze są tym, czego mi brakuje po napisaniu tak dużo tekstu. :)

 30
Author: Athari,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-18 19:32:59

Wiele się zmieniło w świecie PHP w ciągu ostatnich kilku lat, renderując większość poprzednich odpowiedzi nieaktualnych.

Oto nowa tabela porównawcza głównych implementacji LINQ dla PHP:

Tabela porównawcza biblioteki LINQ

Wszystkie te biblioteki mogą być instalowane przez composer .

Podsumowując polecam bibliotekę PINQ (jestem stronniczy, ponieważ jestem autorem), ponieważ jest aktywnie utrzymywana, dobrze udokumentowana i przetestowana oraz zapewnia implementację true LINQ w PHP.

By true LINQ mam na myśli, że Biblioteka jest nie tylko płynnym API kolekcji dla tablic w pamięci, ale także implementuje rzeczywiste parsowanie zapytań za pomocą drzew wyrażeń. Pozwala to na integrację tego API z zewnętrznymi źródłami danychPHP In tegrated Q uery. Demo takiej funkcjonalności można obejrzeć tutaj gdzie zapytania są kompilowane do SQL i uruchamiane przeciwko bazie danych MySQL:

 3
Author: Elliot Levin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-03 02:02:43

Istnieje również phinq, który ma nowsze wydanie PHPLinq i wydaje się bardziej przypominać LINQ to Objects dla C# niż phplinq.

 2
Author: nover,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-04 15:42:10

Dobra biblioteka PHP ORM?

Odpowiedź na to pytanie mówi

Przyjrzyj się doktrynie.

Doctrine 1.2 implementuje Active Record. Doctrine 2 + to DataMapper ORM.

Zobacz też: Xyster. Opiera się na schemacie Mapera danych.

Spójrz również na DataMapper vs. Active Record.

 1
Author: Bastardo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:18:14

[[0]} Zobacz PHPLinq (zbiór klas PHP naśladujących C # 3.0 LINQ).

 0
Author: moi_meme,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-04 15:40:39