PHP中實現物件導向編程_PHP教程

來源:互聯網
上載者:User
  這篇文章介紹在PHP的物件導向編程(OOP)。我將示範如何用物件導向的概念編出較少的代碼但更好的程式。祝大家好運。

  物件導向編程的概念對每一個作者來說都有不同的看法,我提醒一下一個物件導向語言應有的東西:

   - 資料抽象和資訊隱藏
   - 繼承
   - 多態性

  在PHP中使用類進行封裝的辦法:

class Something {
// In OOP classes are usually named starting with a cap letter.
var $x;

function setX($v) {
// Methods start in lowercase then use lowercase to seprate
// words in the method name example getValueOfArea()
$this->x=$v;
}

function getX() {
return $this->x;
}
}

?>

  當然你可以用你自己的辦法,但有一個標準總是好的。

  PHP中類的資料成員使用 "var" 定義,資料成員是沒有類型直到被賦值。一個資料成員可能是一個 integer、數組、聯合數組(associative array)或甚至對象(object). 方法在類裡定義成函數,在方法裡存取資料成員,你必須使用$this->name 這樣的辦法,否則對方法來說是一個函數的局部變數。

  使用 new 來建立一個對象

$obj = new Something;

  然後使用成員函數

$obj->setX(5);
$see = $obj->getX();

  setX 成員函數將 5 賦給對象(而不是類)obj 中成員變數, 然後 getX 傳回值 5.

  你也可以用對象引用來存取成員變數,例如:$obj->x=6; 然而,這不一種好的物件導向編程的方法。我堅持你應使用成員函數來設定成員變數的值和通過成員函數來讀取成員變數。如果你認為成員變數是不可存取的除了使用成員函數的辦法,你將成為一個好的物件導向程式員。 但不幸的是PHP本身沒有辦法聲明一個變數是私人的,所以允許糟糕的代碼存在。

  在 PHP 中繼承使用 extend 來聲明。

class Another extends Something {
 var $y;
 function setY($v) {
  // Methods start in lowercase then use lowercase to seperate
  // words in the method name example getValueOfArea()
  $this->y=$v;
 }

 function getY() {
  return $this->y;
 }
}

?>

  這樣類 "Another" 的對象擁有父類的所用成員變數及方法函數,再加上自己的成員變數及成員函數。如:

$obj2=new Another;
$obj2->setX(6);
$obj2->setY(7);

  多重繼承不被支援,所以你不能讓一個類繼承多個類。

  在繼承類中你可以重新定義來重定義方法,如果我們在 "Another" 重新定義 getX,那麼我們不再能存取 "Something" 中的成員函數 getX. 同樣,如果我們在繼承類中聲明一個和父類同名的成員變數,那麼繼承類的變數將隱藏父類的同名變數。

  你可以定義一個類的建構函式, 建構函式是和類同名的成員函數,在你建立類的對象時被調用。

class Something {
 var $x;

 function Something($y) {
  $this->x=$y;
 }

 function setX($v) {
  $this->x=$v;
 }

 function getX() {
  return $this->x;
 }
}

?>

本新聞共4頁,當前在第1頁 1 2 3 4


 所以可以用如下方法建立對象:

$obj=new Something(6);

  建構函式自動賦值 5 給成員變數 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(); //explicit call to base class constructor.
}

?>

  在物件導向編程中一種好的機制是使用抽象類別,抽象類別是一種不能執行個體化而是用來給繼承類定義介面的類。設計師經常使用抽象類別來強製程序員只能從特定的基類來繼承,所以就能確定新類有所需的功能,但在PHP中沒有標準的辦法做到這一點,不過:

  如果你在定義基類是需要這個特點,可以通過在建構函式中調用 "die",這樣你就可以確保它不能執行個體化,現在定義抽象類別的函數並在每個函數中調用 "die",如果在繼承類中程式員不想重定義而直接調用基類的函數,將會產生一個錯誤。

  此外,你需要確信因為PHP沒有類型,有些對象是從基類繼承而來的繼承類建立的,因此增加一個方法在基類來辨別類(返回 "一些標識")並驗證這一點,當你收到一個對象作為參數派上用場。 但對於一個惡棍程式沒用辦法,因為他可以在繼承類中重定義此函數,通常這種辦法只對懶惰的程式員奏效。當然,最好的辦法是防止程式接觸到基類的代碼只提供介面。

  重載在PHP中不被支援。在物件導向編程中你可以通過定義不同參數種類和多少來重載一個同名成員函數。PHP是一種鬆散的類型語言,所以參數類型重載是沒有用的,同樣參數個數不同的辦法重載也不能工作。

  有時候,在物件導向編程中重載建構函式很有用,所以你能以不同的方式建立不同的對象(通過傳遞不同的參數個數)。一個小巧門可以做到這一點:

class Myclass {
function Myclass() {
$name="Myclass".func_num_args();
$this->$name();
//Note that $this->$name() is usually wrong but here
//$name is a string with the name of the method to call.
}

function Myclass1($x) {
code;
}
function Myclass2($x,$y) {
code;
}
}

?>

  通過這種辦法可以部分達到重載的目的。

$obj1=new Myclass(1); //Will call Myclass1
$obj2=new Myclass(1,2); //Will call Myclass2

本新聞共4頁,當前在第2頁 1 2 3 4


   多態性

  多態性被定義為當在運行時刻一個對象作為參數傳遞時,對象能決定調用那個方法的能力。例如,用一個類定義了方法 "draw",繼承類重定義 "draw" 的行為來畫圓或正方形,這樣你就有一個參數為 x 的函數,在函數裡可以調用$x->draw(). 如果支援多態性,那麼 "draw" 方法的調用就取決於對象 x 的類型。多態性在PHP中很自然被支援(想一想這種情況

http://www.bkjia.com/PHPjc/532649.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/532649.htmlTechArticle這篇文章介紹在PHP的物件導向編程(OOP)。我將示範如何用物件導向的概念編出較少的代碼但更好的程式。祝大家好運。 物件導向編程的概...

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.