【问题标题】:Is there something in PHP equivalent to LINQ in C#? [closed]PHP 中是否有与 C# 中的 LINQ 等价的东西? [关闭]
【发布时间】:2011-08-13 03:19:47
【问题描述】:

PHP 中是否有与 C# 中的 LINQ 等效的内容?

【问题讨论】:

  • 你指的是哪个 LINQ? LINQ 到对象? LINQ到SQL?实体框架? LINQ 到数据集?
  • 我的意思是语言集成查询,查询任何集合,而不是在名称中包含 linq 的技术或平台上
  • “查询任何集合” - 然后称为 LINQ to Objects(请参阅msdn.microsoft.com/en-us/library/bb397919.aspx)。然而,许多人将 ORM 与“LINQ”联系在一起。
  • 相当于 LINQ to Entities 怎么样?如果没有,那么 LINQ to SQL 呢?
  • 答案的数量和质量意味着这是一个非常有用的问题。从日期来看,它已经重新开放并重新关闭。它应该保持打开状态,因为显然有 好的答案

标签: php linq language-comparisons


【解决方案1】:

【讨论】:

  • 看到一个公认的答案让我很难过,它提倡在where('$name => strlen($name) < 5')这样的字符串变量中编写php代码...我什至不想想象必须重命名任何类时所经历的痛苦,属性、变量等。做事的正确方法是使用真正的语言结构(委托/匿名函数),比如 ginq/pinq 做的。
【解决方案2】:

Good PHP ORM Library?

这个问题的答案说

研究教义。

Doctrine 1.2 实现了 Active Record。 Doctrine 2+ 是一个 DataMapper ORM。

另外,请查看 Xyster。它基于 Data Mapper 模式。

另外,看看 DataMapper 与 Active Record 的对比。

