PHP オブジェクト指向 – 継承とオーバーライド
継承:
PHP では、クラスに対する特別な操作を使用することで目的が達成されます。
クラスを定義するときは、extends を使用して、現在のクラス オブジェクトがどのクラス オブジェクトを継承するかを示します。
例:
クラスC
{
public $p_c = “値 c”;
}
クラス D は C を拡張します
{
public $p_d = “値 d”;
}
$o = 新しい D;
var_dump($o->p_c)
var_dump($o->p_d)
出力: string(7) “値 c” string(7) “値 d”
継承は 2 つのオブジェクト間を指します。では、これら 2 つのオブジェクトはどこにあるのでしょうか?
Instanceof 演算子 (オブジェクトが特定のクラスのインスタンスであるかどうかを判断します)
var_dump($o D のインスタンス);
出力: bool(true)
var_dump($o C のインスタンス);
出力: bool(true)
したがって、オブジェクトは現在のクラスのインスタンスであり、その継承元のクラスのインスタンスでもあります。
クラス D は C を拡張します
C クラス オブジェクトから継承された D クラス オブジェクト。
親クラス: 継承クラス、クラスC
サブクラス: 継承する必要があるクラス、クラス D
基本クラス: クラス C はクラス D の基本クラスです
拡張クラス: クラス D はクラス C の拡張クラスです。
重要:
phpは単一継承です。
継承の目的:
それは、特定の種類の既存の操作やデータを拡張または使用することにあります。
オーバーライド
継承時にメンバーの競合が発生した場合、PHPの対処方法は書き換えとなります。つまり、同じ名前を持つサブクラスのメンバーは、同じ名前を持つ親クラスのメンバーをオーバーライドします。同じ名前を持つ親クラスのメンバーは表示されません。
例:
1.
クラスP
{
パブリック $name = 'P';
}
クラス C は P を拡張します
{
パブリック $name = “C”;
}
$o = 新しい C;
echo $o->name;
2.
クラスP
{
パブリック $name = 'P';
パブリック関数sayName()
{
echo ‘parent::name’,$this->name;
}
}
クラス C は P を拡張します
{
パブリック $name = “C”;
パブリック関数sayName()
{
echo ‘self::name’,$this->name;
}
}
$o = 新しい C;
$o->sayName();
出力: self::name C
コンストラクターメソッドの書き換え:
例:
クラスP
{
public__construct()
{
echo “parent::construct”;
}
}
クラス D は P を拡張します
{
public__construct()
{
エコー "self::construct";
}
}
$o =新しい D;
出力: self::construct
必要に応じて、オーバーライドされた親クラス メソッドの実行を強制するには、親クラスを明示的に使用して、対応する親クラス メソッドを呼び出すことができます。
例:
クラスP
{
public__construct()
{
echo “parent::construct”;
}
}
クラス D は P を拡張します
{
public__construct()
{
P::__construct();
エコー "self::construct";
}
}
$o =新しい D;
出力:parent::construct self::construct
クラス内でキーワードを使用して、現在の親クラスを置き換えることができます
親キーワード
例:
クラスP
{
public__construct()
{
echo “parent::construct”;
}
}
クラス D は P を拡張します
{
public__construct()
{
親::__construct();
エコー "self::construct";
}
}
$o =新しい D;
親クラスの構築に対応するパラメータが必要な場合は、呼び出し時に親クラスの構築メソッドに必要なパラメータをメソッドに渡す必要があります。
例:
クラスグッズ
{
公開 $goods_name ;
公開 $goods_price;
パブリック関数 __construct($name,$price)
{
$this->goods_name= $name;
$this->goods_price= $price;
}
}
クラス GoodsBook は Goods を拡張します
{
公開 $pages;
パブリック関数 __construct($name,$price,$pages)
{
親::__construct($name,$price);
$this->pages= $pages;
}
} を使用する