📘

【PHP】クラス編~クラスの基礎、継承、アクセス権~

2021/09/19に公開

クラスについて

オブジェクト指向に基づいた考え方で、データとデータを操作する処理(メソッド)を一つのオブジェクトと呼ばれる単位に一体化して扱う。あるオブジェクトがどのようなデータとメソッドから作られるのかを定義した、雛形にあたるものをクラスという。

classの定義

クラスの定義はclass クラス名として{}の間にそのクラスの内容を書いていきます。
クラスにはプロパティメソッドの2つを定義します。それぞれの概要は以下です。

・プロパティ

クラスがもつデータのことで、public $プロパティ名のように定義します。
インスタンス->プロパティ名とすることでアクセスすることができます。

・メソッド

クラスに関連する処理(関数)のことで、public function メソッド名()のように定義します。
インスタンス->メソッド名()とすることでメソッドにアクセスすることができます。

class SampleClass {
    public $name; // プロパティの宣言
    
    // メソッドの宣言
    public function hello($name) {
        echo 'こんにちは!'.$name;
    }
}

インスタンス

インスタンスとはクラスを元に生成された実体でnew クラス名()で生成します。
$変数名 = new クラス名()のようにすることでインスタンスを変数に代入し使用します。

$sample = new SampleClass(); // インスタンスの生成

$sample->name = 'Kate'; // プロパティに値をセット

$sample->hello($sample->name); // メソッドの呼び出し。 引数:プロパティの呼び出し。

// 結果: こんにちは!Kate

クラスの基礎

コンストラクタ

__constructという特別なメソッドを定義することでインスタンスを生成するときに、このメソッドが自動的に呼ばれます。そのためコンストラクタには最初に行いたい処理を書きます。
またコンストラクタはインスタンス生成時に引数を渡すことでその引数を使用することが出来ます。

・this

生成したインスタンスのプロパティやメソッドにアクセスしたい時には$thisを用いります。
$thisはクラス内のメソッドの中でのみ使用でき、そのメソッドを呼び出しているインスタンスに置き換えられます。

class SampleClass {
    public $name;
    
    // コンストラクタの宣言
    public function __construct($name) {
        $this->name = $name; // 生成したインスタンスのプロパティにセット
    }
}

$sample1 = new SampleClass('Kate'); // コンストラクタに引数「'Kate'」が渡る
$sample2 = new SampleClass('Bob'); // コンストラクタに引数「'Bob'」が渡る

$sample1->name; // 結果: こんにちは!Kate
$sample2->name; // 結果: こんにちは!Bob
// それぞれのインスタンスにプロパティがセットされている

static

個々のインスタンスに関係のないデータや処理を行う場合はstaticを用いて宣言することでクラスプロパティもしくはクラスメソッドを定義することができます。また、クラスのインスタンス化の必要なしにアクセスすることができます。

・クラスプロパティ

クラスプロパティはstatic 変数名のように定義し、クラス名::$クラスプロパティ名で呼び出すことができます。

・クラスメソッド

クラスメソッドはstatic メソッド名のように定義し、クラス名::クラスメソッド名で呼び出すことができます。

・self

クラス内でクラスプロパティにアクセスする際はselfを用います。
selfは、クラスの中で使うとそのクラス自身のことを指し示し、self::$クラスプロパティ名のように使います。

class SampleClass {
    public static $count = 0; // クラスプロパティの宣言
    
    public function __construct() {
	self::$count++; // クラスプロパティにアクセス
    }
    
    // クラスメソッドの宣言
    public satic function number() {
	echo 'このクラスのインスタンスが生成数は'.self::$count.'です';
    }
}
// インスタンス生成
$sample1 = new SampleClass();
$sample2 = new SampleClass();

echo SampleClass::$count; // クラスプロパティの呼び出し
// 結果: 2
SampleClass::number(); // クラスメソッドの呼び出し
// 結果: このクラスのインスタンスが生成数は2です

継承

すでに定義されているクラスのプロパティやメソッドを別のクラスに引き継ぐことを継承といいます。この時、元のクラスを親クラス、継承して新しくできるクラスを子クラスといいます。
継承を行う場合は「class 子クラス名 extends 親クラス名」のように定義します。
子クラスは、親クラスのプロパティやメソッドを全て引き継いだ上で、独自プロパティ、独自メソッドを定義できます。

オーバーライド

オーバーライドは親クラスで定義されたメソッドを子クラスで再定義することで別の処理に上書きすることができます。

parent

オーバーライドの際に親クラスで定義したメソッドを呼び出したいときには、parent::メソッド名のように記述することで親クラスのメソッドが実行されます。

// 親クラス
class ParentClass {
    public $name;
    
    public function greeting($name) {
	echo '初めまして、'.$name.'です。';
    }
}

// 親クラスを継承した子クラス
class ChildClass extends ParentClass {
    public $age;
    
    // オーバーライド
    public function greeting($name, $age) {
        parent::greeting($name); // 親クラスのメソッド実行
	echo $age.'歳です';
    }
}

$parent = new ParentClass();
$parent->greeting('Kate'); // 結果: 初めまして、Kateです

$child = new ChildClass();
$child->greeting('Kate', '25'); // 結果: 初めまして、Kateです。25歳です

アクセス権

上記でクラスのプロパティやメソッドを定義する際にpublic ~~と記載していましたがこのpublic修飾子といい、そのプロパティやメソッドへのアクセスを制限することができます。
修飾子には以下の3つのアクセス権があり、許可した範囲からしかアクセスすることができません。

  • public: どこからでもアクセス可能
  • protected: そのクラスと子クラス内からのみアクセス可能
  • private: そのクラス内からのみアクセス可能
アクセス権 public protected private
定義したクラス内
子クラス ×
クラス、子クラスの外 × ×

カプセル化

クラスのプロパティとメソッドへのアクセスを制限することをカプセル化と言い、クラスを設計する際には他の人がそのクラスを利用しやすいように、使ってほしい機能は公開(public)し、クラスの外で使ってほしくない機能は隠(private)します。
使える機能を制限することで他の人はどの機能を使えばいいかが分かりやすく、安全にクラスを利用することができます。

Discussion