PHP的物件導向編程

來源:互聯網
上載者:User
編程|對象 物件導向編程的概念:

  不同的作者之間說法可能不一樣,但是一個OOP語言必須有以下幾方面:

  抽象資料類型和資訊封裝

  繼承

  多態

  在PHP中是通過類來完成封裝的:

  <?php

  class Something {

  // 在OOP類中,通常第一個字元為大寫

  var $x;

  function setX($v) {

  // 方法開始為小寫單詞,然後使用大寫字母來分隔單詞,例如getValueOfArea()

  $this->x=$v;

  }

  function getX() {

  return $this->x;

  }

  }

  當然你可以按自已的喜好進行定義,但最好保持一種標準,這樣會更有效。資料成員在類中使用"var"聲明來定義,在給資料成員賦值之前,它們是沒有類型的。一個資料成員可以是一個整數,一個數組,一個相關數組(associative array)或者是一個對象。方法在類中被定義成函數形式,在方法中訪問類成員變數時,你應該使用$this->name,否則對一個方法來說,它只能是局部變數。

  使用new操作符來建立一個對象:

  $obj=new Something;

  然後你可以使用成員函數通過:

  $obj->setX(5);

  $see=$obj->getX();

  在這個例子中,setX成員函數將5賦值給對象的成員變數x(不是類的),然後getX返回它的值5。可以象:$obj->x=6那樣通過類引用方式來存取資料成員,這不是一個很好的OOP習慣。我強烈建議通過方法來存取成員變數。如果你把成員變數看成是不可處理的,並且只通過物件控點來使用方法,你將是一個好的OOP程式員。不幸的是,PHP不支援聲明私人成員變數,所以不良代碼在PHP中也是允許的。繼承在PHP中很容易實現,只要使用extend關鍵字。

  <?php

  class Another extends Something {

  var $y;

  function setY($v) {

  $this->y=$v;

  }

  function getY() {

  return $this->y;

  }

  }

  "Another"類的對象現在擁有了父類(Something)的全部的資料成員及方法,而且還加上了自已的資料成員和方法。

  你可以使用

  $obj2=new Something;

  $obj2->setX(6);

  $obj2->setY(7);

  PHP現在還不支援多重繼承,所以你不能從兩個或兩個以上類派生出新的類來。你可以在衍生類別中重定義一個方法,如果我們在"Another"類中重定義了getX方法,我們就不能使 用"Something"中的getX方法了。如果你在衍生類別中聲明了一個與基派同名的資料成員,那麼當你處理它時, 它將“隱藏”基類的資料成員。

  你可以在你的類中定義建構函式。建構函式是一個與類名同名的方法,當你建立一個類的對象時會被調用,例如:

  <?php

  class Something {

  var $x;

  function Something($y) {

  $this->x=$y;

  }

  function setX($v) {

  $this->x=$v;

  }

  function getX() {

  return $this->x;

  }

  }

  所以你可以建立一個對象,通過:

  $obj=new Something(6);

  建構函式會自動地把6賦值給資料變數x。建構函式和方法都是普通的PHP函數,所以你可以使用預設參數。

  function Something($x="3",$y="5")

  接著:

  $obj=new Something(); // x=3 and y=5

  $obj=new Something(8); // x=8 and y=5

  $obj=new Something(8,9); // x=8 and y=9

  預設參數使用C++的方式,所以你不能忽略Y的值,而給X一個預設參數,參數是從左至右賦值的,如果傳入的參數少於要求的參數時,其作的將使用預設參數。

  當一個衍生類別的對象被建立時,只有它的建構函式被調用,父類的建構函式沒被調用,如果你想調用基類的建構函式,你必須要在衍生類別的建構函式中顯示調用。可以這樣做是因為在衍生類別中所有父類的方法都是可用的。

  <?php

  function Another() {

  $this->y=5;

  $this->Something();

  //顯示調用基類建構函式

  }

  OOP的一個很好的機制是使用抽象類別。抽象類別是不能執行個體化,只能提供給衍生類別一個介面。設計者通常使用抽象類別來強迫程式員從基類派生,這樣可以確保新的類包含一些期待的功能。在PHP中沒有標準的方法,但是:如果你需要這個特性,可以通過定義基類,並在它的建構函式後加上"die" 的調用,這樣就可以保證基類是不可執行個體化的,現在在每一個方法(介面)後面加上"die" 語句,所以,如果一個程式員在衍生類別中沒有覆蓋方法,將引發一個錯誤。而且因為PHP 是無類型的,你可能需要確認一個對象是來自於你的基類的衍生類別,那麼在基類中增加一個方法來實義類的身份(返回某種標識id),並且在你接收到一個對象參數時校正這個值。當然,如果一個邪惡不好的程式員在衍生類別中覆蓋了這個方法,這種方法就不起作用了,不過一般問題多發現在懶惰的程式員身上,而不是邪惡的程式員。

  當然,能夠讓基類對程式員無法看到是很好的,只要將介面列印出來做他們的工作就可以了。在PHP中沒有解構函式。

  重載(與覆蓋不同)在PHP中不支援。在OOP中,你可以重載一個方法來實現兩個或重多的方法具有相同的名字,但是有不同數量或類型的參數(這要看語言)。PHP 是一種鬆散類型的語言,所以通過類型重載不起作用,然而通過參數的個數不同來重載也不起作用。

  有時在OOP中重載建構函式非常好,這樣你可以通過不同的方法建立對象(傳遞不同數量的參數)。在PHP中實現它的技巧是:

  <?php

  class Myclass {

  function Myclass() {

  $name="Myclass".func_num_args();

  $this->$name();

  //注意$this->name()一般是錯誤的,但是在這裡$name是一個將被呼叫者法的名字

  }

  function Myclass1($x) {

  code;

  }

  function Myclass2($x,$y) {

  code;

  }

  }

  通過在類中的額外的處理,使用這個類對使用者是透明的:

  $obj1=new Myclass('1'); //將調用Myclass1

  $obj2=new Myclass('1','2'); //將調用Myclass2

  有時這個非常好用。

  多態

  多態是對象的一種能力,它可以在運行時刻根據傳遞的對象參數,決定調用哪一個對象的方法。例如,如果你有一個figure的類,它定義了一個draw的方法。並且派生了circle和rectangle 類,在衍生類別中你覆蓋了draw方法,你可能還有一個函數,它希望使用一個參數x,並且可以調用$x->draw() 。如果你有多態性,調用哪個draw方法就依賴於你傳遞給這個函數的物件類型。



聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.