`
axgle
  • 浏览: 93586 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

漫谈rails与php

阅读更多
作者:艾雄
我从接触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一道,都有各自的一席之地。最后祝大家编程快乐.

2006年12月10日
分享到:
评论
15 楼 aguang3190076 2006-12-27  
其实方法就是对象
如果要把方法用对象不操作
需要把它从实例对象中解除绑定
c.unbind("talk")
然后可以随意绑定到任意他的子类的实例中
其实说方法不是对象不能随便用c.balk.class来检测

而要以OO的角度来理解什么是对象
14 楼 ztka 2006-12-26  
我觉得是开发 配置成本的问题,另外就是成熟的应用程度,php出来的时候有多少web语言??现在有多少web语言??10年前的bug当然不算什么 10年以前的web应用少,现在呢??php已经在web扎稳了,就如同c一样,就算rubby再好 应用程度远远小于php
13 楼 aotianlong 2006-12-22  
方法是对象!

--------
class.class
请把前面的换成大写的行不行

或者换成
self.class.class.class.class.class.class.class.class一直class下去吧




12 楼 bencode 2006-12-21  
<script language="javascript" type="text/javascript">
function f() {
alert("hi");
}

function g(k) {
k();
}

g(f);
</script>
11 楼 bencode 2006-12-21  
javascript 就是
10 楼 cookoo 2006-12-14  
>> c = "abc".method :class         
=> #<Method: String(Kernel)#class> 
>> c.call
=> String
>> c.methods                                                                    
=> ["call", "methods", "instance_eval", "dup", "instance_variables", "instance_o
f?", "extend", "arity", "eql?", "po", "hash", "id", "singleton_methods", "taint"
, "frozen?", "instance_variable_get", "to_proc", "kind_of?", "to_a", "pretty_pri
nt_cycle", "unbind", "pretty_print_inspect", "type", "poc", "protected_methods",
 "__clone__", "instance_variable_set", "is_a?", "to_s", "respond_to?", "pretty_p
rint", "class", "method", "tainted?", "==", "private_methods", "===", "__id__", 
"require_gem", "nil?", "untaint", "pretty_print_instance_variables", "send", "di
splay", "pretty_inspect", "inspect", "=~", "gem", "ri", "clone", "public_methods
", "__send__", "object_id", "freeze", "equal?", "require", "[]", "what?"]       
9 楼 charon 2006-12-13  
axgle 写道

我不知道有没有什么编程语言,连其中的“方法”也是对象的。知道的人说一声,谢谢啦

python就是这样的。
8 楼 dongbin 2006-12-13  
我说的“过程即数据”指的是函数高阶演化时,在LISP中分不清,也没有必要分清一个符号是过程还是数据。这种高度统一得益于LISP简洁的语法。

而楼主说的自然语言和Ruby的相似性正表明了Ruby相比其他语言更适合作DSL,Rails本身就是Web开发的DSL。
7 楼 axgle 2006-12-13  
dongbin 写道

其实LISP更容易解释“过程即数据”这个思想。而对象可以看作“包含状态”的过程。这个时候所谓的方法还是对象本身就没有区别。

按照我的理解,“过程即数据”是“动词名称化现象”
从自然语言(英语,汉语等)的角度看,对象是名词,方法是动词.例如:boy.kiss(girl)
但是自然语言中依然存在“动词名称化现象”,例如"我给了她一个吻",这里的“吻”就是“动词名称化现象”
但是无论如何,名词和动词是有区别的,尽管动词可以转化为名词(例如:吻)
所以ruby的规则是符合自然语言的规则的:名词是名词,动词是动词,但是动词(或者过程)可以转化为名词(借助block=>course机制)
一般来说,ruby语言比较接近自然语言的许多规则,这点非常难得。
6 楼 dongbin 2006-12-13  
楼主把对语法的推敲引申到方法是不是对象这个比较宽泛的题目上来了。具体概念和抽象概念之间比较起来有些困难。
其实LISP更容易解释“过程即数据”这个思想。而对象可以看作“包含状态”的过程。这个时候所谓的方法还是对象本身就没有区别。
5 楼 axgle 2006-12-13  
在ruby中,“方法”不是对象。理由如下:
按照ruby的OO特性,任何对象都有"class"这个"方法",用于返回该对象所属的“类”.例如:
1.class
=>Fixnum
"abc".class
=>String
Hash.new.class
=>Hash
等等。
假如说“任何方法也是对象的话”,那么"class这个方法本身也有class这个方法":),因此可以写出如下代码:
class.class
=>返回语法错误
可见class这个方法在ruby中不是对象。否则不会出现语法错误。

在ruby中的‘closure’是对象,因此可以对该类对象使用class方法而不会出现语法错误。

例如大家都知道的:一段ruby代码,就可以转化为closure对象.但是这段代码在转化以前,其代码本身却不是对象(包括其中的方法在内).

作为我前面观点的一个验证,你可以发现:代码“1.class”表示是用class这个ruby默认就有的方法,去操作"1"这个对象。那么操作的结果是Fixnum。而这个Fixnum依然是一个“对象”,所以该对象可以继续被class这个方法操作。所以,你可以写这样的代码
1.class.class
=>Class
返回结果是Class,这个依然是一个对象,所以只要你乐意,你可以继续class下去而无需担心出现一个不是对象的东西。

我不知道有没有什么编程语言,连其中的“方法”也是对象的。知道的人说一声,谢谢啦

4 楼 刑天战士 2006-12-13  
ruby每个东西都是对象吧,方法只不过是动态的附在了Object对象上
3 楼 taowen 2006-12-13  
proc block closure?
2 楼 gigix 2006-12-13  
引用
那么“方法”是不是对象?显然方法不是对象。

我怎么记得Ruby的方法就是closure呢?
1 楼 dongbin 2006-12-13  


引用
那么,为什么php却比ruby语言流行呢?我想其中一个原因是因为“php从一开始就是为web应用而生的,而ruby则不是”


这一点指的是什么呢?


相关推荐

Global site tag (gtag.js) - Google Analytics