【讨论】:

    【解决方案3】:

    参见PHPLinq(一组模仿 C#3.0 的 LINQ 的 PHP 类)。

    【讨论】:

      【解决方案4】:

      还有phinq,它比 PHPLinq 有更新的版本,它看起来更像 C# 的 LINQ to Objects,而不是 PHPLinq。

      【讨论】:

        【解决方案5】:

        试试YaLinqo。它是 PHP 的最佳 LINQ。

        这是一个比较表:

        【讨论】:

        • 感谢链接和 YaLinqo
        • 不得不使用 php 5.3,所以我不得不下载旧版本的 YaLinqo。谢谢。
        • 我投了赞成票,但后来发现 YaLinqo 并没有完全准备好生产。没有文档,意外行为。它有效,但我在尝试后决定反对它。无法删除我的投票,所以锁定了它。已切换到 PINQ。
        • @DimaStefantsov 您能否详细说明“未准备好生产”、“意外行为”,尤其是“无文档”?几乎所有对 YaLinqo 的“意外行为”的抱怨都来自不阅读“toArray”方法文档的开发人员(它会折叠相等的键,因此某些结果可能会“消失”)。 YaLinqo 的参考文档是最好的,但 Pinq 的介绍性文章更好。如果至少有一个查询提供程序,Pinq 会很棒,但是自从 MySQL 演示引入以来,没有任何进展。 :( 我希望 TimeToogo 最终能找到一些时间。
        • @DimaStefantsov 如果您设法使用 YaLinqo 修改集合,请报告错误,我将不胜感激。 :) 它也保留了密钥,比如 Pinq。您可以使用toList(或toDictionary(value, increment))忽略它们或丢弃它们,或者,如果方法具有resultSelectorKey 参数,则将增量函数传递给它。对于 Pinq,如果我没记错的话,您可以使用方法 reindexindexBy。虽然真的,忽略键通常是最简单的选择。保留密钥的原因是有时它们是必要的,因此丢弃信息必须是明确的。
        【解决方案6】:

        在过去的几年里,PHP 世界发生了很多变化,导致以前的大部分答案都过时了。

        这是 PHP 的主要 LINQ 实现的新比较表:

        这些库都可以通过composer安装。

        总的来说,我会推荐PINQ 库(我是作者,所以我有偏见),因为它得到了积极维护、有据可查和测试,并提供了真正的 PHP LINQ 实现。

        true LINQ 我的意思是该库不仅是内存数组的流畅集合 API,而且还使用表达式树实现真正的查询解析。这允许将此 API 与外部数据源集成,因此 PHP In 集成了 Query。此类功能的演示可以查看here,其中查询被编译成 SQL 并针对 MySQL 数据库运行:

        【讨论】:

        • (YaLinqo 开发者)很高兴看到这方面的一些进展!我对您如何设法从匿名函数(?)解析语法树感到非常困惑,我需要查看您的代码。不过我有一些反对意见。 (1) 比较测试的数量是不公平的,一些库将测试分组为函数(通常是由于懒惰)。当然,YaLinqo 不包含 3000 个测试,但它包含大约 600 个测试,而不是 168 个,因此,考虑到库的大小和范围,它并没有那么小。 (2) 我会对性能比较非常感兴趣。
        • 我尝试将 YaLinqo 与 Ginq 进行比较,结果 YaLinqo 平均快了 2 倍(yield 与手动实现的迭代器相比,性能上的差异很大),而且差距是平均的在 Ginq 使用奇怪的低效代码的测试中更大。尚未探索您的实现。话虽如此,YaLinqo 故意排除了 PHP 中效率太低的功能,我什至在移植到生成器时删除了一些功能。此外,无论使用什么库,与手动编写的代码相比,性能都有巨大下降......
        • (3) 我觉得有趣的是,唯一的查询提供程序实现是针对 MySQL 的,它是演示(如果我错了,请纠正我)。实现功能齐全的数据库查询提供程序的复杂性是我什至没有研究这个方向的原因之一。 (4) 您的网站不错,但我没有看到任何可与 MSDN-like PHPDoc 相比的所有功能(我错过了吗?)。我完全同意 YaLinqo 需要一个网站。
        • (5) 维护栏中的颜色范围很有趣,但我不否认 YaLinqo 没有被积极开发。 :) 但是,我认为它足够有特色,并且没有看到任何显着改进它的方法(在其范围内)。有一些关于其他方法的想法,但问题跟踪器中没有活动,所以我不在乎。
        【解决方案7】:

        (这里是 YaLinqo 开发者。)

        目前PHP中LINQ的实现主要有3种:

        • YaLinqo — 架构方面最简约的库(4 个类),但功能最多、性能最高、文档最好,并且唯一支持“字符串 lambda”。

        • Ginq — 一个平均大小(70 个类)的库,在函数数量上与 YaLinqo 相当,大约慢 1.5-3 倍,包含自定义集合、迭代器和比较器,文档包含的参数类型位于最好的。

        • Pinq — 一个巨大的库(500 个类),支持解析 PHP 并转换为 SQL 和其他一切,比其他的慢得多,有一个漂亮的网站,但它的文档是平均的,并且缺乏功能。

        其他库不值得一提(嗯,好吧,LINQ for PHP、Phinq、PHPLinq 和 Plinq)。它们几乎没有经过测试,它们的评估并不懒惰,它们依赖于 PHP 和 .NET 开发人员都陌生的奇怪概念。 PHPLinq 是唯一真正支持数据库的,但它更像是用于生成具有固定调用顺序的 SQL 而不是 LINQ。

        如果你问我选择什么库,我只想说如果你需要使用数组和对象以及任何 ORM 库(而不是 LINQ),那么当你需要使用数据库时使用 YaLinqo。但我会尝试解释原因。

        性能

        YaLinqo 是迄今为止最快的库。它的设计速度很快:它只依赖于生成器(生成最快的迭代器);它仅使用数组(没有实现为数组包装器的自定义集合)。它的演变正在摆脱缓慢和过时的功能:删除自定义集合,删除显式迭代器;如果提高性能,代码质量也会变差:在多个排序函数之间进行选择,而不是使用一种通用解决方案,复制粘贴代码以减少函数调用的次数。

        Ginq 和 Pinq 采用了另一种方法,它们使用显式迭代器类。它会降低性能,但允许将迭代器与流畅的方法语法分开使用。

        此外,它们都有性能陷阱。当你在 Ginq 中使用属性访问器语法时,你的代码会慢 5 倍。当您尝试使用数组作为键时,还有惊喜等着您。 当您在 Pinq 中使用加入时,您的代码会变慢数百或数千倍(我不是在开玩笑,请参阅下面的链接)在我的错误报告之后,加入 Pinq 的性能得到了修复。

        使用 YaLinqo,它更简单:要么它不工作(如键中的数组),要么它以预期的性能工作。版本 1 确实有一些 hack 使其成为可能,就像在原始 LINQ 中一样,但当前版本没有。它可能需要一些调整:例如,您需要生成在相同情况下相等的键,而不是使用相等比较器。

        参见文章:LINQ for PHP comparison: YaLinqo, Ginq, Pinq on CodeProject,LINQ for PHP: speed matters on Habrahabr(俄语)。它们涵盖了YaLinqoPerf,git 存储库,其中包含比较原始 PHP、YaLinqo、Ginq 和 Pinq 的性能测试。

        特点

        YaLinqo 和 Ginq 中的 LINQ 方法的数量以及它们的功能非常接近。我想说没有明显的赢家,因为两个库都提供了另​​一个库没有的方法。它们大多是原始 LINQ 中不可用的额外方法,所以我不会太担心。

        Pinq 看起来像一个废弃的小镇。方法是准系统,通常几乎不可用。在编写性能测试时,我经常不得不为 Pinq 求助于定制的更复杂的解决方案,而 YaLinqo 和 Pinq 的代码通常只在方法名称上有所不同(不同的命名约定:“desc”与“descending”等等)。

        另一方面,Pinq 是唯一支持解析 PHP 并从中生成 SQL 的。不幸的是,唯一的查询提供者是 MySQL,它的状态是“演示”。所以,虽然 Pinq 有这个独特的功能,但很遗憾,它还不能使用。

        如果您希望 LINQ to 数据库成为现实,我想您别无选择,只能开始为 Pinq 开发查询提供程序。这是一项非常复杂的任务,我怀疑一个开发人员是否能够单独为所有数据库生成高质量的查询提供程序。

        YaLinqo 所没有的 Ginq 是更高级的架构。在 Ginq 中使用 SetDictionary 类的地方,你会在 YaLinqo 中看到数组并且只有数组。在 Ginq 中使用 ComparerEqualityComparer 时,您会在 YaLinqo 中看到闭包(或没有等效项)。从本质上讲,这是一个设计决策——库是应该使用对这种语言的程序员来说自然的概念,还是对习惯于使用其他语言的库的程序员来说。图书馆刚刚做出了选择。

        应该注意的是,更复杂的架构并不等于好的实现。例如,Ginq 使用public function hash($v) { return sha1(serialize($v)); } 计算“集合”中的密钥哈希。

        文档

        YaLinqo 在 PHPDoc 和在线(从 PHPDoc 生成)中提供了很好的参考文档。它主要是适用于 PHP 的 MSDN 中 .NET 中的 LINQ 文档。如果您知道 MSDN 是什么,那么您就知道它的质量。

        Ginq 的文档几乎不存在,它通常只包含参数类型提示。

        Pinq 的文档比较好(每个主要方法都有一两句话解释它的作用),但它比不上 YaLinqo 的文档。

        Ginq 和 Pinq 在网络上都有很好的介绍性文章,向新开发人员解释概念。 YaLinqo 没有任何介绍性文档,除了自述文件中的疯狂示例,它没有解释任何内容。

        Pinq 也有一个漂亮的网站,三个库中唯一的一个。

        其他的

        所有三个库都具有良好的测试覆盖率、Composer 集成、开放源代码许可以及其他可用于生产的库属性。

        对于那些关心 PHP 古老版本的人,YaLinqo 1.x 需要 PHP 5.3,YaLinqo 2.x 需要 PHP 5.5,Ginq 需要 PHP 5.3,Pinq 需要 PHP 5.4。

        附:如果您有任何补充,或者认为我有偏见,请发表评论。写了这么多文字后,我想念的是评论。 :)

        【讨论】:

          猜你喜欢
          • 2023-03-07
          • 2022-01-10
          • 1970-01-01
          • 2011-09-25
          • 2018-05-26
          • 2014-10-14
          • 2012-12-30
          • 2020-07-21
          • 2017-07-27
          相关资源
          最近更新 更多