面向對象三大特徵:
封裝 繼承 多態
屬性的封裝
class Human {
public $money = 1000;
}
$lisi = new Human();
echo $lisi->money,'<br />'; // 1000
// 變一下money
$lisi->money = 500;
echo $lisi->money,'<br />'; // 500
李四的錢,別人問他有多少錢,他就如實說.
別人把他的錢減少,立即減少了.
如果在現實生活中,這個現象顯然不合理,我們需要把錢保護起來
public 是公共的,即大家都可以來讀取,操作錢顯然不應該是公共的
改進:
class Human {
private $money = 1000;
public function showMoney() {
return $this->money * 0.8;
}
}
$lisi = new Human();
echo $lisi->money;//調用失敗,因爲money是私有和,這時,我們就把money "封起來"了
//注意:光封起來,是沒有意義的,因爲money這個屬性還得與外界有所交互才行.
// 你不能直接翻別人口袋,看別人有多少錢.
// 但是,可以問別人有多少錢
//把某些重要屬性 封裝起來,然後通過一個開放的接口來操作.這就實現的對屬性的封裝.
echo $lisi->showMoney();
方法的封裝
class Human {
private $money = 1000;
private $bank = 2000;
private function getBank($num) {
$this->bank -= $num;
return $num;
}
public function send($much) {
if($much > $this->money + $this->bank) {
return false;
} else if($much > $this->money){
$num = $much - $this->money; //算算要從銀行取多少錢?
$this->money += $this->getBank($num); //從銀行取出錢,加到現金裏
$this->money -= $much; // 再把錢借給朋友.
return $much;
} else { // 直接現金借
$this->money -= $much;
return $much;
}
}
public function showMoney() {
return $this->money;
}
public function showBank() {
return $this->bank;
}
}
$lisi = new Human();
$m = $lisi->send(300);
if($m) {
echo '借了',$m,'元<br />';
echo '還剩下',$lisi->showMoney(),'元<br />';
}
// 再借 2000 元
$m = $lisi->send(2000);
if($m) {
echo '借了',$m,'元<br />';
echo '還剩下',$lisi->showMoney(),'元<br />';
echo '銀行還有',$lisi->showBank(),'元,<br />';
}
在上個例子中,
借錢者,只知道,借成功了,還是借失敗了.
至於,如果借成功了,lisi是怎麼樣把錢湊齊的,借錢者不會知道lisi也許跑了趟銀行,再把錢湊齊.
就像同學們,只需要 每週一到週五,晚8點到10點來聽課.至於後面,老師的備課,拉網線,等等,你們不需要知道.
對於一個對象,對外界開放一個接口,調用接口時,內部進行的操作,不需要讓外界知道.隱藏了內部的一些實現細節.這是對方法的封裝.
生活中的封裝很常見:電視機,開電源 一個動作
[隱藏的內部動作: 觸發顯像管,接線無線電信息,調頻 等等]
洗衣機:扔衣服,通電.[自動加水,洗,漂,脫水]