找回密码
 注册
首页 ≡≡网络技术≡≡ 编程语言 漫谈rails与php

漫谈rails与php

灰儿 2010-12-7 15:57:07
我从接触php到现在已经有好几年了,并且其间一直就没有间断过。而接触rails则还是2006年才开始的,到现在也就几个月时间。
在这短短的几个月时间里,我阅读和了解了大量rails资料,练习了不少ruby代码,感觉大有收获,个人认为rails非常棒。
那么,相对PHP,rails哪些地方比较好呢?

一.框架 vs 语言

该节拿rails“框架”和php“语言”相互比较。

1.framework vs non-framework
PHP是一门编程语言,而rails是基于ruby语言的一个框架。原本语言应该和语言比,框架应该
和框架比。要是把PHP这门语言和rails这个框架比的话,那么这样的比较对于PHP则是不公平的。

PHP是作为一个web-application开发语言诞生的。属于non-framework(非框架)开发工具。早期PHP官方并没有正式的推出基于PHP的官方框架。

这样的结果不知不觉的诞生了无数种类繁多的“框架”(早在rails框架诞生以前就已经存在这些php框架)。只不过没有鲜明的提出来说而已。

而rails框架诞生后,PHP领域也出现了“框架热”,开始出现了一大批正式的构造者,出现了名目繁多的知名php框架。
那么,rails框架和这些php框架比较,有什么优势?而ruby语言和php语言比较,又有什么好处呢?

这是两个说来话长的问题。

首先我要说的是,rails框架和各种各样的php框架各有各的优势。这些优势具体是什么,我暂时不予理会,我说说框架之外各自的优势比较:

rails是标准,在ruby领域几乎就是唯一标准。从某种意义上来说,这也是一种优势。因为任何一个框架本身,就是一种标准,便于大家共同的交流。而各种各样的php框架太多了,初期会让人面临选择的痛苦,反而不是一件好事情。正所谓“带一块表心安理得,带两块表无所适从”,选择多了未必是好事情。而且若要在各种各样的php框架中相互切换的话,则要花费更多时间.

而rails“只此一家,别无分店”,所以便于ruby以及rails爱好者统一交流,而且rails作为一个框架,其各个部分都有相应的好的命名,因此相互交流就更准确而方便了。

因此从这个意义上讲,rails框架在这方面就比各种各样的php框架占据了一个优势(且不论框架本身的特性)。

但PHP比较出名的一些应用,例如wordpress,wikipedia,manbo等都有自己内部的一套特有框架结构(尽管有些只是'准框架'),这些应用已经占据了web应用的巨大市场,而php在虚拟主机占有率方面,远远超过rails.所以从这个意义上讲,php框架就比rails框架更有优势!

那么rails能否在主机占有率方面“后来居上”,甚至超越php的主机占有率呢?这个问题只能让时间来回答了。

2.MVC
您也许会感觉很奇怪,因为我现在要拿php这个'语言'和rails这个'框架'来比较了.
是的,拿语言和框架比,对于语言是不公平的。但php遗憾的地方就在于一开始就没有官方框架;从某种意义上说这是一种遗憾,但换一个角度看也是php的一个优势:php简单,快速,功能强大,容易掌握;没有抽象复杂的理论束缚,所以容易为大众接受。

尽管PHP没有官方框架(后来出现过zendFramework,一个php框架),但是php的开源世界里出现的各种各样的php应用里却有。自然的,MVC作为一种“模式”,一种思想,也能够在php应用中开花,结果。

但问题也在这里产生了:php的各种各样的应用,有些有mvc,有些则没有;而有MVC的各种php应用,其实现方式又各自有所不同。。。
而许多时候,php的使用者就是从“无框架”开始编程的,所以一开始并没有MVC这样的考虑,所以自然享受不到MVC带来的好处了。

而rails作为一个基于MVC的框架实现,直接把MVC的好处带给了rails的使用者,所以从这个意义上看,rails框架比php语言有优势(并非rails框架比php框架有优势,因为某些php框架的某些实现也能够和rails的某些部分媲美)

3.ORM
rails的ORM实现是ActiveRecord。php也有各种各样的ORM实现。但就我所了解的而言,rails的ORM实现更有优势。
4.generator
generator是为聪明而适度懒惰者设计的。这也是rails的优势
5.DRY(layout等)
rails处处贯彻DRY原则(不要重复你自己),有applicationController,application.rhtml,layout等“公用”文件来“提升”重复等等
6.ajax
没有哪个框架能够和rails对ajax的支持相媲美。尤其是RJS(Remote JavaScript)之类那种震撼人心的特性。
7.ruby
假如用面向对象的说法,那么可以认为"rails继承了ruby的所有好处"。所以凡是ruby语言有的好处,rails都具备。

从上面的比较可以看出,rails框架比php语言占据了上风。但是我一开始就说了,“拿框架和语言比较,对语言是不公平的”。对此我们可以设想如下:假如我拿一个比较成熟的php框架,例如cakephp,去和“ruby语言”(注意不是rails框架)比web应用的开发优势,那么毫无疑问,ruby根本就不是php框架的对手,ruby语言可以说是不堪一击(其实无需php框架,单是php语言本身就在web开发方面远胜ruby语言)。为什么说“拿框架和语言比较,对语言是不公平的”呢?您可以想象一下“张三骑摩托和李四徒步赛跑,于是张三说自己比李四跑得快”

大家应该知道,php语言和ruby语言都已经各自度过了十几个春秋,既然如此,为什么php能够先发制人而ruby却大器晚成呢?
下面我就拿ruby语言和php语言来比较一下。

