<?php
//抽象類-可以是空類,不能創建對象,不能實例化,只能被繼承
abstract class absFirst{//關鍵字abstract
protected $absBl = '$absBl'; //可以定義變量,關鍵字[public|protected|private]
const ABSCL = 'ABS-CL';//可以定義常量
abstract function absFunFirst($cs=array());//抽象方法關鍵字abstract,可以有參數,可以有默認值,沒有方法體
public function absFunSecond(){//可以定義其他成員方法,關鍵字[public|protected|private]
echo "抽象類第一個方法,第一個變量是“{$this->absBl}”,第一個常量是“".self::ABSCL."”";
}
}
//接口1-可以是空的接口-不能定義變量-不能定義其他成員方法
interface intFirst{//關鍵字interface
const INTCLF = 'INT-CLF';//可以定義常量
public function intFunFirst($ic=array());//接口方法關鍵字public,可以有參數,可以有默認值,沒有方法體
}
//接口2
interface intSecond{
const INTCLS = 'INT-CLS';
public function intFunSecond();
}
//實現類-定義的抽象方法和接口需全部實現
//實現抽象類關鍵字extends,單一繼承
//實現接口關鍵字implements,多接口
class claFirst extends absFirst implements intFirst,intSecond{
//實現第一個抽象方法
public function absFunFirst($cf='第一個抽象方法'){//關鍵字只能是public,參數個數需保持一致
echo $cf."\n";
}
//重寫抽象類中的方法
public function absFunSecond(){
echo '我被重寫了'."\n";
}
//實現第一個接口的第一個方法
public function intFunFirst($ic=',哈哈'){//關鍵字只能是public,參數個數需保持一致
echo '我是第一個接口方法調的是第二接口的常量'.self::INTCLS.$ic."\n";
}
//實現第二個接口的第一個方法
public function intFunSecond(){//關鍵字只能是public,參數個數需保持一致
echo '我是第二個接口方法調的是第一接口的常量'.self::INTCLF."\n";
}
}
//使用
$cf = new claFirst();
$cf->absFunFirst();
$cf->absFunSecond();
$cf->intFunFirst();
$cf->intFunSecond();
/*
運行結果:
第一個抽象方法
我被重寫了
我是第一個接口方法調的是第二接口的常量INT-CLS,哈哈
我是第二個接口方法調的是第一接口的常量INT-CLF
*/
/*
總結:接口是特殊的抽象類
抽象類和接口相同點:
1、都可以為空
2、都不能創建對象,不能被實例化
3、都可以定義常量
4、定義的抽象方法可以有參數,可以有默認值,沒有方法體
5、實現類需實現定義的所有抽象方法,且關鍵字為public
抽象類和接口不同點:
1、類關鍵字不同abstract && interface
2、抽象類可以定義變量,接口不可以
3、抽象類可以定義其他非抽象方法,接口不可以
4、抽象類定義的抽象方法關鍵為abstract,接口定義的方法關鍵字為public
5、實現抽象類只能單一繼承,關鍵字為extends,接口可以實現多個接口,關鍵字為implements
*/
?>