PHP面向對象的三大特徵: 繼承,封裝,多態php
一.繼承html
一、如何實現繼承?程序員
給子類使用extends關鍵字,讓子類繼承父類;編程
class Student extends Person{}編程語言
二、實現繼承的注意事項?函數
① 子類只能繼承父類的非私有屬性。this
②子類繼承父類後,至關於將父類的屬性和方法copy到子類,能夠直接使用$this調用。spa
③ PHP只能單繼承,不支持一個類繼承多個類。可是一個類進行多層繼承;.net
1
2
3
4
5
6
7
|
class Person{}
class Chengnian extends Person{}
class Student extends Chengnian{}
//Student類就同時具備了Chengnian類和Person類的屬性和方法
|
三、方法覆蓋(方法重寫)code
條件① 子類繼承父類。
條件② 子類重寫父類已有方法。
符合上述兩個條件,稱爲方法覆蓋。覆蓋以後,子類調用方法,將調用子類本身的方法。
一樣,除了方法覆蓋,子類也能夠具備與父類同名的屬性,進行屬性覆蓋。
四、若是,子類重寫了父類方法,如何在子類中調用父類同名方法?
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();
|
2、封裝
一、什麼是封裝?
經過訪問修飾符,將類中不須要外部訪問的屬性和方法進行私有化處理,以實現訪問控制。
【注意】:是實現訪問控制,而不是拒絕訪問。 也就是說,咱們私有化屬性以後,須要提供對應的方法,讓用戶經過咱們提供的方法處理屬性。
二、封裝的做用?
①使用者只關心類可以提供的功能,而沒必要關心功能實現的細節!(封裝方法)
②對用戶的數據進行控制,防止設置不合法數據,控制返回給用戶的數據(屬性封裝+set/get方法)
三、實現封裝操做?
① 方法的封裝
對於一些只在類內部使用的方法,而不像對外部提供使用。那麼,這樣的方法咱們可使用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的不一樣,進行不一樣操做。
四、關於封裝的魔術方法:
① __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.一個類被多個子類繼承,若是這個類的某個方法在多個子類中表現出不一樣的功能,咱們稱這種行爲爲多態。在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面向對象的三大特徵就是小編分享給你們的所有內容了,但願能給你們一個參考,也但願你們多多支持腳本之家。