作者:艾雄
我从接触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日
分享到:
相关推荐
Ruby核心团队成员Aaron Patterson完成了phuby,它可以在Rails应用下运行php应用程序。项目的地址在https://github.com /tenderlove/phuby,尽管项目主持人Aaron发布了几个视频去证明phuby能让php在Rails下运行,但...
《Ruby on Rails与MySQL环境配置详解》 在开发基于Web的应用程序时,Ruby on Rails(简称Rails)框架和MySQL数据库的结合是常见的选择。本文将详细介绍如何在Windows环境下配置Ruby on Rails以支持Rails 2.3.5及...
### Rails 101 入门电子书知识点详解 #### 一、简介 《Rails 101 入门电子书》是一本非常适合初学者直接入门的书籍,它由xdite编写并出版于2014年6月10日。本书主要针对的是希望学习Ruby on Rails框架的读者,特别...
《Rails101_by_rails4.0》是一本专注于Rails 4.0.0版本和Ruby 2.0.0版本的自学教程书籍,它定位于中文读者,旨在成为学习Rails框架的参考教材。Rails(Ruby on Rails)是一个采用Ruby语言编写的开源Web应用框架,它...
Rails使用ActiveRecord作为ORM,它使得Ruby类可以直接与数据库表进行交互。在这个项目中,`User`和`Image`模型可能会与数据库中的相应表关联,通过定义属性和关系,如`has_many :images`表示一个用户可以拥有多个...
Cucumber-Rails集成了Cucumber与Rails,使得开发者能够在Rails环境中方便地使用Cucumber进行功能测试。 在 Rails 应用中使用 Cucumber-Rails,开发者可以创建一个名为`features`的目录,里面包含这些Gherkin特性...
adminlte-rails, AdminLTE Rails gem 将AdminLTE主题与 Rails 资产管道集成 AdminLTE Rails gem AdminLTE 是后端的高级 Bootstrap 主题。英镑 AdminLTE Rails gem 与 Rails 资产管道集成了英镑AdminLTE主题。安装将...
1. **约定优于配置**(Convention Over Configuration):Rails通过默认的约定减少开发者需要明确配置的细节,如数据库表名与类名的对应关系。 2. **Active Record**:这是Rails中的ORM(对象关系映射)库,它允许...
标题 "使用Rails 数据库DSL与PHP协作开发 - 色色" 暗示了这篇博文将探讨如何在Rails框架中使用数据库领域特定语言(DSL)来与PHP进行协同开发。Rails是Ruby on Rails的简称,它是一个基于Ruby语言的开源Web应用框架...
模型负责与数据库交互,管理数据;视图用于展示数据给用户;控制器则处理用户请求,协调模型和视图之间的操作。了解并正确运用MVC模式是构建高效、可维护的Rails应用的关键。 #### 6. Helpers, Forms, and Layouts...
5. **Gemfile与Bundler**:Rails项目通常使用Gemfile来管理依赖库,Bundler工具则用于安装和管理这些依赖,确保在不同环境下项目的运行一致性。 6. **Scaffolding**:Rails提供了快速生成基本CRUD(Create, Read, ...
本教程将详细介绍如何使用Aptana与Rails结合,创建一个功能完备的Web应用程序。 首先,我们需要安装Aptana Studio。你可以从其官方网站下载最新版本的安装包。安装过程中,遵循提示进行,确保选择自定义安装并勾选...
- **重要概念**:本指南旨在帮助读者深入理解Ruby on Rails(以下简称Rails)4.2.5版本的核心功能与最佳实践。 - **基础假设**:读者已经具备一定的Ruby编程基础,并对Web开发有一定的了解。 #### 二、什么是Rails...
[Ruby_on_Rails][中文][Rails_5.x]__03-2_._安裝不同版本的Rails與產生Rails_5.x版
标题 "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 ...
- 描述了组件化思想的历史,并探讨了它与Rails过往版本的关系。 8. LeanPub出版过程: - LeanPub出版过程是一种轻量级的电子书出版方式,通过不断地迭代和读者反馈来调整内容,直到最终得到读者认可的版本。 - ...
1. **ActiveRecord**:这是Rails的ORM(对象关系映射)组件,它允许开发者通过Ruby对象与数据库进行交互,无需编写SQL代码。 2. **ActionController**:负责处理HTTP请求,并将数据转发给相应的模型和视图。它管理...
描述中的 "ruby and rails 的框架rails-2.3.3.zip" 提到的是 Rails 的另一个版本 2.3.3,尽管与标题中的版本号不完全匹配,但我们可以推断这是关于 Rails 2.3.x 系列的讨论。这个压缩包很可能包含了 Rails 框架的源...
它允许Rails应用作为客户端,通过HTTP与遵循REST原则的远程资源进行交互,从而实现数据的获取和更新。 5. **rake-0.8.1.gem**:Rake是Ruby社区广泛使用的构建工具,类似于Java的Ant或Python的setup.py。它允许...