SONICMOOV Googleページ

【PHP入門】クラスの作成と継承

【PHP入門】クラスの作成と継承

  • このエントリーをはてなブックマークに追加

あれ??前にも似たような記事を書いた気がしますね。前回書いた内容と若干被るところもあるかと思うので復習しつつ話を進めていきましょう!
以前の記事はPHPオブジェクト指向の超キ・ホ・ン、クラスを理解しようを参照して下さい。

まずは上記記事の復習から。

クラスの作り方

<?php $pc = new PC();
class PC{
 private $inputKey; 

function setInputKey($inputKey)
{
 $this->inputKey = $inputKey;
} 

function getInputKey(){
  return $this->inputKey;
 }
}
$pc->setInputKey("ああああ");
echo $pc->getInputKey();
?>

こんな感じでしたね。

  1. new演算子でクラスの実体(インスタンス)を生成
  2. クラスの中でメンバ変数、メンバメソッドを設定

メンバ変数とはクラスの中で宣言する変数のことでプロパティとも言います。

private $inputKey;


メンバメソッド
?あぁ…これは説明していなかったですね(汗)。メンバメソッドとはクラスの中で定義する関数のことです。上記のコードであれば

function setInputKey($inputKey){
 $this->inputKey = $inputKey;
 }

 function getInputKey(){
 return $this->inputKey;
 }

の関数になります。では上記のコードを発展させてPCクラスの機能を持った別の新しいクラスを作ってみましょう。

クラスの継承とは

クラスの継承

継承とはあるクラスを元に別の新しいクラスを作り拡張する仕組みのことです。
今回はPCクラスを拡張しSmartPhoneクラスを作ってみます。

クラスの継承をプログラミングしてみよう!

クラスの継承について簡単に説明しましたので実際にプログラミングしてみましょう!手順は以前書いた記事に習って説明していきます。

1. 親クラス・子クラスを作ってみる

Class Extends

is_a

<?php class smartPhone extends PC {} ?>

書式は上の通りです。継承元のクラス(PCクラス)を親クラスまたはスーパークラス、継承先のクラス(smartPhoneクラス)を子クラスまたはサブクラスという言い方をします。

ちなみに接頭辞のスーパー(super-)とは「上の」、サブ(sub-)とは「下の」という意味になります。クラス図も作ってみました。プログラムを書く前にクラス図を書いておくと、大変プログラムが作りやすくなります。

2. スーパークラスのメンバ変数を呼び出してみる

new演算子で子クラスの実体を作り、子クラスのオブジェクトから親クラスのメンバ変数を呼び出せるか試してみましょう。

<?php

class PC{
 public $inputKey;

 function setInputKey($inputKey){
  $this->inputKey = $inputKey;
 }

 function getInputKey(){
  return $this->inputKey;
 }

}

class SmartPhone extends PC{}

$smartPhone = new SmartPhone();
$smartPhone->setInputKey("わわわわ");
echo $smartPhone->getInputKey();
?>

class_extends

子クラスのオブジェクトから親クラスのメンバ変数を参照できるようになります。

3. 子クラスでメンバ変数・メンバメソッドを定義してみる!

親クラスだけでなく、子クラスにもメンバ変数とメンバメソッドを設定してみましょう。

<?php
class PC{
 public $inputKey;

function setInputKey($inputKey){
 $this->inputKey = $inputKey;
 }

function getInputKey(){
 return $this->inputKey;
 }

}

class SmartPhone extends PC{
 public $touchKey;

function setTouchKey($touchKey){
 $this->touchKey = $touchKey;
}

function getTouchKey(){
 return $this->touchKey;
}

}

$smartPhone = new SmartPhone();
$smartPhone->setInputKey("ああああ\n");
$smartPhone->setTouchKey("わわわわ\n");
echo $smartPhone->getInputKey();
echo $smartPhone->getTouchKey();
?>

class_diagram2

class_output_2

子クラスで新しくメンバ変数、メンバメソッドを定義し呼び出すことができました。クラス図も載せておきます。

4. アクセス修飾子について見直してみる!

さて、ここでアクセス修飾子について見直してみましょう!前回記事で軽く紹介していますね。再掲します。

  • public…クラスの中、外、どこからでもメンバ変数にアクセス
  • protected…同じクラスもしくはその派生クラス内のメンバ変数にアクセス
  • private…同じクラス内のメンバ変数のみアクセス
<?php

class PC{ 

 function setInputKey($inputKey){
 $this->inputKey = $inputKey;
 }

 function getInputKey(){
 return $this->inputKey;
 }

}

class SmartPhone extends PC{
 private $inputKey;
 public $touchKey;

 function setTouchKey($touchKey){
 $this->touchKey = $touchKey;
 }

 function getTouchKey(){
 return $this->touchKey;
 }

}

$smartPhone = new SmartPhone();
$smartPhone->setInputKey("ああああ\n");
$smartPhone->setTouchKey("わわわわ\n");
echo $smartPhone->getInputKey();
echo $smartPhone->getTouchKey();
?>

3.で書いたコードを変えてみました。上記のコードでは子クラスで親クラスのメンバ変数を宣言しています。privateは同じクラス内のメンバ変数しかアクセスできません。このコードを実行するとどうなるでしょうか?

継承アクセスエラー

wandboxで試してみたところ、エラーが発生しましたね。privateは上記の通り、同じクラス内のメンバ変数にしかアクセスできません。$inputKeyは親クラスであるPCクラスのメンバ変数なのでprivateを付けてアクセスすることはできないわけですね。

protectedは同じクラスもしくはその派生クラス内のメンバ変数にアクセスできるので、上記のコードでは親クラス、子クラスどちらで付けてもアクセスできます。

以上がクラスの継承の基本的な説明になります。

【参考文献】・とほほのWWW入門 PHP入門 – クラスIT専科 クラス図

  • このエントリーをはてなブックマークに追加

記事作成者の紹介

カルチョス(システムエンジニア)

イラスト描いたり、音楽制作したり、ゲームエンジンいじったりとアーティストとしての一面も持っているエンジニアです。常に"目標"と"夢"を意識して日々過ごしております!希望創りし奇跡があらゆる戦いを凌駕する!!

システムエンジニア募集中!

×

SNSでも情報配信中!ぜひご登録ください。

×

SNSでも
情報配信中!
SONICMOOV Facebookページ SONICMOOV Twitter SONICMOOV Googleページ
システムエンジニア募集中!

新着の記事

mautic is open source marketing automation