PHP支持的编程范式

翻了翻PHP的版本历史,发现PHP每次发布新版本都非常有诚意,而且不停的吸收其他语言的优点。当然,PHP每次的学习都会被骂“学又学不好,为什么还要去学?”!如果我们把每个语言都比作一个孩子,PHP一定是最普通的那个。成绩一般家庭条件一般,但是心态好并且很好学。就像小时候的大多数人一样。如果你小时候是这样,那一定要学学PHP。一起回顾PHP是如何从一门普通的语言发展成为处理web最卓越语言的过程。

最新版的PHP 5.6支持四种编程范式,分别是‘面向过程’,‘面向对象’,’函数式编程’,’元编程’。每一种编程范式都是一种世界观和方法论,都可以作为一个课题来研究。不过这些招式都是PHP从其他语言学来的。今天就围绕PHP的学习历史来讲讲。

一。编程范式

所谓编程范式(programming paradigm),指的是计算机编程的基本风格或典范模式。借用哲学的术语,如果说每个编程者都在创造虚拟世界,那么编程范式就是他们置身其中自觉不自觉采用的世界观和方法论。我们知道,编程是为了解决问题,而解决问题可以有多种视角和思路,其中普适且行之有效的模式被归结为范式。

一种范式可以在不同的语言中实现,一种语言也可以同时支持多种范式。比如,PHP可以面向过程编程,也可以面向对象编程。任何语言在设计时都会倾向某些范式,同时回避某些范式,由此形成了不同的语法特征和语言风格。抽象的编程范式须要通过具体的编程语言来体现。范式的世界观体现在语言的核心概念之中,范式的方法论体现在语言的表达机制中。一种语言的语法和风格与其所支持的编程范式密切相关。

强烈推荐大家去看斯坦福大学的编程范式公开课。
http://v.163.com/movie/2008/1/Q/9/M6SL23BRS_M6SL2J9Q9.html

二。面向过程编程

面向过程编程是最为实际的一种编程思考方式。也是我们刚学编程最容易接受的一种编程思想,因为与我们平时思考问题的方式如出一辙。主要步骤是从上往下步步求精,当程序规模不是很大时,因为程序的流程很清楚,所以通过模块与函数可以很好的组织。

面向过程编程最大的贡献就是提出了代码模块化的思想。可以说模块化编程为今后的各编程语言奠定了基础。为什么这样说?对军事感兴趣的同学应该知道兵器模块化的重要性,拆枪和拼枪可是士兵的必修课。我国秦朝生产兵器就有模块化的思想,每个模块上都有刻上生产人和时间,战场上随便都能拼出一把弩。他带来的好处大家可大开脑洞想想。

从PHP诞生那天开始,就支持面向过程编程,这是继承自C和PERL(PHP是使用C语言开发,参考PERL的语法)。说到这里要提一下,因为人类思考问题的方式与面向过程的思考方式很类似,所以最开始接触编程时建议学习C语言,因为C语言就是完全面向过程的语言。

三。面向对象编程

所谓面向对象编程,就是把所有事物都抽象成对象。举个例子:如果要编代码记录我们每天都做了什么事情,以前通过面向过程是写很多方法,比如吃饭,喝水,散步。面向对象则是把人看作一个对象(这里的对象是术语,非伴侣),这个对象要吃饭,喝水,散步。然后我们每个人都能通过这个对象的实现记录自己每天做了什么,小明可以小红也可以,只要是人都可以。发现没有,相比面向过程我们思考问题的方法已经变了。

插入一个笑话:
有一天外星人Boss要程序员小明写个程序把地球炸了……本来小明应该去研究地球的构成,需要用多少核弹。结果小明跑去研究了地球,月亮,太阳……。过了几天,小明写了个程序。把“地球”当作参数传进去……

面向对象编程的思想已经与面向过程大不相同。更多的考虑了程序的复用,而少了对程序效率的考虑。造成这种现象的原因,除了软件开发需求越来越多,硬件发展也越来越快外。大部分业务场景开发速度的优先级已经高于性能考量。这是一种折中的考虑,并不是说写代码的时候就完全不考虑代码运行的效率了。就像现在为什么很少用汇编语言一样。

PHP从PHP 3开始有了基本的面向对象的特性(虽然我没用过那么老的版本,但是从前辈们口中知道被骂的很惨)。PHP4出来后实现了面向对象一些简单的功能,比如重载(其实是覆盖),相比PHP3被喷的更惨,我这种菜鸟都喷过,比如有些人骂“PHP的开发人员就是吃shi的,自己都没弄懂面向对象就开始写代码”。现在回过头来看,那个时候好幼稚。PHP的代码维护成员个个都属于科学家级别,而且是那种代码写的好的科学家,随便找个人出来都能当微博的首席架构师(这里特指http://www.laruence.com/)……

PHP5重写了面向对象模块的代码,到PHP5.3面向对象基本修成正果(很多人到现在都认为PHP面向对象支持不好,那是因为那些人还停留在PHP5.3以前)。不过PHP的面向对象的实现方法还是和Java C#有许多不同,下面举例说明。

说到面向对象就要说到封装,继承,多态。而PHP在继承和多态的实现上有些不一样。

继承:
PHP支持实现多个接口,但只能继承自一个父类。这就有人要问了,我要实现多继承怎么办?早期PHP只能通过程序员自己写代码实现伪多继承,而PHP 5.4引入了Traits,虽然实现方法与Java不一样,不过确实解决了多继承的问题。

多态:
PHP不支持一个类中有多个名称一样的方法(参数不一样也不行)。但是PHP的函数参数可以添加默认的值,比如 function test($a,$b=0,$c=1){},通过类似方法简单实现多态。

本来我最想讲的是PHP的“函数式编程”和“元编程”,最后发现单独写知识串不起来,最终还是一起写了,一篇可能写不完,第二篇更精彩,敬请期待。