php和js的比较
一直以来,php和js一样,都被视做脚本语言。的确,他们两者蛮像的。首先他们都是弱类型语言,定义变量的时候不需要指定某个具体类型,变量类型可以实现隐式转换。虽然很多人说这样会带来很多一些潜在的问题,但事实上,我并没有感到到这种潜在问题,相反的,他们带来的编程上的方便,的确让我感到了很大的自由。比起as3中动辙就需要加上.toString(),我太喜欢as2,js和php这样隐式转换的方式了。
其次呢,让我感觉他们很像的地方在于他们编程的核心,都可以看做是函数的调用。用函数来做mvc的model,然后在面向过程的语句中,把函数调出来,传入参数,返回需要的结果,或者直接进行了某些操作。当然了,这是他们的一些普通应用。现在已经越来越要求用oop的方式来实现编程了。怎么说呢,不论是以函数为核心实现model功能,还是以类为核心实现model功能,其实本质上是一样的。只是php的面向对象更像java,而js的面向对象更有自己的风格。不论类的实现表现有如何不同,实质上的应用还是一样的,定义类,通过构造函数实例化成对象,然后调用对象的方法去实现功能。和以函数为核心的编程思想,最大的不同在于代码的组织更系统。
但他们还是有些区别的。一个最大的区别在于php中的核心功能是用函数方式实现,而js是用对象的方法实现。举个简单的例子说吧,如果要取得一个字符串的长度,用js是这样写的,var length = str.length; 而php是用 $length = strlen(str);来实现。js是用"对象.属性"方法来取得,而php是用"函数(参数)"的方法来取得。这让我不由得想起了as1和as2的区别。在as1中,我们一般用"函数(参数)"的形式来取得想要的值,而到了as2,我们就习惯用"对象.属性"的方式取得值了。比较而言,as2中的方式比as1中要直观得多,很容易理解,写起来会觉得顺手得多。很明显,as2比起as1,当然是进步了很多。那么我想,同样做为脚本语言,js的内核是不是比php的内核要先进呢?记得在看《javascript高级程序设计》的时候,看到里面提到string.length的问题,很明显,这是对象.属性的格式,可是,string只是一个变量啊,它不是对象啊,变量可以直接有属性吗??其实是js的内核在解释这里的时候,会先判断一下结构,发现是在调用字符串型变量的属性,就会把字符串隐式地变成对象,相当于String(string).length,再然后调用这个对象的length属性返回来,只是这一切只在解释到这里时隐式地进行的。虽然表面看起来是在调用字符串变量的属性,其实仍然是在调用String对象的属性,对string这个字符串型变量则做为构造函数的参数进行了String类的实例化。我想as2的内核也一定是进行了如此的设计,才让as1的基于函数的模式进化到了as2中基于对象的模式了吧。我觉得这样的方法很好啊,为什么php没有把这种方法设计到php的内核中去呢??
另外还有一个很大的不同,在于变量的传值问题。在js中,变量的传值传递和传址传递是根据传递的对象的类型决定的,不能自己随心控制。具体来说,js中的基本类型,比如说字符型,数字型,布尔型都是用的传值方式,而复杂数据类型,比如对象型和数组型是采用的传址方式。这些都没办法自己控制的。所以在js的继承问题上,才有用for( in )的方式,把对象中的属性一项一项传给别一个对象的属性,来实现继承,在改变子类的时候,不影响超类(当然,有更好的方法,用call()方法)。这样是绕了多大一个圈子啊!相比而言,php的传值问题就强大多了,php中所有类型都可以自由控制其传值是传值还是传址,在变量前加上&就可以变成传址方式,不加&就是传值方式。这样,在传数组和对象的时候,真是太方便了。这点,js应该跟php学了。