LoginSignup
0
0

More than 3 years have passed since last update.

【PHP】オブジェクト指向を学ぶ[その]3

Posted at

オーバーライド

継承した親クラスのメソッドやプロパティを書き換えると言うもの。

とりあえずコード。

index.php
<?php

//クラス定義
class Self_Introduction{

    // プロパティー
    // 変数定義
    private $name;
    private $age;


    // インスタンスが生成されると同時に処理が走る
    public function __construct($name, $age){
        $this->setName($name);
        $this->setAge($age);
    }

    private function setName($name){
        $this->name = $name;
    }

    private function setAge($age){
        $this->age = $age;
    }

    function getName(){
        return "私の名前は{$this->name}です。<br>";
    }

    public function getAge(){
        return "年齢は{$this->age}才です。<br>";
    }

    public function getIntroduction(){
        return "私の名前は{$this->name}です<br>年齢は{$this->age}才です。<br>";
    }
}

class Sub_Introduction extends Self_Introduction{

    private $blood;

    public function __construct($name, $age, $blood){
        parent::__construct($name, $age);
        $this->setBlood($blood);
    }

    private function setBlood($blood){
        $this->blood = $blood;

    }

    public function getBlood(){
        return "血液型は{$this->blood}です。<br>";
    }

    public function getIntroduction(){
        return "{$this->getName()}{$this->getAge()}{$this->getBlood()}";
    }

}

// インスタンス生成
$USER = new Self_Introduction('太郎', 35);
$user = new Sub_Introduction('太郎', 35, 'A型');

echo $USER->getIntroduction();
//私の名前は太郎です
//年齢は35才です。


echo $user->getIntroduction();
//私の名前は太郎です。
//年齢は35才です。
//血液型はA型です。

getIntroduction();に注目してください。
getIntroduction();は親classでも子classでも使用されています。

ですが、子classでgetIntroduction();を呼び出し出力結果を見るとちゃんと上書きされているのが分かります。

このように継承した親クラスのメソッドやプロパティを書き換えることをオーバーライドと言います。

静的メンバ

次は静的メンバです。
静的メンバはプロパティやメソッドをひっくるめた言い方

プロパティやメソッドを静的メンバにするとクラスの外からプロパティやメソッドを使えるようにすること。

使用方法
publicをつける
staticをつける
です。

コードを見ていきます。

index.php
class Foo{

    public static $age = 20;
    public $name = '花子';

    public static function HOGE(){
        return '静的メンバです';
    }

}

echo Foo::$age; //20
echo Foo::$name //出力されず
echo Foo::HOGE(); //静的メンバです

//インスタンス生成
$foo = new Foo();
echo $foo->age; //NULL
echo $foo->name; //花子
echo $foo->HOGE(); //静的メンバです



結果はこのような感じになります。

まず上から見ていきます。
echo Foo::$age・・・インスタンスを作成していなくても呼び出せていますね。これが静的メンバです。
echo Foo::$name・・・では$nameはと言うと呼び出せていません。このプロパティはインスタンスを生成して初めて使えるものです。
echo Foo::HOGE();・・・次はメソッド。これもちゃんと呼び出せています。ですが、メソッドに限りstaticにしていなくても呼び出せてしまうので注意が必要です。

次はインスタンスを生成して呼び出してみます。
echo $foo->age;・・・これは呼び出せません。と言うのも静的メンバはclassに属しているものであってインスタンスに属しているものじゃないからです。
echo $foo->name;・・・これは当たり前ですが呼び出せます。
echo $foo->HOGE();・・・これも呼び出せてしまうので注意が必要です。
インスタンス生成しても静的メンバはそのインスタンスの中には入っていない。

こう見るとインスタンスを生成しなくても呼び出せる静的メンバは関数みたいですね。

以上。

※「ここ間違っている」や「こんなことも覚えておいた方がいい」と言うものがあれば是非教えてください

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0