Php面向對象 – 繼承和重寫
繼承:
php中,通過在類上,使用特殊的操作達到目的。
通過在定義類時,利用extends來指明當前類對象繼承那個類的對象。
例子:
class C
{
public $p_c = “value c”;
}
class D extends C
{
public $p_d = “value d”;
}
$o = new D;
var_dump($o->p_c)
var_dump($o->p_d)
輸出:string(7) “value c” string(7)“value d”
繼承,指的是兩個對象之間,那麼哪有這兩個對象?
Instanceof 操作符 (判斷對象是否是某類的實例)
var_dump($o instanceof D);
輸出:bool(true)
var_dump($o instanceof C);
輸出:bool(true)
因此,一個對象即是當前類的實例,也是該類所繼承類的實例。
Class D extends C
D類對象,繼承自C類對象。
父類:被繼承的類,C類
子類:需要繼承的類,D類
基類:C類是D類的基類
擴展類:D類是C類的擴展類。
重要:
php是單繼承。
繼承的目的:
在於擴展,或者使用某類已經存在的操作和數據。
重寫 override
繼承時,如果發生成員沖突,php的處理方式,為重寫。就是子類同名成員覆蓋父類同名成員。不能看到父類的同名成員。
例子:
1.
class P
{
public $name = ‘P’;
}
class C extends P
{
public $name = “C”;
}
$o = new C;
echo $o->name;
2.
class P
{
public $name = ‘P’;
public function sayName()
{
echo‘parent::name’,$this->name;
}
}
class C extends P
{
public $name = “C”;
public function sayName()
{
echo‘self::name’,$this->name;
}
}
$o = new C;
$o->sayName();
輸出:self::name C
構造方法重寫:
例子:
class P
{
public__construct()
{
echo“parent::construct”;
}
}
class D extends P
{
public__construct()
{
echo“self::construct”;
}
}
$o =new D;
輸出:self::construct
如果需要,強制執行被重寫的父類方法,可以顯示的使用父類來調用相應的父類方法即可:
例子:
class P
{
public__construct()
{
echo“parent::construct”;
}
}
class D extends P
{
public__construct()
{
P::__construct();
echo“self::construct”;
}
}
$o =new D;
輸出:parent::construct self::construct
可以使用一個關鍵字,在類內,代替當前的父類
parent關鍵字
例子:
class P
{
public__construct()
{
echo“parent::construct”;
}
}
class D extends P
{
public__construct()
{
parent::__construct();
echo“self::construct”;
}
}
$o =new D;
如果說父類的構造需要相應的參數,則需要在調用時,將父類構造方法需要的參數傳遞到方法內。
例子:
class Goods
{
public $goods_name ;
public $goods_price;
public function __construct($name,$price)
{
$this->goods_name= $name;
$this->goods_price= $price;
}
}
class GoodsBook extends Goods
{
public $pages;
public function __construct($name,$price,$pages)
{
parent::__construct($name,$price);
$this->pages= $pages;
}
}