とぎぷろべい

包丁研ぎとプログラミングと米国株投資についてのなんやかんや

クラス継承について(PHP)

f:id:feci:20210727001932j:plain

PHP7

 

PHP7.4.1におけるクラス継承について

<?php
declare(strict_types=1);


//クラスその①
class Class1 {                       //Class1という名前のクラスを定義
  public string $ca;                 //str型のプロパティcaの定義
  private int $cb;                   //int型のプロパティcbの定義

//コンストラクター
  public function __construct(string $ca, int $cb = 0) {  //publicと__constructは固定
    $this->ca = $ca;                 //インスタンス化したときのパラメータ1を$caに代入
    $this->cb = $cb;                 //インスタンス化したときのパラメータ2を$cbに代入
  }

 //$cbプロパティへのアクセス(セッター)
  public function setCb1(int $cb) {
    if ($cb <= 0) {
      return false;                 //もし引数に0以下の値がきたらその命令は無視する
    }
    $this->cb = $cb;                //setCb1の引数を$cbプロパティに代入
    return true;                    //なんかあったほうがいいっぽい記述
  }

 //$ccプロパティへのアクセス(セッター)
  public function setCb2(int $cc) {
    if ($cc <= 0) {
      return false;                 //もし引数に0以下の値がきたらその命令は無視する
    }
    $this->cc = $cc;                //setCb2の引数を$ccプロパティに代入
    return true;                    //なんかあったほうがいいっぽい記述
  }

 //$cbプロパティの値をnumber_formatで処理して返す(ゲッター)
  public function getCb1() {         //パラメータなし
    return number_format($this->cb); //cbの値をnumber_formatで処理して返す
  }

 
//$cbプロパティの値をnumber_formatで処理して返す(ゲッター)
  public function getCb2(string $cba = '円') { //パラメータとデフォルト引数あり
    return number_format($this->cb) . $cba;    //cbの値を関数で処理した値に$cbaを連結して返す
  }

 //$ccプロパティの値を返す(ゲッター)
  public function getCb3(string $cca = '残り'string $ccb = '食') {
    return $cca . $this->cc . $ccb;            //ccの値の前後に$ccaと$ccbを連結して返す
  }
}

//クラスその②(Class1クラスの子クラス)
class Class1_1 extends Class1 {
  protected int $cc;                 //privateではアクセス権がないので無理
}


//処理
$ca = new Class1_1('グラタン'1100);//class1_1クラスとその親クラスのインスタンスを作成
$ca->setCb1(1180);                   //メソッドを通して$cbにアクセス
$ca->setCb2(10);                     //メソッドを通して$ccにアクセス

echo $ca->ca, ':', $ca->getCb2(), ':', $ca->getCb3(), "\n"//グラタン:1,100円:あと10食

$cb = new Class1_1('ピザ'1400);    //class1_1クラスとその親クラスのインスタンスを作成
$cb->setCb2(7);                      //メソッドを通して$ccにアクセス

echo $cb->ca, ':', $cb->getCb2(), ':', $cb->getCb3(), "\n"//ピザ:1,200円:あと7食

クラス継承とは、継承元の親クラスのプロパティやメソッドを継承先の子クラス(サブクラス)が機能的に引き継ぐことです。

ただアクセス修飾子的な問題で、publicとprotectedのプロパティやメソッドはすべて機能的に引き継げるのですが、privateのものに関しては相互にアクセスすることはできません。

 

 

クラス継承(子クラス作成)の定形は以下のとおりです。

 

class 子クラス名 extends 親クラス名 {
    アクセス修飾子 データ型 プロパティ名;

    アクセス修飾子 function メソッド名(引数1, ...) {
        実行したい処理;
    }
}

 

 

子クラスが存在する場合は、その子クラスと親クラスのインスタンスは子クラスをインスタンス化することでまとめて作れます。

この場合の親クラスのセッターやゲッターの実行は、その子クラスのインスタンスからアロー演算子を使って親クラスにある実行したいメソッド名を指定するだけでOKです。

 

また、子クラスに引数がなく親クラスにコンストラクターがある場合は、子クラスのインスタンス化のときにパレンティス(丸括弧)内には親クラスのコンストラクター用のパラメータを指定する必要があります。

 

 

〇アクセス修飾子の一覧

public   どこからでもアクセス可能。
protected   そのクラス自身とそのクラスを継承したクラスからのみアクセス可能。
private     宣言したクラス内からのみアクセス可能。

 

 

以上です。