PHP面向对象编程(imooc)代码合集(四)
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                PHP面向对象编程(imooc)代码合集(四)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.                        
                                class10 多態
多態簡單說就是用不同的類去實現同一個接口的方法,以實現不同類自己的方法
<?php date_default_timezone_set("PRC"); /*** 多態* 1. 只要某個對象實現了接口(instanceof),就可以直接在對象上調用接口的方法*/interface ICanEat {public function eat($food); }// Human類實現了ICanEat接口 class Human implements ICanEat { // 跟Animal類的實現是不同的public function eat($food){echo "Human eating " . $food . "\n";} }// Animal類實現了ICanEat接口 class Animal implements ICanEat {public function eat($food){echo "Animal eating " . $food . "\n";} }function eat($obj){if($obj instanceof ICanEat){ $obj->eat("FOOD"); // 不需要知道到底是Human還是Animal,直接吃就行了}else{echo "Can't eat!\n";} }$man = new Human(); $monkey = new Animal();// 同樣的代碼,傳入接口的不同實現類的時候,表現不同。這就是為什么成為多態的原因。 eat($man); eat($monkey);?>
?
class11 ?抽象類
抽象類是介于接口和一般類之間的一個類,它允許自身的某些方法暫時沒有具體實現;但是,抽象類和接口一樣,不能直接實例化為對象,必須要一個一般類去繼承它,它只能作為父類被使用
<?php date_default_timezone_set("PRC"); /*** 抽象類* 1. 抽象類允許類里面的部分方法暫時沒有具體實現,這些方法我們成為抽象方法* 2. 一旦類里面有抽象方法,這個類就必須是抽象類* 3. 抽象類跟接口一樣,不能直接實例化為對象*/// 抽象類前面以abstract關鍵字開始 abstract class ACanEat {// 沒有實現的方法需要設定為抽象方法// 抽象方法需要在子類中實現 abstract public function eat($food);public function breath(){echo "Breath use the air.\n";} }// Human類實現了ICanEat接口 class Human extends ACanEat { // 跟Animal類的實現是不同的public function eat($food){echo "Human eating " . $food . "\n";} }// Animal類實現了ICanEat接口 class Animal extends ACanEat {public function eat($food){echo "Animal eating " . $food . "\n";} }$man = new Human(); $man->eat("Apple"); $man->breath(); // 和Animal共用了抽象類ICanEat的breath方法 $monkey = new Animal(); $monkey->eat("Banana"); $monkey->breath();?>
?
?
這只后給大家簡單介紹一下PHP中特有的一些方法(PHP特性),他們分別是
__tostring()--能使對象當做String直接調用 __invoke() --能使對象被當成方法被自動調用
?
class12?
__tostring()--能使對象當做String直接調用 __invoke() --能使對象被當成方法被自動調用
<?php date_default_timezone_set("PRC"); /*** 魔術方法1* 1. 當對象被當做String使用時,__tostring()會被自動調用* 2. 當對象被當成方法調用時,__invoke()會被自動調用*/ class MagicTest{public function __tostring(){return "This is the Class MagicTest.\n";}public function __invoke($x){echo "__invoke called with parameter " . $x . "\n";} }$obj = new MagicTest(); echo $obj; $obj(5); //直接在對象中傳入參數5,它會被__invoke()函數接收?>
?
class13 ?
1. 當對象訪問不存在的方法名稱時,__call()方法會被自動調用2. 當對象訪問不存在的靜態方法名稱時,__callStatic()方法會被自動調用
<?php date_default_timezone_set("PRC"); /*** 魔術方法2之方法重載* 1. 當對象訪問不存在的方法名稱時,__call()方法會被自動調用* 2. 當對象訪問不存在的靜態方法名稱時,__callStatic()方法會被自動調用*/ class MagicTest{public function __tostring(){return "This is the Class MagicTest.\n";}public function __invoke($x){echo "__invoke called with parameter " . $x . "\n";}public function __call($name, $arguments){echo "Calling " . $name . " with parameters: " . implode(', ', $arguments) . "\n";}public static function __callStatic($name, $arguments){echo "Static calling " . $name . " with parameters: " . implode(', ', $arguments) . "\n";} }$obj = new MagicTest(); $obj->runTest("para1", "para2"); MagicTest::runTest("para3","para4");?>
?
class14
__set()
__get()
isset()
empty()
unset()
__unset()
<?php date_default_timezone_set("PRC"); /*** 魔術方法3之屬性重載* 1. 在給不可訪問屬性賦值時,__set() 會被調用。* 2. 讀取不可訪問屬性的值時,__get() 會被調用。* 3. 當對不可訪問屬性調用 isset() 和empty()時,__isset() 會被調用。* 4. 當對不可訪問屬性調用 unset() 時,__unset() 會被調用*/ class MagicTest{public function __tostring(){return "This is the Class MagicTest.\n";}public function __invoke($x){echo "__invoke called with parameter " . $x . "\n";}public function __call($name, $arguments){echo "Calling " . $name . " with parameters: " . implode(', ', $arguments) . "\n";}public static function __callStatic($name, $arguments){echo "Static calling " . $name . " with parameters: " . implode(', ', $arguments) . "\n";}// 通過這兩個方法可以實現動態的對象屬性public function __get($name){return "Getting the property " . $name;}public function __set($name, $value){echo "Setting the property " . $name . " to value ". $value. "\n";}public function __isset($name){echo "__isset invoked\n";return false;}public function __unset($name){echo "unsetting property " . $name;} }$obj = new MagicTest(); echo $obj->name . "\n"; $obj->name = "Name Value"; echo '$obj->name is set? '. isset($obj->name) . "\n"; echo '$obj->name is empty?' . empty($obj->name) . "\n"; unset($obj->name); ?>
?
?
后邊幾個魔術方法,具體在什么時候調用呢?
我覺得是用于容錯處理的。
轉載于:https://www.cnblogs.com/construtora/p/5021302.html
總結
以上是生活随笔為你收集整理的PHP面向对象编程(imooc)代码合集(四)的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 鸿雁向南飞是什么歌啊
- 下一篇: 我就像问问“未婚先孕,真的好吗”?
