PHP物件導向的進階學習(抽像類、介面、final、類常量)

來源:互聯網
上載者:User

一、抽像類(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不能用來修飾屬性

四、類常量(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、常量是屬於某個類的,而不屬於某個對象

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.