Php 3.x與4.x中關於物件程式設計的不相容問題之一 構造器說 (轉)

worldblog發表於2008-01-21
Php 3.x與4.x中關於物件程式設計的不相容問題之一 構造器說 (轉)[@more@]

3.x與4.x中關於的不相容問題

  “物件導向”聽起來是個很流行的詞彙,似乎到了如果你還沒有,那不如回家種白菜的地步。
  Php從版本3.x開始支援物件程式設計,雖然它的Class從一開始就飽受員們的指責,但它的確給我們帶來了意外的驚喜。一路跌跌撞撞走來,到了4.x,Php已經相當OOP了。當然,它對於類變數的處理依然不能讓人滿意,沒有私有、公有、保護、靜態的宣告方法。Php物件導向的可用性不在本文討論範圍內。
  伴隨著4.x中關於物件程式設計的完善,Php team給我們帶來了些許“麻煩”:3.x和4.x中關於物件程式設計的一些遊戲規則改變了,不相容。筆者就實際開發過程遇到的問題稍作討論,相信有些問題可能筆者尚未遇到,歡迎諸位補充、共賞。

一、構造器()說
  在3.x中,構造器指的是與類同名的類函式。有點拗口,不過更拗口的還有。在4.x中,構造器指的是在構造器內部直接定義的與類同名的類函式,就是說不包括繼承來的類函式。比如:
1、 

  class ABabyStudio
  {
    function ABabyStudio(){
  echo('call constructor'.chr(13));
  }
  //...
  }

註釋:
  在3.x和4.x中效果相同
2、

  class ABaby
  {
  function ABabyStudio(){
  echo('ABabyStudio');
  }
  }
  class ABabyStudio
  {
  //...
  }

註釋:
  在3.x中類ABabyStudio有構造器,從父類ABaby繼承獲得;在4.x中將沒有構造器。讀者可試執行這樣一行程式碼
  $ABabyStudio=new ABabyStudio();
  在3.x版本中應該會輸出“ABabyStudio”,而4.x中則不會輸出。

  還有一點值得注意的是,在4.x中規定例項化一個物件時,只能為類變數指定常量值(或稱作標量值)作為初始值。如果想要透過變數(通常是全域性變數)、物件、設定初始值,應該在構造器中進行操作。比如:
3、

  class ABaby
  {
  //...
  }
  class ABabyStudio
  {
  var $ababy='hello every one';  //sentence 1
  var $ababy='hello'.' world ';  //sentence 2
  var $ababy=new ABaby();  //sentence 3
  var $ababy=array();  //sentence 4
  var $ababy=g_hello;  //sentence 5,g_hello is a constant
  function ABabyStudio(){
  echo('call constructor'.chr(13));
  }
  //...
  }

註釋:
  5個標示的sentence只有1、4、5可以在4.x下透過。不過,筆者沒有了解Php工作組為什麼讓sentence 4透過,只能強迫自己理解為:array被作為一種基本資料型別,array()不被看作方法或表示式。

4、

  class ABaby
  {
  //...
  }
  class ABabyStudio
  {
  var $ababy;
  function ABabyStudio(){
  $this->ababy='hello every one';
  $this->ababy='hello'.' every'.' one';
  $this->ababy=new ABaby();
  $this->ababy=array();
  $this->ababy=g_hello;
  echo('call constructor'.chr(13));
  }
  //...
  }

註釋:
  這段程式碼在3.x和4.x都能夠編譯透過,效果相同。
  在3.x和4.x中,關於構造器規則的變化的說明駐足於此。下一篇將介紹按引用傳遞引數的不相容問題。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-997861/,如需轉載,請註明出處,否則將追究法律責任。

相關文章