作成日:2018-12-14, 更新日:2019-12-23
クラスと継承(extends)の基本
class A {
public $a = 'earth';
public function getName(){
return 'Heaven';
// return $this->a; // 「$a='earth'」を使うとき
}
public function hello(){
echo 'hello ' . $this->getName();
}
}
class B extends A{
public function getName(){
return 'Hell';
}
}
$hogeA = new A();
echo $hogeA->a; // 「earth」が出力
$hogeA->hello(); // 「hello Heaven」が出力
$hogeB = new B();
$hogeB->hello(); // 「hello Hell」が出力
静的(static)
継承が絡まない場合
class A {
public static $a = 'earth';
public static function getName(){
return 'Heaven';
// return self::$a; // 「$a='earth'」を使うとき
}
public static function hello(){
echo 'hello ' . self::getName();
}
}
echo A:$a; // 「earth」が出力
A::hello(); // 「hello Heaven」が出力
継承が絡む場合
▼継承先でオーバーライドさせる:「self」を「static」にする
class A {
public static function getName(){
return 'Heaven';
}
public static function hello(){
echo 'hello ' . self::getName(); // 「self」を使う
}
public static function bye(){
echo 'bye ' . static::getName(); // 「self」じゃなく「static」を使う
}
}
class B extends A {
public static function getName(){
return 'Hell';
}
}
B::hello(); // オーバーライドが無効で「hello Heaven」が出力
B::bye(); // オーバーライドが有効で「bye Hell」が出力
| 継承元 | static::〇〇〇() |
|---|---|
| 継承先 | self::〇〇〇() |
継承先で継承元のメソッドを使う
例としては微妙だけど・・・「parent」を使う。
class A {
public static function hello(){
echo 'hello Heaven';
}
}
class B extends A {
public static function hello2(){
parent::hello();
}
}
B::hello2(); // 「hello Heaven」が出力
staticじゃない親
▼継承元のメソッドがstaticじゃない場合・・・同じ「parent::」でOK
parent::〇〇〇();