全面解析PHP面向物件的三大特徵
PHP面向物件的三大特徵: 繼承,封裝,多型
一.繼承
1、如何實現繼承?
給子類使用extends關鍵字,讓子類繼承父類;
class Student extends Person{}
2、實現繼承的注意事項?
① 子類只能繼承父類的非私有屬性。
②子類繼承父類後,相當於將父類的屬性和方法copy到子類,可以直接使用$this呼叫。
③ PHP只能單繼承,不支援一個類繼承多個類。但是一個類進行多層繼承;
?1 2 3 4 5 6 7 |
class Person{}
class Chengnian extends Person{}
class Student extends Chengnian{} //Student類就同時具有了Chengnian類和Person類的屬性和方法
|
3、方法覆蓋(方法重寫)
條件① 子類繼承父類。
條件② 子類重寫父類已有方法。
符合上述兩個條件,稱為方法覆蓋。覆蓋之後,子類呼叫方法,將呼叫子類自己的方法。
同樣,除了方法覆蓋,子類也可以具有與父類同名的屬性,進行屬性覆蓋。
4、如果,子類重寫了父類方法,如何在子類中呼叫父類同名方法?
partent::方法名();
所以,當子類繼承父類時,需在子類的構造中的第一步,首先呼叫父類構造進行復制。
?1 2 3 4 5 6 7 |
function
__construct(
$name
,
$sex
,
$school
){
parent::__construct(
$name
,
$sex
);
$this
->school =
$school
;
}
|
例項一枚:
?1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
class
Student
extends
Person{
//子類繼承父類
public
$school
;
function
__construct(
$name
,
$sex
,
$school
){
//子類的建構函式
parent::__construct(
$name
,
$sex
);
//呼叫父類構造進行復制
$this
->school =
$school
;
}
function
program(){
echo
"PHP真好玩!我愛PHP!PHP是世界上最好用的程式語言!<br>"
;
}
function
say(){
parent::say();
//重寫父類的同名方法
echo
"我是{$this->school}的"
;
}
}
$zhangsan
=
new
Student(
"張三"
,
"男"
,
"起航"
);
$zhangsan
->say();
$zhangsan
->program();
|
二、封裝
1、什麼是封裝?
通過訪問修飾符,將類中不需要外部訪問的屬性和方法進行私有化處理,以實現訪問控制。
【注意】:是實現訪問控制,而不是拒絕訪問。 也就是說,我們私有化屬性之後,需要提供對應的方法,讓使用者通過我們提供的方法處理屬性。
2、封裝的作用?
①使用者只關心類能夠提供的功能,而不必關心功能實現的細節!(封裝方法)
②對使用者的資料進行控制,防止設定不合法資料,控制返回給使用者的資料(屬性封裝+set/get方法)
3、實現封裝操作?
① 方法的封裝
對於一些只在類內部使用的方法,而不像對外部提供使用。那麼,這樣的方法我們可以使用private進行私有化處理。
private function formatName(){} //這個方法僅僅能在類內部使用$this呼叫
function showName(){
$this -> formatName();
}
②屬性的封裝+set/get方法
為了控制屬性的設定以及讀取,可以將屬性進行私有化處理,並要求使用者通過我們提供的set/get方法進行設定
private $age;
function setAge($age){
$this->age = $age;
}
function getAge(){
return $this->age;
}
$物件 -> getAge();
$物件 -> setAge(12);
③ 屬性的封裝+魔術方法
private $age;
function __get($key){
return $this->$key;
}
function __set($key,$value){
$this->$key=$value;
}
$物件->age; // 訪問物件私有屬性時,自動呼叫__get()魔術方法,並且將訪問的屬性名傳給__get()方法;
$物件->age=12; // 設定物件私有屬性時,自動呼叫__set()魔術方法,並且將設定的屬性名以及屬性值傳給__set()方法;
【 注意】:在魔術方法中,可以使用分支結構,判斷$key的不同,進行不同操作。
4、關於封裝的魔術方法:
① __set($key,$value):給類私有屬性賦值時自動呼叫,呼叫時給方法傳遞兩個引數:需要設定的屬性名、屬性值;
② __get($key):讀取類私有屬性時自動呼叫,呼叫時給方法傳遞一個引數:需要讀取的屬性名;
③ __isset($key):外部使用isset()函式檢測私有屬性時,自動呼叫。
>>> 類外部使用isset();檢測私有屬性,預設是檢測不到的。false
>>> 所以,我們可以使用__isset();函式,在自動呼叫時,返回內部檢測結果。
?1 2 3 |
function __isset($key){
return isset($this->$key);
}
|
當外部使用isset($物件名->私有屬性);檢測時,將自動呼叫上述__isset()返回的結果!
④ __unset($key):外部使用unset()函式刪除私有屬性時,自動呼叫;
?1 2 3 |
function __unset($key){
unset($this->$key);
}
|
當外部使用unset($物件名->私有屬性);刪除屬性時,自動將屬性名傳給__unset(),並交由這個魔術方法處理。
例項一枚
?1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
class
Person{
public
$name
;
public
$age
;
public
$sex
;
function
__construct(
$name
,
$age
,
$sex
){
$this
->name=
$name
;
$this
->setAge(
$age
);
$this
->setSex(
$sex
);
}
function
setAge(
$age
){
if
(
$age
>=0&&
$age
<=120){
return
$this
->age=
$age
;
}
else
{
die
(
"年齡輸入有誤!!!"
);
}
}
function
setSex(
$sex
){
if
(
$sex
==
"女"
||
$sex
==
"男"
){
return
$this
->sex=
$sex
;
}
else
{
die
(
"性別輸入有誤!!!"
);
}
}
function
say(){
echo
"我的名字叫{$this->name},我的年齡{$this->age},我的性別是{$this->sex}<br>"
;
}
}
class
Work
extends
Person{
private
$position
;
function
__construct(
$name
,
$age
,
$sex
,
$position
){
parent::__construct(
$name
,
$age
,
$sex
);
$this
->job=
$job
;
$this
->setPosition(
$position
);
}
function
setPosition(
$position
){
$arr
=[
'總監'
,
'董事長'
,
'程式設計師'
,
'清潔工'
];
if
(in_array(
$position
,
$arr
)){
return
$this
->position=
$position
;
}
else
{
die
(
"不存在該職位"
);
}
}
function
__set(
$key
,
$value
){
if
(
$key
==
"age"
){
return
parent::setAge(
$value
);
}
elseif
(
$key
==
"sex"
){
return
parent::setSex(
$value
);
}
elseif
(
$key
==
"position"
){
return
$this
->setPosition(
$value
);
}
return
$this
->
$key
=
$value
;
}
function
say(){
parent::say();
echo
"我的職位是{$this->position}"
;
}
}
$zhangsan
=
new
Work(
"張三"
,22,
"男"
,
"總監"
);
$zhangsan
->setSex(
"女"
);
$zhangsan
->setAge(30);
// $zhangsan->setPosition("董事長");
$zhangsan
->position=
"董事長"
;
$zhangsan
->name=
"lisi"
;
$zhangsan
->say();
|
三.多型
3.1、什麼是多型?
多型實現多型的前提是實現繼承。
1.一個類被多個子類繼承,如果這個類的某個方法在多個子類中表現出不同的功能,我們稱這種行為為多型。在PHP中的方法重寫,
2.實現多型的必要途徑:
⑴子類繼承父類;
⑵重寫父類方法;
⑶父類引用指向子類物件;
?1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
class Computer{
function fangfa(InkBox $a,Paper $b){ //父類引用
echo "即將開始列印····<
br
>";
$a->color();
$b->sizes();
echo "列印結束···<
br
>";
}
}
class Color implements InkBox{
function color(){
echo "正在裝載彩色墨盒<
br
>";
echo "實現彩色墨盒<
br
>";
}
}
class White implements InkBox{
function color(){
echo "正在裝載黑白墨盒<
br
>";
echo "實現黑白墨盒<
br
>";
}
}
class A4 implements Paper{
function sizes(){
echo "正在載入A4紙張<
br
>";
echo "實現A4紙張<
br
>";
}
}
class A5 implements Paper{
function sizes(){
echo "實現A5紙張<
br
>";
}
}
$com=new Computer();//建立物件
$com->fangfa(new Color(),new A4());//子類物件
|
以上這篇全面解析PHP面向物件的三大特徵就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援指令碼之家。