## 抽象類
某個類是其他類的父類,但本身不希望實例化的父類,主要用途:提出子類的屬性,讓子類去繼承,這樣可以達到代碼復用,同時利于項目設計者來設計類
安排不同的程序員寫不同的子類
比如:交通工具類,動物類
~~~
abstract class Animal{
abstract public function cry();//讓子類去實現它
}
$animal=new Animal();//我們并不希望實例化動物這個類
~~~
## 定義:
abstract 類名 抽象類
abstract 方法 抽象方法,就不能實現它,不能有方法體。
## 特點:
抽象類不能被實例化。
抽象類可以沒有abstract,
抽象類可以沒有抽象方法,可以有正常方法——即可以確定的方法先定下來
抽象方法不能有方法體,方法體在子類實現
一旦一個類有abstract方法,這個類必須聲明為abstract類
繼承的類,需要實現父抽象類的所有抽象方法
~~~
abstract class A{
public $name="abc";
public function getName(){
return $this->name;
}
abstract function test();
abstract function test1();
}
class B extends A{
function test(){
echo "我實現A:test()";
}
//必須全部實現A中的抽象方法
function test1(){
echo "我實現A:test()";
}
echo "hello";
}
~~~
## 接口 interface 類名{ }
**實現接口:class 子類 inplements 接口1,接口2,接口3{ }**
什么情況下使用接口:
1. 項目經理定規范
2. 定規范,讓別的程序員實現
3. 有多個類之間是平級的,都要實現某個功能,只是實現的方式不一樣
注意:
1. 接口中可以有屬性,但必須是public ,必須是常量
const A=90;
echo iusb::A;

2. 接口中的方法必須都是public默認
3. 一個類可以實現多個接口,逗號隔開
4. 一個接口不能繼承其他的類,但是可以繼承別的接口
5. 繼承的同時,再去實現接口
class A extends B inplements C{.....}
interface iusb{
//定義一些方法,供其他類來實現,接口里面都不能有方法體
public function start();
public function stop();
}
//編寫相機類,讓他去實現接口,改類必須實現這個接口的所有方法
class camera inplements iusb{
public function start(){
echo "相機開始工作";
}
public function stop(){
echo "相機停止工作";
}
}
~~~
interface stumanageinterface{
public function add($stu);
public function del($id);
public function update($stu);
}
class stumanage inplements stumanageinterface{
public function add($stu){
echo "增加學生";
}
public function del($id){
echo "刪除學生";
}
public function update($stu){
echo "修改學生";
}
}
~~~
## 繼承與實現的比較

1. 繼承保證功能的純潔性,接口是對單一繼承類功能的一種補充
2. 多層繼承不靈活,一層出問題,都會出問題;
接口沒有層級問題,可以在不打破繼承關系的前提下,對某個類功能擴展

## final關鍵字
1. 如果一個類為final,只希望自己用(安全性考慮),任何類無法繼承 final class A{ }
2. 如果某個方法,(如個人所得稅),不希望被重寫,這個方法前final——可以繼承,但不能修改
3. final關鍵字不能修飾屬性
~~~
class A{
final public function getRate($salary){
return $salary*0.08;
}
}
class B extends A{
//以下無法實現重寫
public function getRate($sal){
return $salary*0.01;
}
}
$b=new B();
echo $b->getRate(1000);
~~~
## const常量定義
不希望成員變量被修改,就用const,const不能有修飾符
const 常量名=值;
訪問:
外部:**類名::常量名;或 接口名::常量**
內部:類名::常量名 或self::常量名
常量屬于類的,不屬于對象的