二.ruby语言 vs php语言

ruby哪些地方比较好?

1.纯OOP(例如:string is an object)
在ruby中,“一切都是对象。”这个话如何理解?
一切都是对象,所以数字和字符串也是对象。那么“方法”是不是对象?显然方法不是对象。所以ruby中的这句话可以这样理解“一切被操作的东西以及操作产生的结果,都是对象”
换言之,ruby的对象观满足“操作封闭”原则。

什么叫“操作封闭”原则?让我们先考虑一下自然数的四则运算,那么我们说自然数的四则运算不是“操作封闭”的。为什么?因为某些自然数运算后的结果不是自然数,例如1-2的结果就不是自然数。

一般的,若某个集合上的任意运算的结果依然在这个集合里,则我们说在这个集合上的运算就是“操作封闭”的。

例如,实数的四则运算就是操作封闭的,因为+-*/这四个操作对任意实数的任意运算的结果,都是实数。

所以,ruby中“一切都是对象”,意思就是“在ruby中执行任意ruby方法,操作的是对象,并且任何操作所产生的结果也是对象,没有任何例外”。所以说,ruby是纯OO语言。

那么按照这个说法,则java就不是纯OO语言。所以java宣称自己“一切都是对象”就是名不副实的说法。因为在java中,数字就不是对象(而是类型)。所以java也就不满足“操作封闭”的原则.

“操作封闭”的直接后果,就是蕴含“最少惊讶原则”。因为我们操作的任何东西都是对象,同时操作产生的任意结果也是对象。而任何对象都符合统一的一套ruby规则,所以我们在使用这些对象及其ruby规则的时候,就不会感觉惊讶和意外:因为所有的东西都是对象,所有的对象都服从和谐而一致的规则。而不会像java等语言那样有时候是对象而有时候又不是。

因此,ruby的对象观是“操作封闭”的,从而也就满足“最少惊讶原则”。而php则不满足这一点(即使java也不满足)

2.Syntax
ruby和php的语法都以简介著称。但若比较哪个更优美的话,我认为ruby的语法样式更优美.
3.block
php提供的有回调函数的功能,我所知道的wordpress这个著名的php程序的回调钩子方法就是用它实现的,简介而强大。
而ruby的block则非常自然,随时都可以使用。而php的回调函数我并不愿意常常使用(没有ruby那么方便)。
ruby的block还有一些比较神奇的用法(php的回调函数也有一些神奇的用法,但比不上这里的ruby)
4.Reflection
php4的Reflection比较简单,而php5则比较复杂而麻烦。和ruby比较,ruby的Reflection实现比较优美。
5.Missing Methods
php5的类提供了名为"__call"的魔术方法,实现Missing Methods,而ruby则提供了名为"methods_missing"的方法。该处两者持平。
6.alias_method
ruby有,但php无。
7.正则表达式
两者对正则表达式的支持和处理在功能上不分上下,但我认为ruby对正则表达式的语法表示要友好一些。
8.类方法,类变量,实例变量,和访问方法
这是OO方面的内容,毫无疑问,如果说ruby比php的OO强一百倍,那也不是什么夸张的说法。
9.真假判定原则 nil and false are "false";else "true"
ruby对真假的认定规则比较简单“只有nil和false对象是假的,其他对象都是真的”
10.if语句是表达式
ruby的if语句可以返回值(对象),这个比较有意思;而php则没有(java也没有)
11.hash参数的花括号可以省略
ruby语法优美的一个例子
12.?和感叹号可以作为方法名
ruby在语法上表现语义的一个优美的地方
13.一气呵成
ruby中可以像“a.b.c...”这样使用对象及其方法,有一气呵成的感觉。
14.open class
ruby可以打开已经定义的类,添加新的方法,或者重定义已有方法而不用改动原始类的定义文件。
php没有这个特性
15.无处不执行
ruby特有
16.可以省略return语句(除非中途要返回值)
ruby比php更简介的一个例子
17.redefine
ruby可以重定义(以及可以同时重用)系统默认的方法。而php默认的函数是不可能被你重定义的
18.DSL
ruby是表示新的DSL的自然选择,而php本身是web方面的一个DSL,但不具有表示新DSL的优势。

由此可见,语言本身方面的比较,ruby语言比php语言占据优势(甚至java在某些oo方面也比不上ruby)。
那么,为什么php却比ruby语言流行呢?我想其中一个原因是因为“php从一开始就是为web应用而生的,而ruby则不是”

另外一些原因则是因为php比ruby更简单,其他原因则可能是因为ruby是在日本诞生的。。。等等
直到rails诞生后,ruby语言才如虎添翼般的为世界上的其他人所慢慢接受(也许应该说是很快?)。

三.rails与ruby语言

rails利用了ruby的哪些特性?

1.metaprogramming
2.open class
3.everything is an Object

最后,我想说的是php将继续发展下去,已经发布了的php5以及正在发展中的php6也将有一些新的特性加入。而rails也在不断
发展中。我相信rails和php一道,都有各自的一席之地。最后祝大家编程快乐.
zhouqing 2012-4-20 18:05:36
春天我把老公种下去,秋天我就有很多个老公了
您需要登录后才可以回帖 登录 | 注册
学习中心
站长自定义文字内容,利用碎片时间,随时随地获取优质内容。
Q设计语言 了解更多
Q Design 提供商家设计所需的指导与资源,帮商家快速完成产品设计、降低生产成本。
学习中心
站长自定义文字内容,利用碎片时间,随时随地获取优质内容。
Q设计语言 了解更多
Q Design 提供商家设计所需的指导与资源,帮商家快速完成产品设计、降低生产成本。