首頁  >  文章  >  後端開發  >  PHP物件導向之抽象類別詳解(程式碼實例)

PHP物件導向之抽象類別詳解(程式碼實例)

易达
易达原創
2020-05-27 15:54:192263瀏覽

本文目標:

1、了解PHP中抽象類別的定義

2、了解PHP中抽象類別的作用

3、了解PHP中抽象類別的使用場景

4、掌握PHP中抽象類別的具體實作

還是按照先前一貫的思路,我們透過3W1H的方式學習,那麼首先我們來了解

(一)、了解PHP中抽象類別的定義(What)

抽象類別往往用來表徵對問題領域進行分析、設計中得出的抽象概念,是對一系列看上去不同,但是本質上相同的具體概念的抽象。通常在程式語句中用 abstract 修飾的類別是抽象類別

和介面的不同之處在於,介面中的方法都是不實現的,只是單純的定義,但是抽象類別中的方法是可以實現的。

(二)、了解PHP中抽象類別的作用(Why)

在PHP中的類別當中,有很多類別會被不斷的重寫,這個時候我們可以使用抽象類,怎麼做呢?就是先寫一個公共的類,然後實例化之後我們可以重複去呼叫。這樣可以提高程式碼的可重用性

(三)、了解PHP中抽象類別的使用場景(Where)

#1、如果發現程式碼中很多類別都有相似或共同的方法,我們可以把這些相同或相似的方法抽離出來,封裝到抽象類別中。

抽象類別和介面有點相似,可以這麼說,介面是一個特殊的抽象類,只不過介面裡面全都是抽象的方法,(所謂抽象就是沒有具體的實作),但是抽象類別中的部分方法,是可以具備實現的功能,

(四)、掌握PHP中抽象類別的具體實作(How)

總結:

#1、抽象類別的定義透過abstract 定義,例如abstract class 類別名稱{}

2、抽象類別的方法的定義也是透過abstract定義,例如abstract public function 方法名稱(){}

3、抽象類別是不能被實例化的

4、要繼承一個抽象類,透過關鍵字extends

5、抽象類別的子類別必須實作抽象類別中未實現的所有方法,也就是說要重寫抽象類別中所有abstract的方法

6、抽象類別的子類別雖然沒有實作抽象類別中的已經實作的方法,一樣可以呼叫這些方法,其實結合繼承我們可以很好地理解這點

每個總結都是透過實踐得出來的,現在我們用實踐來示範總結,這樣可以促進理解,讓每個總結理解起來更加清晰,直覺

(五)、具體程式碼

#案例一、

## 實踐目標:

1、抽象類別的定義透過abstract 定義,例如abstract class 類別名稱{}

2、抽象類別的方法的定義也是透過abstract定義,例如abstract public function 方法名稱(){}

具體程式碼如下:

<?php
abstract class Animal{
    abstract public function eat();//抽象方法
    //呼吸
    public function breath(){
        //所有动物的呼吸方法都是一样的,就不需要使用多态了
        echo "呼吸<br/>";
    }
}
?>

案例二、

#實踐目標:

1、抽象類別是不能被實例化的

具體程式碼如下:

<?php
abstract class Animal{
    abstract public function eat();//抽象方法
    //呼吸
    public function breath(){
        //所有动物的呼吸方法都是一样的,就不需要使用多态了
        echo "呼吸<br/>";
    }
}
$animal = new Animal();
?>

運行結果為:

Fatal error: Uncaught Error: Cannot instantiate abstract class Animal in D:\E-class\class-code\classing\index.php:10 Stack trace: #0 {main} thrown in D:\E-class\class-code\classing\index.php on line 10

案例四、

实践目标:

1、要继承一个抽象类,通过关键字extends

2、抽象类的子类必须要实现抽象类中未实现的所有方法,也就是说要重写抽象类中所有abstract的方法

具体代码如下:

<?php
abstract class Animal{
    abstract public function eat();//抽象方法
    //呼吸
    public function breath(){
        //所有动物的呼吸方法都是一样的,就不需要使用多态了
        echo "呼吸<br/>";
    }
}
//定义猴子
class Monkey extends Animal{
    
}
?>

如果Monkey类继承了抽象类,但不实现里面的abstract方法,那么运行结果为:

Fatal error: Class Monkey contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (Animal::eat) in D:\E-class\class-code\classing\index.php on line 13

接下来我们来实现abstract方法

具体代码如下:

<?php
abstract class Animal{
    abstract public function eat();//抽象方法
    //呼吸
    public function breath(){
        //所有动物的呼吸方法都是一样的,就不需要使用多态了
        echo "呼吸<br/>";
    }
}
//定义猴子
class Monkey extends Animal{
    //实现抽象类中的抽象方法
    public function eat(){
        echo "我是猴子类中的eat方法<br/>";
    }
}
$monkey = new Monkey();
$monkey->eat();

?>

运行结果如下:

我是猴子类中的eat方法

案例五、

实践目标:

1、抽象类的子类虽然没有实现抽象类中的已经实现的方法,一样可以调用这些方法,其实结合继承我们可以很好理解这点

具体代码如下:

<?php
abstract class Animal{
    abstract public function eat();//抽象方法
    //呼吸
    public function breath(){
        //所有动物的呼吸方法都是一样的,就不需要使用多态了
        echo "抽象类中的呼吸方法<br/>";
    }
}
//定义猴子
class Monkey extends Animal{
    //实现抽象类中的抽象方法
    public function eat(){
        echo "我是猴子类中的eat<br/>";
    }
}
$monkey = new Monkey();
$monkey->eat();
$monkey->breath();
?>

运行结果如下:

我是猴子类中的eat
抽象类中的呼吸方法

(六)、学以致用

问题:将以下真实场景,用抽象类还原出来

小芳放学回到家中,一进家门,只见心爱的小狗“小爱”马上就对主人摇起了尾巴,小芳笑了笑,走过去,抱起了小狗,最后,小芳和小狗亲了一口

思路分析:

1、对象分析:学生,小狗

2、对象属性分析:结合(现实世界+具体场景)

    学生:名称

    狗:名称

3、对象方法分析:结合(现实世界+具体场景)

    学生:

        (1)、放学 

        (2)、回到家中

        (3)、走路

        (4)、看

        (5)、笑

        (6)、抱东西

        (7)、亲嘴

       狗:

        (1)、看

        (2)、摇尾巴

        (3)、亲嘴

4、我们发现这2个对象都有相似的方法,看,亲嘴,所以我们可以把它们封装到抽象类中,并且这2个方法不需要子类去重写,因为都是一样的

具体代码如下:

<?php
abstract class Animal{
    //看
    public function look($obj){
        //所有动物的呼吸方法都是一样的,就不需要使用多态了
        echo "看见了".$obj->name."<br/>";
    }
    //亲嘴
    public function kiss($fromobj,$toobj){
        echo $fromobj->name."亲了".$toobj->name."一口<br/>";
    }
    
}
//学生
class Student extends Animal{
   public $name = "";
   public function __construct( $name ){
       $this->name = $name;
   }
    // 1、放学
   public function offschool(){
       echo $this->name."放学了<br/>";
   }
   //回家
   public function goHome(){
    echo $this->name."回到家中<br/>";
   }
    // 2、走路
    public function walk(){
        echo $this->name."走了过去<br/>";
    }
    // 3、看

    // 4、笑
    public function smile(){
        echo $this->name."微笑了<br/>";
    }
    // 5、抱东西
    public function hug($obj){
        echo $this->name."抱起了".$obj->name."<br/>";
    }
    // 6、亲嘴
   
}
//狗
class Dog extends Animal{
   public $name = "";
   public function __construct( $name ){
       $this->name = $name;
   }
    //1、看

    //2、摇尾巴
    public function wagTail(){
        echo $this->name."摇了尾巴<br/>";
    }

    //3、亲嘴
}
//创建对象
$xf = new Student("小芳");
$dog = new Dog("小爱");
//小芳放学了
$xf->offschool();
//小芳放学回到家中,一进家门,只见心爱的小狗“小爱”马上就对主人摇起了尾巴,小芳笑了笑,走过去,
//抱起了小狗,最后,小芳和小狗亲了一口
//小芳回答家中
$xf->goHome();
//小芳看见小狗
$xf->look($dog);
//小狗摇尾巴
$dog->wagTail();
//小芳笑了笑
$xf->smile();
//小芳走过去
$xf->walk();
//抱起小狗
$xf->hug($dog);
//小芳亲了小狗
$xf->kiss($xf,$dog);
//小狗也亲了小芳
$dog->kiss($dog,$xf);
?>

运行结果为:

小芳放學了
小芳回到家中
看見了小愛
小愛搖了尾巴
小芳微笑了
小芳走了過去
##小芳抱起了小愛
小芳親了小愛一口
小愛親了小芳一口

(七)、總結

#1、本文主要解釋了PHP中抽象類別的定義,作用以及具體的實現

希望本文能為大家帶來一定的幫助,謝謝! ! !

以上是PHP物件導向之抽象類別詳解(程式碼實例)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn