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.