用class關(guān)鍵字創(chuàng)建兩個(gè)類(lèi),Son類(lèi)繼承Parents類(lèi):
class Parents{
}
class Son extends Parents {
}
如果子類(lèi)沒(méi)定義構(gòu)造函數(shù),初始化子類(lèi)時(shí)會(huì)自動(dòng)調(diào)用父類(lèi)的構(gòu)造函數(shù),并且函數(shù)里面可以調(diào)用子類(lèi)的公共屬性,但是如果調(diào)用子類(lèi)的private私有屬性則不可以,另外由 protected 所定義的類(lèi)成員則可以被其所在類(lèi)的子類(lèi)和父類(lèi)訪(fǎng)問(wèn)
class Parents{
function __construct(){echo $this->name;}
}
class Son extends Parents {
var name = 'lin';
}
$Son = new Son();
如果子類(lèi)定義了構(gòu)造函數(shù)或者其他與父類(lèi)同名的函數(shù),會(huì)把父類(lèi)函數(shù)覆蓋,想調(diào)用父類(lèi)該函數(shù)可以用parent:::func()來(lái)調(diào)用。如果父類(lèi)函數(shù)用了final關(guān)鍵字,子類(lèi)重定義該函數(shù)時(shí)就會(huì)報(bào)錯(cuò)。
]]>定義抽象類(lèi)使用abstract關(guān)鍵字,主要用于定義規(guī)范,其函數(shù)必須被繼承的子類(lèi)全部重載后才能實(shí)例化,重載不全會(huì)報(bào)錯(cuò)
abstract class AbClass{
abstract function a1();
abstract function a2();
}
class AbSonClass extends AbClass{
//全部重載父類(lèi)方法
function a1(){
echo "抽象方法1";
}
function a2(){
echo "抽象方法2";
}
}
接口和抽象類(lèi)非常相似,接口的引用,可以多引用,通過(guò)關(guān)鍵字implements 引用,全部為抽象方法,在引用它的子類(lèi)里面也必須全部覆蓋所有方法
interface InClass{
function in1();
function in2();
}
//先繼承后引用
class InSonClass extends MyClass implements InClass{
//全部重載父接口方法
function in1(){
echo "抽象方法1";
}
function in2(){
echo "抽象方法2";
}
}
接口和抽象類(lèi)的區(qū)別:
接口可以同時(shí)引用多個(gè),而抽象類(lèi)只能繼承一個(gè)
接口里面的方法全部為抽象方法,且不能有實(shí)現(xiàn)代碼,而抽象類(lèi)的方法可以有實(shí)現(xiàn)代碼
]]>