PHP 与 Javascript 的一些比较

小菜鸟战斗机 2018-3-28 196

一直以来,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 学了。


最新回复 (0)
返回