這篇文章介紹在 PHP 的面向對象編程(OOP)。我將演示如何用面向對象的概念編出較少的代碼但更好的程序。祝大家好運。
面向對象編程的概念對每一個作者來說都有不同的看法,我提醒一下一個面向對象語言應有的東西:
- 數據抽象和信息隱藏
- 繼承
- 多態性
在PHP中使用類進行封裝的辦法:
<?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 來聲明。
<?php
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;
}
}
?>