物件導向設計是php程式開發中一個很重要的內容塊,如果你想成為進階php程式員我們必須知道物件導向設計具體用法與寫法。
維護簡單 模組化是物件導向編程中的一個特徵。實體被表示為類和同一名字空間中具有相同功能的類,我們可以在名字空間中添加一個類而不會影響該名字空間的其他成員。
可擴充性 物件導向編程從本質上支援擴充性。如果有一個具有某種功能的類,就可以很快地擴充這個類,建立一個具有擴充的功能的類。
代碼重用 由於功能是被封裝在類中的,並且類是作為一個獨立實體而存在的,提供一個類庫就非常簡單了。
它比較適合多人合作來開發項目,所以現在很多大中型網站都選擇了用OOP來開發。
本文主要講解了用php做物件導向編程的最基本的方法和代碼執行個體,如何建立一個class和如何產生一個class的執行個體等等,只是一個入門,非常的簡單,要想深學這點是遠遠不夠的。只適合php的初學者
public 表示全域,類內部外部子類都可以訪問;
| 代碼如下 |
複製代碼 |
class Test{ public $name='Janking', $sex='male', $age=23; function __construct(){ echo $this->age.' '.$this->name.' '.$this->sex.' '; } function func(){ echo $this->age.' '.$this->name.' '.$this->sex.' '; } } $P=new Test(); echo '
'; $P->age=100; $P->name="Rainy"; $P->sex="female"; $P->func(); ?> |
private表示私人的,只有本類內部可以使用;
| 代碼如下 |
複製代碼 |
| class Test{ private $name='Janking', $sex='male', $age=23; function __construct(){ $this->funcOne(); } function func(){ echo $this->age.' '.$this->name.' '.$this->sex.' '; } private function funcOne(){ echo $this->age.' '.$this->name.' '.$this->sex.' '; } } $P=new Test(); echo '
'; $P->func(); $P->age=100; // Cannot access private property Test::$age $P->name="Rainy"; // Cannot access private property Test::$name $P->sex="female"; // Cannot access private property Test::$female $P->funcOne(); // Call to private method Test::funcOne() from context '' ?> |
protected表示受保護的,只有本類或子類或父類中可以訪問;
- 資料抽象和資訊隱藏
- 繼承
- 多態性
在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; } } ?> |
所以可以用如下方法建立對象:
| 代碼如下 |
複製代碼 |
| $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. } |
?>
多態性。
| 代碼如下 |
複製代碼 |
| function niceDrawing($x) { //Supose this is a method of the class Board. $x->draw(); } $obj=new Circle(3,187); $obj2=new Rectangle(4,5); $board->niceDrawing($obj); //will call the draw method of Circle. $board->niceDrawing($obj2); //will call the draw method of Rectangle. |
?>
和封裝有關的魔術方法:
__set():是直接設定私人成員屬性值時,自動調用的方法
__get():是直接擷取私人成員屬性值時,自動調用的方法
__isset(); 是直接isset查看對象中私人屬性是否存時自動調用這個方法
__unset(); 是直接unset刪除對象中私人屬性時,自動調用的方法
http://www.bkjia.com/PHPjc/372033.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/372033.htmlTechArticle物件導向設計是php程式開發中一個很重要的內容塊,如果你想成為進階php程式員我們必須知道物件導向設計具體用法與寫法。 維護簡單 模...