7 回答
试试雅灵奇。它是 PHP 的最佳 LINQ。
这是一个比较表:
(这里是 YaLinqo 开发者。)
目前,在 PHP 中主要有 LINQ 的三种实现:
YaLinqo — 架构方面最简约的库(4 个类),但功能最多、性能最高、文档最好,并且唯一支持“字符串 lambda”。
Ginq — 一个平均大小的库(70 个类),在函数数量上与 YaLinqo 相当,大约慢 1.5-3 倍,包含自定义集合、迭代器和比较器,文档最多包含参数类型。
Pinq — 一个巨大的库(500 个类),支持解析 PHP 并转换为 SQL 和其他一切,比其他的慢得多,有一个漂亮的网站,但它的文档是平均的,并且缺乏功能。
其他库不值得一提(嗯,好吧,LINQ for PHP、Phinq、PHPLinq 和 Plinq)。它们几乎没有经过测试,它们的评估并不懒惰,它们依赖于 PHP 和 .NET 开发人员都陌生的奇怪概念。PHPLinq是唯一真正支持数据库的,但它更像是用于生成具有固定调用顺序的 SQL 而不是 LINQ 的 DAL。
如果你问我选择什么库,我只想说如果你需要使用数组和对象以及任何 ORM 库(而不是 LINQ),那么当你需要使用数据库时使用 YaLinqo。但我会尝试解释原因。
表现
YaLinqo 是迄今为止最快的库。它的设计速度很快:它只依赖于生成器(生成最快的迭代器);它仅使用数组(没有实现为数组包装器的自定义集合)。它的演变正在摆脱缓慢和过时的功能:删除自定义集合,删除显式迭代器;如果提高性能,代码质量会恶化:在多个排序函数之间进行选择,而不是使用一种通用解决方案,复制粘贴代码以减少函数调用的次数。
Ginq 和 Pinq 采用了另一种方法,它们使用显式迭代器类。它会降低性能,但允许将迭代器与流畅的方法语法分开使用。
此外,它们都有性能陷阱。当你在 Ginq 中使用属性访问器语法时,你的代码会慢 5 倍。当您尝试使用数组作为键时,还有惊喜等着您。当您在 Pinq 中使用加入时,您的代码会变慢数百或数千倍(我不是在开玩笑,请参阅下面的链接)在我的错误报告之后,加入 Pinq 的性能得到了修复。
使用 YaLinqo,它更简单:要么它不工作(如键中的数组),要么它以预期的性能工作。版本 1 确实有一些 hack 使其成为可能,就像在原始 LINQ 中一样,但当前版本没有。它可能需要一些调整:例如,您需要生成在相同情况下相等的键,而不是使用相等比较器。
请参阅文章: PHP 的 LINQ 比较:CodeProject上的 YaLinqo、Ginq、Pinq, PHP 的 LINQ: 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 开发查询提供程序。这是一项非常复杂的任务,我怀疑一个开发人员是否能够单独为所有数据库生成高质量的查询提供程序。
Ginq 拥有 YaLinqo 所没有的是更高级的架构。在 Ginq 中使用whereSet
和Dictionary
classes,您将在 YaLinqo 中看到数组和仅数组。在Ginq 中使用Comparer
和EqualityComparer
的地方,您会在 YaLinqo 中看到闭包(或没有等效项)。从本质上讲,这是一个设计决策——库是应该使用对这种语言的程序员来说很自然的概念,还是对习惯于使用其他语言的库的程序员来说。图书馆刚刚做出了选择。
应该注意的是,更复杂的架构并不等于好的实现。例如, Ginqpublic 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。
PS如果您有任何补充,或者认为我有偏见,请发表评论。写了这么多文字后,我想念的是评论。:)
在过去的几年里,PHP 世界发生了很多变化,使得大多数以前的答案都过时了。
这是 PHP 的主要 LINQ 实现的新比较表:
这些库都可以通过composer安装。
总之,我会推荐PINQ库(因为我是作者,所以我有偏见),因为它得到了积极的维护、有据可查的记录和测试,并在 PHP 中提供了真正的 LINQ 实现。
通过真正的 LINQ,我的意思是该库不仅是用于内存数组的流畅的集合 API,而且还使用表达式树实现了真正的查询解析。这允许将此 API 与外部数据源集成,因此P HP In集成查询。可以在此处查看此类功能的演示,其中查询被编译成 SQL 并针对 MySQL 数据库运行:
还有一个phinq,它有一个比 PHPLinq 更新的版本,它看起来更像LINQ to Objects for C# 而不是 PHPLinq。
这个问题的答案说
看教义。
Doctrine 1.2 实现了 Active Record。Doctrine 2+ 是一个 DataMapper ORM。
另外,请查看 Xyster。它基于数据映射器模式。
另外,看看 DataMapper 与 Active Record。
请参阅PHPLinq(一组模仿 C#3.0 的 LINQ 的 PHP 类)。