`
axgle
  • 浏览: 94270 次
  • 性别: 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则不是”


这一点指的是什么呢?


相关推荐

    Rails下运行PHP程序Phuby.zip

    Ruby核心团队成员Aaron Patterson完成了phuby,它可以在Rails应用下运行php应用程序。项目的地址在https://github.com /tenderlove/phuby,尽管项目主持人Aaron发布了几个视频去证明phuby能让php在Rails下运行,但...

    ruby on rails与MySql的环境配置——支持rails 2.3.5以上版本

    《Ruby on Rails与MySQL环境配置详解》 在开发基于Web的应用程序时,Ruby on Rails(简称Rails)框架和MySQL数据库的结合是常见的选择。本文将详细介绍如何在Windows环境下配置Ruby on Rails以支持Rails 2.3.5及...

    Rails 101 入门电子书

    ### Rails 101 入门电子书知识点详解 #### 一、简介 《Rails 101 入门电子书》是一本非常适合初学者直接入门的书籍,它由xdite编写并出版于2014年6月10日。本书主要针对的是希望学习Ruby on Rails框架的读者,特别...

    Rails101_by_rails4.0

    《Rails101_by_rails4.0》是一本专注于Rails 4.0.0版本和Ruby 2.0.0版本的自学教程书籍,它定位于中文读者,旨在成为学习Rails框架的参考教材。Rails(Ruby on Rails)是一个采用Ruby语言编写的开源Web应用框架,它...

    Rails项目源代码

    Rails使用ActiveRecord作为ORM,它使得Ruby类可以直接与数据库表进行交互。在这个项目中,`User`和`Image`模型可能会与数据库中的相应表关联,通过定义属性和关系,如`has_many :images`表示一个用户可以拥有多个...

    关于rails 3.1 cucumber-rails 1.2.0

    Cucumber-Rails集成了Cucumber与Rails,使得开发者能够在Rails环境中方便地使用Cucumber进行功能测试。 在 Rails 应用中使用 Cucumber-Rails,开发者可以创建一个名为`features`的目录,里面包含这些Gherkin特性...

    adminlte-rails, AdminLTE Rails gem 将AdminLTE主题与 Rails 资产管道集成.zip

    adminlte-rails, AdminLTE Rails gem 将AdminLTE主题与 Rails 资产管道集成 AdminLTE Rails gem AdminLTE 是后端的高级 Bootstrap 主题。英镑 AdminLTE Rails gem 与 Rails 资产管道集成了英镑AdminLTE主题。安装将...

    Rails

    1. **约定优于配置**(Convention Over Configuration):Rails通过默认的约定减少开发者需要明确配置的细节,如数据库表名与类名的对应关系。 2. **Active Record**:这是Rails中的ORM(对象关系映射)库,它允许...

    使用Rails 数据库DSL与PHP协作开发 - 色色

    标题 "使用Rails 数据库DSL与PHP协作开发 - 色色" 暗示了这篇博文将探讨如何在Rails框架中使用数据库领域特定语言(DSL)来与PHP进行协同开发。Rails是Ruby on Rails的简称,它是一个基于Ruby语言的开源Web应用框架...

    rails2-sample

    模型负责与数据库交互,管理数据;视图用于展示数据给用户;控制器则处理用户请求,协调模型和视图之间的操作。了解并正确运用MVC模式是构建高效、可维护的Rails应用的关键。 #### 6. Helpers, Forms, and Layouts...

    rails指南 中文版

    5. **Gemfile与Bundler**:Rails项目通常使用Gemfile来管理依赖库,Bundler工具则用于安装和管理这些依赖,确保在不同环境下项目的运行一致性。 6. **Scaffolding**:Rails提供了快速生成基本CRUD(Create, Read, ...

    使用Aptana+Rails开发Rails Web应用(中文)

    本教程将详细介绍如何使用Aptana与Rails结合,创建一个功能完备的Web应用程序。 首先,我们需要安装Aptana Studio。你可以从其官方网站下载最新版本的安装包。安装过程中,遵循提示进行,确保选择自定义安装并勾选...

    Ruby on Rails Guides v2 - Ruby on Rails 4.2.5

    - **重要概念**:本指南旨在帮助读者深入理解Ruby on Rails(以下简称Rails)4.2.5版本的核心功能与最佳实践。 - **基础假设**:读者已经具备一定的Ruby编程基础,并对Web开发有一定的了解。 #### 二、什么是Rails...

    03-2 . 安装不同版本的Rails与产生Rails 5.x版专案

    [Ruby_on_Rails][中文][Rails_5.x]__03-2_._安裝不同版本的Rails與產生Rails_5.x版

    rails3.1安装与mysql配置 windows

    标题 "rails3.1安装与mysql配置 windows" 涉及到的是在Windows操作系统上安装Ruby on Rails 3.1框架并配置MySQL数据库的过程。这是一个关键的开发环境设置步骤,对于使用Rails进行Web开发的程序员来说至关重要。Ruby...

    rails 2.3.2离线安装rails 2.3.2离线安装

    rails 2.3.2离线安装rails 2.3.2离线安装rails 2.3.2离线安装rails 2.3.2离线安装rails 2.3.2离线安装rails 2.3.2离线安装rails 2.3.2离线安装rails 2.3.2离线安装rails 2.3.2离线安装rails 2.3.2离线安装rails ...

    component base rails applications

    - 描述了组件化思想的历史,并探讨了它与Rails过往版本的关系。 8. LeanPub出版过程: - LeanPub出版过程是一种轻量级的电子书出版方式,通过不断地迭代和读者反馈来调整内容,直到最终得到读者认可的版本。 - ...

    Rails相关电子书汇总

    1. **ActiveRecord**:这是Rails的ORM(对象关系映射)组件,它允许开发者通过Ruby对象与数据库进行交互,无需编写SQL代码。 2. **ActionController**:负责处理HTTP请求,并将数据转发给相应的模型和视图。它管理...

    rails2.3.2

    描述中的 "ruby and rails 的框架rails-2.3.3.zip" 提到的是 Rails 的另一个版本 2.3.3,尽管与标题中的版本号不完全匹配,但我们可以推断这是关于 Rails 2.3.x 系列的讨论。这个压缩包很可能包含了 Rails 框架的源...

    rails本地安装包完整版

    它允许Rails应用作为客户端,通过HTTP与遵循REST原则的远程资源进行交互,从而实现数据的获取和更新。 5. **rake-0.8.1.gem**:Rake是Ruby社区广泛使用的构建工具,类似于Java的Ant或Python的setup.py。它允许...

Global site tag (gtag.js) - Google Analytics