1、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歲,個人性別是男 ?>
2、PHP面向對象高級編程實踐編程
知識點:類的繼承、方法重寫、訪問控制、static關鍵字、final關鍵字、數據訪問、接口、多態、抽象類ide
2.一、類的繼承: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.二、方法重寫:子類重寫父類的方法this
<?php class Human { public function say() { echo "父類說話的方法"; } } class Sport extends Human { //重寫父類「說話」的方法 public function say() { echo "子類說話的方法"; } } $nba = new Sport(); $nba->say(); //輸出結果:子類說話的方法 ?>
2.三、訪問控制:public 、 protected 、private 關鍵字
public:定義公共的成員屬性或方法,任何地方均可使用
protected : 定義受保護的成員屬性或方法,只容許類自己或子類使用
private : 定義私有的成員屬性或方法,只容許類的自己使用code
<?php class Human { public $name; protected $sex; private $age; } //實例化對象,給公共屬性賦值可正常輸出結果,外部不能給protected、private受保護的成員屬性賦值或使用 $worker = new Human(); $worker->name = "張三"; echo $worker->name; ?>
2.四、static(靜態)關鍵字
1)、靜態屬性用於保存類的公有數據;
2)、靜態方法裏面只能訪問靜態屬性或方法,不能使用 $this 僞變量;
3)、靜態成員不須要經過 new 關鍵字來實例化對象就可訪問使用;orm
<?php class Human { static $name = "張三"; static function say() { echo "個人姓名叫:".self::$name; } } //外部使用靜態成員屬性或方法 echo Human::$name; Human::say(); //輸出結果:張三 個人姓名叫:張三 ?>
2.五、final關鍵字:不容許成員方法被重寫,不容許被繼承
例:一、對於父類「吃飯」這個方法,不但願子類重寫它;二、對於「運動員」這個類,不但願它再建立子類;對象
<?php class 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.六、數據訪問:$this 、 self 、parent 關鍵字
$this : 僞變量,表明類的自己,可訪問本類及父類中的成員屬性與方法。
self : 訪問類中的靜態成員屬性或方法
parent :訪問父類的成員屬性或方法繼承
<?php class Human { static $name = "張三"; } class Sport extends Human { static function getParentName() { echo parent::$name; } public function get() { self::getParentName(); } } $obj = new Sport(); $obj->get(); //輸出結果:張三 ?>
2.七、接口:把不一樣類的共同行爲方法進行定義,但不具體實現,由子類來實現具體的方法;
例如:人會吃飯,動物也會吃飯,甚至有些植物也會吃飯,但他們吃飯的方式不同,所以這時須要定義一個接口類,具體的方式由子類來實現;
定義接口關鍵字: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.八、多態:好比接口A有兩個實現B和C,B和C對A接口裏面定義的方法實現能夠是不一樣的,這種現象稱之爲多態;
上述實例中,ICanEat接口定義了一個eat()方法,人類吃米飯,猴子吃香蕉。他們都實現了一個「吃」的方法,但他們吃東西有不一樣的行爲,稱之爲多態;
2.九、抽象類:介入接口與類的定義之間,容許類裏面一部分方法不實現,實現一部分有相同功能且不會更改的方法。然而接口類裏面不容許有任何實現的方法。
例如:人和動物都具備吃飯與呼吸的方法,除吃飯不一樣之外,呼吸方法是相同的,此時須要定義一個抽象類來實現。
定義抽象類關鍵字: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... ?>
3、PHP面向對象編程特殊實踐
PHP語言特定的一些魔術方法:
<?php class 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()方法 ?>