這裡所說的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 = 'lizzy'; 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中文網其他相關文章!