PHP(十)面向物件
面向物件
封裝
繼承
多型
面向物件設計是一種軟體設計方法,是一種工程化規範。
面向物件設計模式解決的是“類與相互通訊的物件之間的組織關係。
面向物件的程式設計產生的歷史原因:由於面向過程程式設計在構造系統時,無法解決重用,維護,擴充套件的問題,而且邏輯過於複雜,程式碼晦澀難懂,因此,人們開始想能不能讓計算機直接模擬現實的環境,以人類解決問題的方法,思路,習慣和步驟來設計相應的應用程式。於是,面向物件的程式設計思想就產生了。
面向物件的程式設計的主要思想是把構成問題的各個事物分解成各個物件,建立物件的目的不是為了完成一個步驟,而是為了描述一個事物在解決問題的過程中經歷的步驟和行為。物件作為程式的基本單位,將程式和資料封裝其中,以提高程式的重用性,靈活性和可擴充套件性。類是建立物件的模板,一個類可以建立多個物件。物件是類的例項化。
面向過程就是分析出解決問題所需要的步驟,然後用函式把這些步驟一步一步實現,使用的時候一個一個依次呼叫就可以了。
面向物件是把構成問題事務分解成各個物件,建立物件的目的不是為了完成一個步驟,而是為了描敘某個事物在整個解決問題的步驟中的行為。
類
1、類使用 class 關鍵字後加上類名定義。
2、類名後的一對大括號{}內可以定義變數和方法。
3、類的變數使用 var 來宣告, 變數也可以初始化值。
4、函式定義類似PHP函式的定義,但函式只能通過該類及其例項化的物件訪問。
5、變數 $this 代表自身的物件。
列:
class people { var $top; var $body; var $footer; function getAtt() { echo $this->top; } function setTitle($t) { $this->body = $t; } function getTitle() { echo $this->body; } } //例項化物件 $peo = new people; $peo->getAtt(); $peo->setTitle('身體'); $peo->getTitle();
php屬性和方法的訪問控制
public(公有):公有的類成員可以在任何地方被訪問。
protected(受保護):受保護的類成員則可以被其自身以及其子類和父類訪問。
private(私有):私有的類成員則只能被其定義所在的類訪問。
extends:繼承
1、繼承將會影響到類與類,物件與物件之間的關係。
2、子類就會繼承父類所有【公有的】和【受保護的】方法,除非子類覆蓋了父類的方法,被繼承的方法都會保留其原有功能。
3、使用關鍵字 extends 來繼承一個類
4、被繼承的類我們叫做父類(基類)繼承者成為子類(派生類)
列:
class maxbox { protected $name = '紅盒子'; } class box extends maxbox { public $width = '100px'; protected $color = 'red'; private $height = '200px'; function getAtt() { echo $this->width; echo $this->color; echo $this->height; echo $this->name; } function getColor() { echo $this->color; } function getheight() { echo $this->height; } } $box = new box; echo $box->width; //echo $box->color; //發生致命錯誤,因為color為受保護的屬性,不能直接在外部使用。 echo $box->getColor(); //echo $box->height; //發生致命錯誤,因為height為受保護的屬性,不能直接在外部使用。 echo $box->getheight(); echo $box->getAtt();
過載:
就是當子類繼承父類的一些方法後,子類又在其內部定義了相同的方法,則這個新定義的方法會覆蓋繼承而來的父類的方法,子類只能呼叫其內部定義的方法。
列:
class minBox extends box
{
function getAtt()
{
echo $this->width;
echo $this->color;
echo $this->name;
//echo $this->height;
//不會繼承私有的屬性或方法
}
}
$minBox = new minBox;
echo $minBox->width;
echo $minBox->getAtt();
多繼承 trait
Trait 是為類似 PHP 的單繼承語言而準備的一種程式碼複用機制。
Trait 和 Class 相似,無法通過 trait 自身來例項化。
使用 use 宣告trait
class A
{
public function getColor()
{
echo "green";
}
}
trait B
{
public function getBl()
{
echo "布料亞麻";
}
}
trait D
{
public function getBll()
{
echo "aasd";
}
}
class C extends A
{
use B,D;
}
$c = new C;
$c->getColor();
$c->getBl();
$c->getBll();