web-dev-qa-db-fra.com

Y a-t-il quelque chose dans PHP équivalent à LINQ en C #?

Y a-t-il quelque chose dans PHP équivalent à LINQ dans C #?

47
eomeroff
27
Justin Niessner

Essayez YaLinqo . C'est le meilleur LINQ pour PHP.

Voici un tableau de comparaison:

Enter image description here

34
cystbear

(Développeur YaLinqo ici.)

Actuellement, il existe trois implémentations majeures de LINQ en PHP:

  • YaLinqo - la bibliothèque la plus minimaliste en termes d'architecture (4 classes), mais la plus complète, la plus performante, avec le meilleure documentation et la seule prenant en charge les "lambdas de chaîne".

  • Ginq - une bibliothèque de taille moyenne (70 classes), à égalité avec YaLinqo dans le nombre de fonctions, environ 1,5– 3 fois plus lent, contient des collections personnalisées, des itérateurs et des comparateurs, la documentation contient au mieux des types d'arguments.

  • Pinq - une immense bibliothèque (500 classes), prend en charge l'analyse PHP et la transformation en SQL et tout le reste, beaucoup plus lent que les autres, ont un joli site Web, mais sa documentation est moyenne et les fonctionnalités manquent.

D'autres bibliothèques ne valent pas la peine d'être mentionnées (euh, d'accord, LINQ pour PHP, Phinq, PHPLinq et Plinq). Ils sont à peine testés, les évaluations ne sont pas paresseuses, ils reposent sur des concepts étranges étrangers aux développeurs PHP et .NET. PHPLinq est le seul qui prend réellement en charge les bases de données, mais il ressemble plus à DAL pour générer du SQL avec un ordre d'appel fixe plutôt que LINQ.

Si vous me demandez quelle bibliothèque choisir, je dirais simplement d'utiliser YaLinqo si vous avez besoin de travailler avec des tableaux et des objets et n'importe quelle bibliothèque ORM (pas LINQ) lorsque vous devez travailler avec des bases de données. Mais je vais essayer d'expliquer pourquoi.

Performance

YaLinqo est de loin la plus rapide des bibliothèques. Il est conçu pour être rapide: il ne repose que sur des générateurs (qui produisent les itérateurs les plus rapides); il utilise uniquement des tableaux (pas de collections personnalisées implémentées comme enveloppes autour des tableaux). Son évolution se débarrasse des fonctionnalités lentes et obsolètes: suppression des collections personnalisées, suppression des itérateurs explicites; et détérioration de la qualité du code si elle améliore les performances: choix entre plusieurs fonctions de tri au lieu d'utiliser une solution générique, copier-coller du code pour réduire le nombre d'appels de fonction.

Ginq et Pinq ont adopté une autre approche, ils utilisent des classes itératives explicites. Il mord une grosse partie des performances, mais permet d'utiliser les itérateurs séparément de la syntaxe de la méthode courante.

De plus, ils ont tous deux des pièges de performance . Lorsque vous utilisez la syntaxe des accesseurs de propriété dans Ginq, votre code devient 5 fois plus lent. Des surprises vous attendent également lorsque vous essayez d'utiliser des tableaux comme clés. Lorsque vous utilisez la jointure dans Pinq, votre code devient des centaines ou des milliers de fois plus lent (je ne plaisante pas, voir les liens ci-dessous) La performance de rejoindre Pinq a été corrigée après mon rapport de bogue.

Avec YaLinqo, c'est plus simple: soit cela ne fonctionne pas (comme les tableaux de clés), soit il fonctionne avec les performances attendues. La version 1 avait quelques hacks pour le rendre possible, comme dans LINQ original, mais pas la version actuelle. Cela peut nécessiter quelques ajustements: par exemple, au lieu d'utiliser un comparateur d'égalité, vous devrez produire des clés qui sont égales dans les mêmes cas.

Voir les articles: LINQ pour PHP: YaLinqo, Ginq, Pinq sur CodeProject, LINQ pour PHP: la vitesse compte sur Habrahabr (russe) Ils couvrent YaLinqoPerf , référentiel git avec des tests de performances comparant PHP brut, YaLinqo, Ginq et Pinq.

Traits

Le nombre de méthodes LINQ dans YaLinqo et Ginq, ainsi que leur fonctionnalité, sont assez proches. Je dirais qu'il n'y a pas de gagnant clair, car les deux bibliothèques fournissent des méthodes que l'autre n'a pas. Ce sont principalement des méthodes supplémentaires non disponibles dans le LINQ d'origine, donc je ne m'en inquiéterais pas trop.

Pinq ressemble à une ville déserte. Les méthodes sont simples et sont souvent à peine utilisables. Lors de l'écriture de tests de performance, j'ai souvent dû recourir à des solutions personnalisées plus complexes pour Pinq, tandis que le code pour YaLinqo et Pinq ne différait généralement que par les noms de méthode (différentes conventions de dénomination: "desc" vs "descending" et des choses comme ça).

D'un autre côté, Pinq est le seul qui prend en charge l'analyse syntaxique PHP et la génération SQL à partir de celui-ci. Malheureusement, le seul fournisseur de requête est pour MySQL et son état est une "démonstration". Pinq a cette fonctionnalité unique, elle ne peut pas encore être utilisée, malheureusement.

Si vous voulez que LINQ to database devienne une réalité, je suppose que vous n'avez pas d'autre choix que de commencer à travailler sur un fournisseur de requêtes pour Pinq. C'est une tâche très complexe, et je doute qu'un développeur soit capable de produire des fournisseurs de requêtes de haute qualité pour toutes les bases de données.

Ce que Ginq a que YaLinqo n'a pas, c'est une architecture plus avancée. Lorsque les classes Set et Dictionary sont utilisées dans Ginq, vous verrez des tableaux et uniquement des tableaux dans YaLinqo. Lorsque Comparer et EqualityComparer sont utilisés dans Ginq, vous verrez des fermetures (ou aucun équivalent) dans YaLinqo. Au fond, c'est une décision de conception - si la bibliothèque doit utiliser des concepts naturels pour les programmeurs dans cette langue ou pour les programmeurs habitués à la bibliothèque dans d'autres langues. Les bibliothèques viennent de faire un choix.

Il convient de noter qu'une architecture plus complexe n'est pas synonyme d'une bonne implémentation. Ginq utilise par exemple public function hash($v) { return sha1(serialize($v)); } pour calculer les hachages de touches dans des "ensembles".

Documentation

YaLinqo se démarque avec une bonne documentation de référence en PHPDoc et en ligne (générée à partir de PHPDoc). Il s'agit principalement de la documentation de LINQ dans .NET à partir de MSDN adapté à PHP. Si vous savez ce qu'est MSDN, vous connaissez sa qualité.

La documentation de Ginq est presque inexistante, elle ne contient généralement que des indications de type d'argument.

La documentation de Pinq est relativement bonne (chaque méthode principale a une phrase ou deux expliquant ce qu'elle fait), mais elle ne correspond pas à la documentation de YaLinqo.

Ginq et Pinq ont tous deux de bons articles d'introduction sur le Web qui expliquent les concepts aux nouveaux développeurs. YaLinqo n'a pas de documentation d'introduction à part un exemple fou dans ReadMe qui n'explique rien.

Pinq a également un joli site Web, la seule des trois bibliothèques.

Tout le reste

Les trois bibliothèques ont une bonne couverture de test, Composer intégration, licences open-source permissives et autres propriétés de bibliothèques qui sont prêtes à être utilisées dans la production.

Pour ceux qui se soucient des anciennes versions PHP, YaLinqo 1.x nécessite PHP 5.3, YaLinqo 2.x nécessite PHP 5.5, Ginq nécessite PHP 5.3, Pinq nécessite PHP 5.4.

P.S. Si vous avez des ajouts ou pensez que je suis partial, veuillez commenter. Les commentaires sont ce qui me manque après avoir écrit tant de texte. :)

29
Athari

Beaucoup de choses ont changé dans le monde PHP au cours des deux dernières années, rendant la plupart des réponses précédentes obsolètes.

Voici un nouveau tableau de comparaison des principales implémentations LINQ pour PHP:

LINQ Library Comparison Table

Ces bibliothèques peuvent toutes être installées via composer .

En résumé, je recommanderais la bibliothèque PINQ (je suis biaisé comme je suis l'auteur) car elle est activement maintenue, bien documentée et testée et fournit une implémentation de vrai LINQ en PHP.

Par vrai LINQ Je veux dire que la bibliothèque n'est pas seulement une API de collection fluide pour les tableaux en mémoire, mais implémente également une analyse de requête réelle avec des arbres d'expression. Cela permet l'intégration de cette API avec des sources de données externes donc [~ # ~] p [~ # ~] HP Dans intégré [~ # ~] q [~ # ~] uery. Une démonstration de ces fonctionnalités peut être visualisée ici où les requêtes sont compilées en SQL et exécutées sur une base de données MySQL:

3
Elliot Levin

Il y a aussi phinq qui a une version plus récente que PHPLinq, et il semble ressembler plus à LINQ to Objects pour C # que PHPLinq.

2
nover

Bon PHP Bibliothèque ORM?

Une réponse à cette question dit

Examinez la doctrine.

Doctrine 1.2 implémente Active Record. Doctrine 2+ est un ORM DataMapper.

Consultez également Xyster. Il est basé sur le modèle Data Mapper.

Jetez également un œil à DataMapper vs Active Record.

1
Bastardo

Voir PHPLinq (un ensemble de PHP imitant le LINQ de C # 3.0).

0
moi_meme