1樓
一直以來,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學了。