全面解析PHP面向對象的三大特徵

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面向對象的三大特徵就是小編分享給你們的所有內容了,但願能給你們一個參考,也但願你們多多支持腳本之家。

相關文章
相關標籤/搜索