php抽像類別、介面、final、類別常數進階學習教程

伊谢尔伦
發布: 2023-03-11 21:46:02
原創
1045 人瀏覽過

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中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!