Existe algo no PHP equivalente a LINQ em C #?

Existe algo no PHP equivalente a LINQ em C #?

Existe PHPLinq – LINQ para PHP .

Experimente o YaLinqo . É o melhor LINQ para PHP.

Aqui está uma tabela de comparação:

Insira a descrição da imagem aqui

(Desenvolvedor YaLinqo aqui.)

Atualmente, existem três implementações principais do LINQ em PHP:

  • YaLinqo – a biblioteca mais minimalista de arquitetura (4 classs), mas a mais característica, a mais performante, com a melhor documentação e a única que suporta “string lambdas”.

  • Ginq – uma biblioteca de tamanho médio (70 classs), em par com YaLinqo no número de funções, cerca de 1,5-3x vezes mais lento, contém collections personalizadas, iteradores e comparadores, a documentação contém tipos de argumento na melhor das hipóteses.

  • O Pinq – uma biblioteca enorme (500 classs), suporta análise de PHP e transformação em SQL e tudo mais, muito mais lento do que o resto, tem um site bonito, mas a documentação é média e falta funcionalidade.

Outras bibliotecas não valem a pena ser mencionadas (um, ok, LINQ para PHP, Phinq, PHPLinq e Plinq). Eles são apenas testados, as avaliações neles não são preguiçosas, eles confiam em conceitos estranhos, estranhos aos desenvolvedores PHP e .NET. PHPLinq é o único que realmente suporta bancos de dados, mas é mais como DAL para gerar SQL com uma ordem de chamada fixa ao invés de LINQ.

Se você me perguntar o que a biblioteca escolher, eu simplesmente direi usar o YaLinqo se precisar trabalhar com arrays e objects e qualquer biblioteca ORM (não LINQ) quando precisar trabalhar com bancos de dados. Mas vou tentar explicar o porquê.

atuação

YaLinqo é, de longe, o mais rápido das bibliotecas. É projetado para ser rápido: ele depende apenas de geradores (que produzem os iteradores mais rápidos); Ele usa apenas arrays (sem collections personalizadas implementadas como wrappers em torno de arrays). Sua evolução está se livrando dos resources lentos e desatualizados: remoção de collections personalizadas, remoção de iteradores explícitos; e piora a qualidade do código se melhorar o desempenho: escolhendo entre várias funções de sorting em vez de usar uma solução genérica, copiando o código para reduzir o número de chamadas de function.

Ginq e Pinq tomaram outra abordagem, eles usam classs de iterador explícitas. Ele morde um grande pedaço de desempenho, mas permite o uso de iteradores separadamente da syntax do método fluente.

Além disso, ambos possuem armadilhas de desempenho . Quando você usa syntax de access de propriedade no Ginq, seu código torna-se 5 vezes mais lento. Também há surpresas à sua espera quando você tenta usar arrays como chaves. Quando você usa a junit no Pinq, seu código se torna centenas ou milhares de vezes mais lento (não estou brincando, veja os links abaixo). A realização da junit no Pinq foi corrigida após o meu relatório de erros.

Com o YaLinqo, é mais simples: ou não funciona (como arrays em chaves), ou funciona com o desempenho esperado. A versão 1 tinha alguns hacks para torná-lo possível, como no LINQ original, mas a versão atual não. Pode exigir alguns ajustes: por exemplo, em vez de usar um comparador de igualdade, você precisará produzir chaves que sejam iguais nos mesmos casos.

Veja artigos: LINQ para comparação de PHP: YaLinqo, Ginq, Pinq em CodeProject, LINQ para PHP: a velocidade importa em Habrahabr (russo). Eles cobrem YaLinqoPerf , repository git com testes de desempenho comparando PHP, YaLinqo, Ginq e Pinq.

Características

O número de methods LINQ em YaLinqo e Ginq, bem como a sua funcionalidade, são bastante próximos. Eu diria que não há um vencedor claro, pois ambas as bibliotecas fornecem methods que o outro não possui. Eles são principalmente methods extras não disponíveis no LINQ original, então eu não me preocuparia demais com isso.

Pinq parece uma cidade deserta. Os methods são barebones e muitas vezes são pouco utilizáveis. Ao escrever testes de desempenho, muitas vezes eu tive que recorrer a soluções mais complexas personalizadas para Pinq, enquanto o código para YaLinqo e Pinq geralmente diferia apenas em nomes de methods (diferentes convenções de nomeação: “desc” vs. “decrescente” e coisas assim).

