首頁  >  文章  >  後端開發  >  php物件導向的特徵是什麼? PHP物件導向特徵的介紹(程式碼)

php物件導向的特徵是什麼? PHP物件導向特徵的介紹(程式碼)

不言
不言原創
2018-07-24 16:19:012752瀏覽

這裡所說的PHP面向對象,準確的說應該叫做PHP物件導向編程,php物件導向程式設計的三個基本特徵分別為封裝、繼承和多態,下面我們就來分別看看PHP物件導向的三大特徵。

一、php物件導向三大特徵:
1、封裝:
封裝就是把抽像出來的資料和資料的操作封裝在一起,資料被保護在內部,程式的其他部分只有透過被授權的操作(成員方法)才能對資料進行操作。

存取控制符賦值取值.png

#2、繼承:
所謂繼承,就是一個子類別透過extends 父類別把父類的一些(public / protected)屬性和(public / protected)方法繼承下來。不能繼承私有的。

  作用:增加代码复用性,管理代码成本低。
 
  基本语法:
  class 类名 extends 父类名 {
        //需要的非私有属性和方法
  }

繼承.png

<?php
    
    //父类
    Class Student {
        public $name;
        protected $age;
        protected $grade;

        // public __construct() {

        // }

        public function showInfo() {
            echo $this -> name."<br/>".$this -> age;
        }
    }

    /**
    * 小学生
    */
    class Pupil extends Student
    {
        public function test() {
            echo "<br/>小学生在考试。。。";
        }
    }

    /**
    * 大学生
    */
    class Graduate extends Student
    {
        public function test() {
            echo "<br/>大学生在考试。。。";
        } 
    }

    $stu1 = new Pupil();
    $stu1 -> name = "lizzy";
    $stu1 -> test();
    $stu1 -> showInfo();

    $stu2 = new Graduate();
    $stu2 -> name = "zxm";
    $stu2 -> test();
    $stu2 -> showInfo();
?>

注意:
(1)protected屬性和方法受保護,在子類別不能直接調用,要在子類別中定義方法存取。

Class ParentClass {
    public $name = &#39;lizzy&#39;;
    protected $age = 24;
    private $sex = "女";

    public function test1() {
        echo "<br/>展示public方法";
    }

    protected function test2() {
        echo "<br/>展示protected方法";
    }

    private function test3() {
        echo "<br/>展示private方法";
    }
}

Class SubClass extends ParentClass {
    function show() {
        echo "age=".$this->age;
        // echo "sex=".$this->sex;//是不能继承下来的
        $this -> test2();
    }
}

$sub1 = new SubClass();
$sub1 -> show();
$sub1 -> test1();

(2)如果希望子類別呼叫父類別的建構方法,或其他方法(public / protected),可以使用類別名稱::方法名稱; 或parent::方法名稱;

Class A {
    public $n1=90;

    public function __construct() {
        echo "A的构造方法";
    }
}

Class B extends A {
    function __construct() {
        echo "B的构造方法";
        //调用父类的两种方法
        // A::__construct();
        parent::__construct();
    }
}
$b = new B();

(3)當一個子類別的方法和父類別方法(protected/public)完全一致時,我們稱之為方法的覆蓋(重寫)。

3、多態:
「重載」是類別的多型態的一種表現;
重載的概念:函數名稱一樣,透過函數的參數數量或參數型別不同,達到呼叫同一個函數名,但是可以區分出不同的函數。

魔法函數__call,但不建議使用; 它一個物件呼叫某個方法,而該方法不存在,則係統會自動呼叫__call。

<?php

    Class A {

        public function test1($p) {
            echo "接收一个参数<br/>";
        }

        public function test2($p) {
            echo "接收两个参数<br/>";
        }

        //提供__call 它一个对象调用某个方法,而该方法不存在,则系统会自动调用__call
        function __call($method,$p) {
            if ($method == "test") {
                if (count($p) == 1) {
                    $this -> test1($p);
                } elseif (count($p) == 2) {
                    $this -> test2($p);
                }
            }
        }
    }

    $a = new A();
    $a -> test(1);
    $a -> test(21,43)
?>

常見魔法常數:兩個底線LINE兩個底線;目前多少行;
兩個底線FILE兩個底線;目前檔案的絕對路徑;

方法的重寫/覆蓋(override):
1、當一個父類別知道所有的子類別都有一個方法,但是父類別不能確定該方法究竟如何寫,可以讓子類別去覆寫這個方法。
使用如下:

<?php

    Class Animal {
        function cry() {
            echo "不知道怎么叫";
        }
    }

    //重写
    Class Dog extends Animal {
        function cry() {
            echo "小狗汪汪叫";
        }
    }

    //重写
    Class Pig extends Animal {
        function cry() {
            echo "小猪哼哼叫";
        }
    }

    $dog = new Dog();
    $dog -> cry();
    $pig = new Pig();
    $pig -> cry();

?>

方法重寫的細節:
1、重寫子類別的函數名稱和參數數量必須和父類別的一致;但不要求參數的名稱一樣。
2、如果子類別要去呼叫父類別的某個方法(public / protected)可以使用parent::方法名稱(); 或父類別名稱::方法名稱(); 可根據情況是否傳參。
3、實作方法覆蓋時,存取修飾符可以不一樣,但是必須滿足子類別的存取範圍>=父類別的存取範圍。

多態體現的地方:
當子類別沒有覆寫父類別的方法,則子類別呼叫的是父類,當子類別覆寫了父類別的方法則呼叫的是自己的方法。

相關推薦:

PHP 零基礎入門教學

談談我對php中物件導向的理解

以上是php物件導向的特徵是什麼? PHP物件導向特徵的介紹(程式碼)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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