溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

php面向?qū)ο蟮姆庋b、繼承和多態(tài)的介紹

發(fā)布時間:2020-06-01 21:51:23 來源:億速云 閱讀:261 作者:鴿子 欄目:編程語言

基本知識

類:具有相同屬性或方法的一類集合體。比如雪佛蘭汽車是一個雪佛蘭汽車類,奔馳汽車是一個奔馳汽車類,寶馬汽車是一個寶馬汽車類,而這三個類又是汽車大類的子類。
對象:類的一個具體實現(xiàn),比如寶馬Q5就是寶馬汽車類的一個具體實現(xiàn)。對象地使用是放在內(nèi)存中的。一下讓我們了解一下對象在內(nèi)存中的分配。

php面向?qū)ο蟮姆庋b、繼承和多態(tài)的介紹

使用面向?qū)ο?,就是靈活地使用以上兩個知識點。讓我們來創(chuàng)建和使用類與對象

<?php
    /**
    *新建一個類
    */
    class newClass{        public $a;        public $b;        public function funA(){            echo "I am function A";
        }        public function funB(){            echo "I am function B";
        }
    }    /**
    *使用類創(chuàng)建對象
    */
    $opt=new newClass();
    $opt->a="opt";//將opt對象中的a屬性賦值為opt
    $opt->funA();//打印出"I am function A"?>


修飾符:在定義類與類中的屬性時,我們可以使用如下三個修飾符,若不加,則默認為public
public:權(quán)限最大
protected:權(quán)限范圍在其本身與其子類
private:權(quán)限范圍僅在其本身
<font color="blue" size="4">構(gòu)造函數(shù)與析構(gòu)函數(shù)</font>:在我們對類實例化創(chuàng)建對象時,往往需要對對象進行初始化,這時,我們就需要在類中定義一個構(gòu)造方法。當我們使用完對象時,就需要釋放對象,以減少內(nèi)存的使用,這時我們就需要使用析構(gòu)方法。
在php中我們使用__construct()方法與__destruct(),如下代碼

<?php
class newClass{
    public $a;
    public $b;
    public function __construct($a,$b){
        $this->a=$a;
        $this->b=$b;
        echo "我是構(gòu)造函數(shù)";
    }
    public function __destruct(){
        echo "我是析構(gòu)函數(shù)";
    }
}
?>

封裝性

當我們開發(fā)一些重要的程序模塊時,常常不希望別人能輕易訪問這些程序模塊的數(shù)據(jù),因此需要對這些數(shù)據(jù)進行封裝。這時我們要進行數(shù)據(jù)的訪問控制,常常使用<font color="red">private</font>關(guān)鍵字來對這些屬性與方法進行封裝。
如下:

<?php
class privateClass
{
    private $a;
    private $b;
    private function privateFun()
    {
        echo "我是封裝的方法";
    }
} ?>

這樣,當我們創(chuàng)建對象時就不能調(diào)用私有的屬性與方法。但是我們可以通過使用魔術(shù)方法來對這些私有屬性與方法進行訪問。
__set()與__get()的使用
通過__set()方法我們可以通過對象直接設(shè)置成員屬性值
通過__get()方法我們可以通過對象直接獲取成員屬性值

<?php
class setClass
{        
     private $a;        
    private $b="ww";        
    public function __set($oldValue,$newvalue){ 
        $this->$oldValue=$newvalue;
    }        
    public function __get($newvalue){            
        return $newvalue;
    }
}
    $opt= new setClass();
    $opt->a="sss";//直接設(shè)置私有屬性值
    echo $opt->b;//直接讀取私有屬性值
?>

__isset()與__unset()的使用
通過__isset()直接查看對象中私有屬性是否存在
通過__unset()直接刪除對象中的私有屬性

<?php
class issetClass
{
    private $a;
    private $b = 'www';
    function __isset($privateName)
    {
        if (isset($privateName)) {
            return 1;
        } else {
            return 0;
        }
    }
    function __unset($privateName)
    {
        echo "銷毀" . $privateName;
    }
}
$opt = new issetClass();
echo isset($opt->$b);
var_dump(unset($opt->$b));?>

