Ath*_*ari 30
(YaLinqo开发者在这里.)
目前,PHP中有三种主要的LINQ实现:
YaLinqo - 最简约的图书馆架构(4个班级),但最具特色,最高效,最好的文档和唯一一个支持"字符串lambdas".
Ginq - 一个平均大小的库(70个类),与YaLinqo的函数数量相当,大约慢1.5-3倍,包含自定义集合,迭代器和比较器,文档最多包含参数类型.
Pinq - 一个巨大的库(500个类),支持解析PHP并转换为SQL和其他所有东西,比其他更慢,有一个漂亮的网站,但它的文档是平均的,缺乏功能.
其他库不值得一提(嗯,好的,LINQ for PHP,Phinq,PHPLinq和Plinq).它们几乎没有经过测试,其中的评估并不是懒惰的,它们依赖于PHP和.NET开发人员不同的奇怪概念.PHPLinq是唯一一个实际支持数据库的人,但它更像是用于生成具有固定调用顺序而不是LINQ的SQL的DAL.
如果您问我选择哪个库,我只想说,如果您需要使用数组和对象以及任何ORM库(而不是LINQ),则需要使用YaLinqo.但我会试着解释原因.
YaLinqo是目前最快的图书馆.它设计得很快:它只依赖于生成器(生成最快的迭代器); 它只使用数组(没有自定义集合实现为数组的包装器).它的演变摆脱了缓慢和过时的特性:删除自定义集合,删除显式迭代器; 如果它提高了性能,则会降低代码质量:在多个排序函数之间进行选择,而不是使用一个通用解决方案,复制粘贴代码以减少函数调用的数量.
Ginq和Pinq采用了另一种方法,他们使用显式迭代器类.它咬了一大块性能,但允许使用迭代器与流畅的方法语法分开.
此外,他们都有性能陷阱.当您在Ginq中使用属性访问器语法时,您的代码变慢了5倍.当您尝试使用数组作为键时,还有一些惊喜等待着您.当你在Pinq中使用加入时,你的代码会慢几百或几千倍(我不是在开玩笑,请参阅下面的链接)在我的错误报告之后修复了Pinq加入的性能.
使用YaLinqo,它更简单:要么它不起作用(如键中的数组),要么它与预期的性能一起工作.版本1确实有一些黑客可以使它成为可能,就像在原始LINQ中,但当前版本没有.它可能需要一些调整:例如,您需要生成在相同情况下相等的密钥,而不是使用相等比较器.
参见文章:LINQ for PHP比较:YaLinqo,Ginq,Pinq on CodeProject,LINQ for PHP:速度对Habrahabr(俄语)很重要.它们涵盖了YaLinqoPerf,git存储库,性能测试比较了原始PHP,YaLinqo,Ginq和Pinq.
YaLinqo和Ginq中LINQ方法的数量以及它们的功能非常接近.我说没有明显的赢家,因为两个图书馆都提供了另一个没有的方法.它们大多是原始LINQ中不可用的额外方法,所以我不会太担心它.
平克看起来像一个荒凉的小镇.方法是准系统并且通常几乎不可用.在编写性能测试时,我经常不得不求助于针对Pinq的自定义更复杂的解决方案,而YaLinqo和Pinq的代码通常仅在方法名称(不同的命名约定:"desc"与"descending"等等)之间存在差异.
另一方面,Pinq是唯一支持解析PHP并从中生成SQL的人.不幸的是,唯一的查询提供程序是针对MySQL,其状态是"演示".因此,虽然Pinq具有这一独特功能,但遗憾的是它尚未使用.
如果你想让LINQ数据库成为现实,我猜你别无选择,只能开始为Pinq开发查询提供程序.这是一项非常复杂的任务,我怀疑一个开发人员能够为所有数据库单独生成高质量的查询提供程序.
对于YaLinqo而言,Ginq没有更高级的架构.在Ginq中使用where Set和Dictionary类,你会在YaLinqo中看到数组和只有数组.凡Comparer与EqualityComparer在Ginq使用,你会看到在YaLinqo关闭(或没有对应).从本质上讲,这是一个设计决策 - 库是否应该使用这种语言的程序员自然的概念,或者使用其他语言的程序员.图书馆刚刚做出了选择.
应该注意的是,更复杂的架构并不等于良好的实现.例如,Ginq public function hash($v) { return sha1(serialize($v)); }用于计算"集合"中的关键哈希值.
YaLinqo在PHPDoc和在线(从PHPDoc生成)中获得了很好的参考文档.它主要是来自MSDN的LINQ in .NET的文档,适用于PHP.如果你知道什么是MSDN,你就会知道它的质量.
Ginq的文档几乎不存在,它通常只包含参数类型提示.
Pinq的文档相对较好(每个主要方法都有一两句解释它的作用),但它与YaLinqo的文档不相符.
Ginq和Pinq都在网上有很好的介绍性文章,向新开发者解释概念.除了ReadMe中的一个疯狂的例子之外,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如果你有任何补充,或者认为我有偏见,请发表评论.在写了这么多文字之后,评论是我想念的.:)
Jus*_*ner 27
| 归档时间: |
|
| 查看次数: |
30287 次 |
| 最近记录: |