PHP物件導向的進階學習,主要包括抽象類別、介面、final、類別常數的一些資料
一、抽象類別(abstract)
在我們實際開發過程中,有些類別並不需要被實例化,如前面學習到的一些父類,主要是讓子類別來繼承,這樣可以提高程式碼重複使用
語法結構:
abstract class 类名{ 属性 $name; 方法(){} //方法也可以为abstract 修饰符 function 方法名(){} }
範例:
abstract class animal{ public $name; public $age; //抽象方法不能有方法体,主要是为了让子类去实现; abstract public function cry(); // 抽象类 中可以包含抽象方法,同时也可以包含实例类方法 public function getname(){ echo $this->name; } } class Cat{ public function cry(){ echo 'ok'; } }
理解:動物類,實際上是一個抽象的概念,它規定了某些動物中某些共同的屬性和行為,但實際上它自己並沒收有那些屬性和行為。再例如:交通工具類,植物類等等
注意:
1、如果一個類別用了abstract來修飾,則該類就是一個抽象類,如果一個方法被abstract修飾,那麼該方法就是一個抽象方法,抽象方法不能有方法體=> abstract function cry(); 連{}也不可以有
2、抽象類別一定不能被實例化,抽象類別可以沒有抽象方法,但是如果一個類別包含了任意一個抽象方法,這個類別一定要聲明為abstract類別;
3、如果一個類別繼承了另一個抽象類,則該子類別必須實作抽象類別中所有的抽象方法(除非它自己也宣告為抽象類別);
二、介面(interface)
介面就是將一些沒有實作的方法,封裝在一起,到某個類別要用的時候,再根據具體情況把這些方法寫出來;
語法結構
interface 介面名稱{
//屬性、方法
//介面中的方法都不能有方法體;
}
如何實作介面
class 類別名稱implements 介面名稱{
}
理解:介面就是更抽象的抽象類,抽象類別裡的方法可以有方法體,但是介面中的方法必須沒有方法體。介面實現了程式設計的多型和高內聚、低偶合的設計想法;
範例:
//接口是定义规范、属性的,一般以小写的i开头; interface iUsb{ public function start(); public function stop(); } //编写相机类,让它去实现接口 //当一个类实现了某个接口,那么该类就必须实现接口的所有方法 class Camera implements iUsb{ public function start(){ echo 'Camera Start Work'; } public function stop(){ echo 'Camera Stop Work'; } } //编写一个手机类 class Phone implements iUsb{ public function start(){ echo 'Phone Satrt Work'; } public function stop(){ echo 'Phone Stop Work'; } } $c=new Camera(); $c->start(); $p=new Phone(); $p->start();
何時使用介面:
1、定下規範,讓其他程式設計師來實作
2、當多個平級的類,都需要去實作某個功能,但是實現的方式不一樣;
小結:
1、介面不能被實例化,介面中所有的方法都不能有主體;
2、一個類別可以實作多個接口,以逗號(,)分隔class demo implements if1,if2,if3{}
3、介面中可以有屬性,但必須是常數,常數不可以有修飾符(預設是public修飾符)
如:interface iUsb{
const A=90;
}
echo iUsb::A;
4、介面中的方法都必須是public的,預設是public;
5、一個介面不能繼承其他的類,但是可以繼承其它的介面,一個介面可以繼承多個其它介面
如:interface 介面名稱extends if1,if2{}
6、一個類別可以在繼承父類別的同時實現其它介面
如:class test extends testbase implements test1, test2{}
實作介面VS繼承類別
php的繼承是單一繼承,也就是一個類別只能繼承一個父類,這樣對子類別功能的擴充有一定的影響。實作介面可以看做是對繼承類別的一個補充。繼承是層級的關係,不太靈活,而實作介面是平級的關係,實作介面可以在不打破繼承關係的前提下,對某個功能擴展,非常靈活。
三、Final
1、如果我們希望某個類別不被其它的類別繼承(例如為了安全原因等。),那麼可以考慮使用final
語法:
final class A{}
2、如果我們希望某個方法,不被子類別重寫,可以考慮使用final來修飾,final修飾的方法還是可以繼承的,因為方法的繼承權取決於public的修飾
如:
class A{ final public function getrate($salary){ return $salary*0.08; } } class B extens A{ //这里父类的getrate方法使用了final,所以这里无法再重写getrate //public function getrate($salary){ // return $salary*0.01; //} }
3、final不能用來修飾屬性
4、類別常數(const)
#在某些情況下,可能有這樣的需求:當不希望一個成員變數被修改,希望該變數的值是固定不變的,這時可以使用const常數(常數名稱應該全用大寫,並且不帶$符號,常數不可以加修飾符)
語法:
const 常數名=常數值; //必須賦初值,因為常數是不能修改的
調用:
類別名稱::常數名稱[本類別內部可用self::常數名稱] 或介面名稱::常數名稱//介面中只能使用常數,且不能使用變數
如:
class A{ const TAX_RATE=0.08; function paytax($salary){ return $salary*self::TAX_RATE; } } $a=new A(); echo $a->paytax(100);
註:
1 、常數可以被子類別繼承
2、常數是屬於某個類別的,而不屬於某個物件
以上是php抽像類別、介面、final、類別常數進階學習教程的詳細內容。更多資訊請關注PHP中文網其他相關文章!