繼承性

當我們編寫多個類時,常常多個類具有相同的屬性與方法,為了簡化代碼我們引入了繼承的概念,子類可以繼承父類的一些屬性與方法,減少了冗余代碼地編寫。

如何編寫繼承類
我們使用關(guān)鍵字extends來編寫子類

<?php
    class parentClass{
    }    
    class childClass extends parentClass{
    }    
?>

如上,childClass是parentClass的子類,php僅支持單繼承,即一個子類只有一個父類,但父類可以有多個子類。

重寫父類方法
當父類中的方法不能滿足子類的使用時我們可以重寫父類方法。但當我們又想在子類使用父類的方法時,我們可以使用如下語法:parent::方法名幾個重要的關(guān)鍵字

3.1 final

final可以修飾類與方法,不能修飾成員屬性;
被final修飾的類不能繼承,而用final修飾的方法在子類中不能被重寫

3.2 static

static可以修飾成員屬性與成員方法,不能修飾類;
使用static修飾的成員與方法可以通過類直接使用,使用如下語法:類名::\$屬性名或方法名();
在類中使用時通過如下語法:self::\$屬性名或方法名.

3.3 const

在類中聲明常量使用const,而不是使用define();
比如 const TT=90當使用常量時直接使用如下語法self::常量名

3.4 instanceof

使用該關(guān)鍵字可以檢測某個實例是否是某個類的實例。

3.5 trait

php只能進行單繼承,但它同時提供了另類方式來進行代碼復用,解決單繼承問題。
如下

<?php

trait testA
{
    function a()
    {
    }
}

trait testB
{
    function b()
    {
    }
}

class testC
{
    use testA, testB;

    function c()
    {
    }
} ?>

抽象技術(shù)

用abstract關(guān)鍵字修飾的方法與類稱為抽象方法或抽象類。
聲明抽象類與抽象方法

<?php
abstract class testClass
{
$a;
$b;
    abstract function testFun();
    abstract function testFun1();
    public function optFun()
    {
        echo "抽象類中的抽象方法";
    }//抽象類可以有非抽象方法
}
class childClass extends testClass
{
    function testFun()
    {
        echo "子類中實現(xiàn)抽象方法";
    }
    function testFun1()
    {
        echo "子類實現(xiàn)抽象方法";
    }
}
abstract child1Class extends testClass
{
}//子類是抽象方法可以不實現(xiàn)父類的抽象方法?>

抽象技術(shù)為子類的聲明提供了一種規(guī)范,限制了類的實例化(抽象類不能實例化)。

接口技術(shù)

接口是一種特殊的抽象類,接口中只能聲明抽象類與常量
聲明接口使用interface,實現(xiàn)接口使用implements,修飾符只能是默認的public;
一個子類可以繼承多個接口,同時繼承一個父類

<?php
interface newInterface
{
    const V = 12;
    abstract function fun1();
    abstract function fun2();
}
interface newInterface1
{
    abstract function fun3();
    abstract function fun4();
}
class parentClass
{
    function fun5()
    {
        echo "fun5";
    }
}
class optClass extends parentClass implements newInterface, newINterface1
{
    function fun1()
    {
        echo "fun1";
    }
    function fun2()
    {
        echo "fun2";
    }
    function fun3()
    {
        echo "fun3";
    }
    function fun4()
    {
        echo "fun4";
    }
} ?>

多態(tài)

在php中多態(tài)地實現(xiàn)需要一個類通過多個子類地繼承實現(xiàn),如果一個類的方法在多個子類中重寫并實現(xiàn)不同的功能,我們稱之為多態(tài)。

以上就是php面向?qū)ο蠛唵胃爬ǖ脑敿殐?nèi)容,更多請關(guān)注億速云其它相關(guān)文章!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI