本篇文章給大家分享的內容是關於淺談PHP物件導向編程 ,有著一定的參考價值,有需要的朋友可以參考一下
一、PHP物件導向編程基礎實踐
<?php/** 通過對象的編程方式,可將實現生活中的一切事物以對象的形式表現出來。便於理解、維護、擴充等;* 本樣本:定義一個“人”類* $name : 對象中的成員屬性,在此類中表示人的姓名* say() : 對象中的成員方法,在此類中表示人說話的方法* $this : PHP中的偽變數,表示自身的類* __construct() : php中的魔術方法,建構函式,在執行個體化類時自動執行* __destruct() : php中的魔術方法,解構函式,當類調用完成後自動執行*/class Human{ public $name; public $sex; public $age; public function __construct($name,$sex,$age) { $this->name = $name; $this->sex = $sex; $this->age = $age; } public function say() { echo '大家好,我的名字叫'.$this->name.',今年'.$this->age.'歲,我的性別是'.$this->sex; } public function __destruct() { $this->name = null; $this->sex = null; $this->age = null; }}//執行個體化“人”類$male = new Human("張三","男","20");//調用“人”類說話的方法$male->say();//輸出結果:大家好,我的名字叫張三,今年20歲,我的性別是男?>
二、PHP物件導向進階編程實踐
知識點:類的繼承、方法重寫、存取控制、static關鍵字、final關鍵字、資料訪問、介面、多態、抽象類別
2.1、類的繼承:extends 關鍵字
例如:一員運行員、一位主持人,他們有人類共同的行為方法,但他們都有自己不同的特長專業。因此在編程時需要給他們建立一個父類並繼承;
<?php/** 建立一個“人”類做為父類,繼承的子類都擁有其父類的成員屬性、方法*/class Human{ public $name; public function say() { echo "父類說話的方法,姓名:".$this->name."\n"; } public function eat() { echo "父類吃飯的方法\n"; }}/** 建立一個“運動員”類,繼承“人”類* extends : 關鍵字,繼承某個類*/class Sport extends Human{ public $type; public function __construct($name,$type) { $this->name = $name; //給父類 $name 屬性賦值 $this->type = $type; } public function run() { $this->say(); //調用父類“說話”的方法 echo "我在正跑步,我是一員".$this->type."運動員.....\n"; }}/** 建立一個“主持人”類,繼承“人”類* extends : 關鍵字,繼承某個類*/class Host extends Human{ public $television; public function __construct($name,$television) { $this->name = $name; $this->television= $television; } public function perform() { $this->eat(); //調用父類“吃飯”的方法 echo "我在正表演一個節目,我是".$this->television."電視台的一名主持人.....\n"; }}//執行個體化“運動員”類$nba = new Sport("喬丹","籃球");$nba->run();//執行個體化“主持人”類$tv = new Host("張三","北京衛視");$tv->perform();//輸出結果://父類說話的方法,姓名:喬丹 我在正跑步,我是一員籃球運動員..... //父類吃飯的方法 我在正表演一個節目,我是北京衛視電視台的一名主持人.....?>
2.2、方法重寫:子類重寫父類的方法
<?phpclass Human{ public function say() { echo "父類說話的方法"; }}class Sport extends Human{ //重寫父類“說話”的方法 public function say() { echo "子類說話的方法"; }}$nba = new Sport();$nba->say();//輸出結果:子類說話的方法?>
2.3、存取控制:public 、 protected 、private 關鍵字
public:定義公用的成員屬性或方法,任何地方都可使用
protected : 定義受保護的成員屬性或方法,只允許類本身或子類使用
private : 定義私人的成員屬性或方法,只允許類的本身使用
<?phpclass Human{ public $name; protected $sex; private $age; }//執行個體化對象,給公用屬性賦值可正常輸出結果,外部不能給protected、private受保護的成員屬性賦值或使用$worker = new Human();$worker->name = "張三";echo $worker->name;?>
2.4、static(靜態)關鍵字
1)、靜態屬性用於儲存類的公有資料;
2)、靜態方法裡面只能訪問靜態屬性或方法,不能使用 $this 偽變數;
3)、靜態成員不需要通過 new 關鍵字來執行個體化對象就可訪問使用;
<?phpclass Human{ static $name = "張三"; static function say() { echo "我的姓名叫:".self::$name; }}//外部使用靜態成員屬性或方法echo Human::$name;Human::say();//輸出結果:張三 我的姓名叫:張三?>
2.5、final關鍵字:不允許成員方法被重寫,不允許被繼承
例:1、對於父類“吃飯”這個方法,不希望子類重寫它;2、對於“運動員”這個類,不希望它再建立子類;
<?phpclass Human{ final public function eat() { echo "父類吃飯的方法,不允許子類重寫"; }}final class Sport extends Human{ public function eat() { echo "子類吃飯的方法。此時程式將會報致命錯誤"; }}//建立一個類繼承 Sport 這個類。此時程式也將會報致命錯誤。因為 Sport 類不允許再建立子類class Student extends Sport{ public $name;}//執行個體化 Sport 類 ,調用 eat() 方法$nba = new Sport();$nba->eat();//執行個體化 Student 類 ,給 name 屬性負值$obj = new Student();$obj->name = "張三";//輸出結果:Fatal error: Cannot override final method Human::eat() in ******.php on line 15//Fatal error: Class Student may not inherit from final class (Sport) in ****.php on line 20?>
2.6、資料訪問:$this 、 self 、parent 關鍵字
$this : 偽變數,代表類的本身,可訪問本類及父類中的成員屬性與方法。
self : 訪問類中的靜態成員屬性或方法
parent :訪問父類的成員屬性或方法
<?phpclass Human{ static $name = "張三";}class Sport extends Human{ static function getParentName() { echo parent::$name; } public function get() { self::getParentName(); }}$obj = new Sport();$obj->get();//輸出結果:張三?>
2.7、介面:把不同類的共同行為方法進行定義,但不具體實現,由子類來實現具體的方法;
例如:人會吃飯,動物也會吃飯,甚至有些植物也會吃飯,但他們吃飯的方式不一樣,因此這時需要定義一個介面類,具體的方式由子類來實現;
定義介面關鍵字:interface
實現介面方法關鍵字:implements
<?php//定義一個介面類,有吃飯的方法,但不具體實現。interface ICanEat{ public function eat($food);}class Human implements ICanEat{ //eat()方法必須由子類來實現,否則程式將報致命錯誤 public function eat($food) { echo "I'm eating ".$food; }}class Animal implements ICanEat{ public function eat($food) { echo "It's eating ".$food; }}//執行個體化一個“人”類$people = new Human();$people->eat('rice');//執行個體化一個“動物”類$monkey = new Animal();$monkey->eat('banana');//輸出結果:I'm eating rice// It's eating banana?>
2.8、多態:比如介面A有兩個實現B和C,B和C對A介面裡面定義的方法實現可以是不同的,這種現象稱之為多態;
上述執行個體中,ICanEat介面定義了一個eat()方法,人類吃米飯,猴子吃香蕉。他們都實現了一個“吃”的方法,但他們吃東西有不同的行為,稱之為多態;
2.9、抽象類別:介入介面與類的定義之間,允許類裡面一部分方法不實現,實現一部分有相同功能且不會更改的方法。然而介面類裡面不允許有任何實現的方法。
例如:人和動物都具有吃飯與呼吸的方法,除吃飯不同以外,呼吸方法是相同的,此時需要定義一個抽象類別來實現。
定義抽象類別關鍵字:abstract
<?php//定義一個抽象類別,裡面有吃飯和呼吸的方法。呼吸方法需要在抽象類別中具體實現abstract class ICanEat{ abstract function eat($food); public function breath() { echo 'Breath use the air...'; }}class Human extends ICanEat{ public function eat($food) { echo "I'm eating ".$food; $this->breath(); }}//執行個體化“人”類$people = new Human();$people->eat('rice');//輸出結果:I'm eating rice Breath use the air...?>
三、PHP物件導向編程特殊實踐
PHP語言特定的一些魔術方法:
<?phpclass Object{ public function __construct() { echo "當類在被執行個體化的時候,自動執行該函數"; } public function __toString() { return "當對象被當作字串形式輸出時,自動執行該函數"; } public function __invoke($value) { echo "當對象被當作函數調用時,自動執行該函數".$value; } /* * 當對象訪問不存在的方法時,自動執行該函數。也稱之為“方法重載” * $fun : 方法名稱 * $param : 傳遞的參數 */ public function __call($fun,$param) { echo "調用".$fun."方法不存在,傳遞的參數".implode(',',$param); } /* * 當對象訪問不存在的靜態方法時,自動執行該函數。 * $fun : 方法名稱 * $param : 傳遞的參數 */ static function __callStatic($fun,$param) { echo "調用".$fun."靜態方法不存在,傳遞的參數".implode(',',$param); } public function __get($key) { echo "當讀取對象中不可訪問(未定義)的屬性值時,自動調用該函數。".$key."屬性不可訪問或未定義"; } public function __set($key,$value) { echo "當給對象中不可訪問(未定義)的屬性賦值時,自動調用該函數。".$key."屬性不可訪問或未定義,值".$value; } public function __isset($key) { echo "判斷對象中的屬性不存在時,自動執行該函數。屬性:".$key."值未定義"; } public function __unset($key) { echo "釋放對象中的不存在的屬性值時,自動執行該函數。屬性:".$key."值未定義"; } public function __clone() { echo "當對象被複製時,自動執行該函數。"; } public function __destruct() { echo "當對象執行完成後,自動執行該函數"; }}$obj = new Object(); //執行個體化對象時,調用__construct()方法echo $obj; //將對象以字串形式輸出時,調用__toString()方法$obj(123); //當對象以函數形式調用時,執行__invoke()方法$obj->runTest(); //當調用對象中不存在的方法時,執行__call()方法$obj::runTest(); //當調用對象中不存在的靜態方法時,執行__callStatic()方法$obj->name; //當調用對象中不存在的成員屬性時,執行__get()方法$obj->name = "張三"; //當給對象中不存在的成員屬性賦值時,執行__set()方法isset($obj->name) ? 1 : 0; //判斷對象中不存在的成員屬性時,執行__isset()方法unset($obj->name); //釋放對象中的不存在的屬性值時,執行__unset()方法$obj2 = clone $obj; //當對象被複製時,執行__clone()方法 //對象執行完畢,執行__destruct()方法?>