Por outro lado, o Pinq é o único que suporta a análise de PHP e a geração de SQL a partir dele. Infelizmente, o único provedor de consulta é para o MySQL e seu estado é uma “demonstração”. Então, enquanto o Pinq possui essa característica única, não pode ser usado ainda, infelizmente.

Se você quiser LINQ para bancos de dados para se tornar uma realidade, acho que você não tem escolha senão começar a trabalhar em um provedor de consulta para o Pinq. É uma tarefa muito complexa, e duvido que um desenvolvedor possa produzir provedores de consulta de alta qualidade para todos os bancos de dados sozinhos.

O que Ginq tem que o YaLinqo não é uma arquitetura mais avançada. Onde as classs Set e Dictionary são usadas no Ginq, você verá arrays e apenas arrays no YaLinqo. Onde Comparer e EqualityComparer são usados ​​no Ginq, você verá fechamentos (ou nenhum equivalente) no YaLinqo. No núcleo, é uma decisão de design – se a biblioteca deve usar conceitos naturais para programadores neste idioma ou para programadores utilizados na biblioteca em outras línguas. As bibliotecas apenas fizeram uma escolha.

Deve-se notar que uma arquitetura mais complexa não é igual a uma boa implementação. Ginq usa public function hash($v) { return sha1(serialize($v)); } public function hash($v) { return sha1(serialize($v)); } para calcular hashes de teclas em “sets”, por exemplo.

Documentação

YaLinqo se destaca com uma boa documentação de referência em PHPDoc e online (gerada a partir do PHPDoc). É principalmente documentação do LINQ no .NET a partir do MSDN adaptado ao PHP. Se você sabe o que é MSDN, você conhece sua qualidade.

A documentação do Ginq é quase inexistente, geralmente contém apenas dicas de tipo de argumento.

A documentação do Pinq é relativamente boa (cada método principal tem uma frase ou duas explicando o que faz), mas não é igual para a documentação do YaLinqo.

Ambos, Ginq e Pinq, têm bons artísticos introdutórios na web que explicam conceitos para novos desenvolvedores. YaLinqo não tem nenhuma documentação introdutória, além de um exemplo louco no ReadMe, que não explica nada.

Pinq também tem um site bonito, a única das três bibliotecas.

Todo o resto

Todas as três bibliotecas têm boa cobertura de teste, integração de compositores, licenças permissivas de código aberto e outras propriedades de libararies que estão prontas para serem usadas na produção.

Para aqueles que se preocupam com versões antigas do PHP, o YaLinqo 1.x requer o PHP 5.3, o YaLinqo 2.x requer PHP 5.5, o Ginq requer PHP 5.3, o Pinq requer o PHP 5.4.

PS Se você tem alguma adição, ou pense que estou tendenciosa, comente. Os comentários são o que sinto falta depois de escrever tanto texto. 🙂

Muito mudou no mundo do PHP nos últimos dois anos, tornando a maioria das respostas anteriores desatualizadas.

Aqui está uma nova tabela de comparação das principais implementações LINQ para PHP:

Tabela de Comparação da Biblioteca LINQ

Essas bibliotecas podem ser instaladas via compositor .

Em resumo, eu recomendaria a biblioteca PINQ (eu sou tendencioso como eu sou o autor) porque é ativamente mantido, bem documentado e testado e fornece uma implementação do LINQ verdadeiro em PHP.

Por LINQ verdadeiro, quero dizer que a biblioteca não é apenas uma API de coleta fluente para arrays na memory, mas também implementa análise de consulta real com trees de expressão. Isso permite a integração desta API com fonts de dados externas, portanto, P HP In Tegrated Q uery. Uma demonstração dessa funcionalidade pode ser vista aqui onde as consultas estão sendo compiladas em SQL e são executadas contra um database MySQL:

Há também phinq que tem uma versão mais recente que PHPLinq, e parece ser mais como LINQ para Objetos para C # do que o PHPLinq.

Boa Biblioteca PHP ORM?

Uma resposta a esta pergunta diz

Olhe para Doutrina.

Doctrine 1.2 implementa o Active Record. Doctrine 2+ é um DataMapper ORM.

Além disso, confira Xyster. É baseado no padrão Data Mapper.

Além disso, dê uma olhada no DataMapper vs. Active Record.

Há também Pinq . Depois de passar brevemente pela maioria das documentações do projeto PHP Linq, este fez a melhor impressão em mim.

Veja PHPLinq (um conjunto de classs PHP que medem o LINQ do C # 3.0).