(这里是 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 中使用 Set 和 Dictionary 类的地方,你会在 YaLinqo 中看到数组并且只有数组。在 Ginq 中使用 Comparer 和 EqualityComparer 时,您会在 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。
附:如果您有任何补充,或者认为我有偏见,请发表评论。写了这么多文字后,我想念的是评论。 :)