PHPのクラスは、プログラムの処理をまとめたオブジェクトのことで、あらゆるプログラミング言語でクラスは使用されます。PHPのクラスにはさまざまな使い方があります。できることが多すぎていまいち理解が追いついていない私とそこのあなたのために基本的な部分をまとめたので学習記録として残します。
- オブジェクトとは、プログラミング手法の概念である。
- オブジェクト型とは、種類は複合型でデータ構造と処理が合わさった型である。
- オブジェクト型のチェックは、is_object()関数を使う
- オブジェクトはクラスやインスタンスを含めた全体やクラスやインスタンスそれぞれだったりする。
- object:物・物体・目標物・対象・目的語・客体などを指す英単語。
classとは
各クラスの定義は、classキーワードで始まり、クラス名が続きます。そして波括弧のペアが続き、その中にはクラスのプロパティ(定数、変数)とメソッド(関数)の定義を記述します。
<?php
class sampleclass
{
プロパティの宣言
public $var = 'a default value';
メソッドの宣言
public function displayVar() {
echo $this->var;
}
}
アクセス修飾子
アクセス修飾子とは、どこからアクセスできるのかを指定するものです。例えば、クラスの中にあるプロパティは、クラスの外からも使用できるのかといったアクセス権限に関する指定のことです。
- public : どこからでもアクセス可能
- private : クラス内のみからアクセス可能
- protected : クラス内とそのクラスを継承した子クラスからアクセス可能
クラスの概念
クラスの概念を説明するときによく車に例えて話しますが、ここでも車に例えて理解を深めましょう。クラスとはオブジェクトの設計書にあたります。車の設計書があれば、車をいくつも作成できます。
設計書から作成された車をインスタンス(実体)と言います。作成することをインスタンス化とかインスタンス生成と言います。基本的にインスタンスは変数に代入して使用します。
<?php
class Car
{
public function drive() {
echo 'ドライブ';
}
インスタンス化
$bmw = new Car();
あるクラスのインスタンスを生成するには、newキーワードを使わなければなりません。エラー時に例外をスローするようなコンストラクタを定義していない限り、オブジェクトが常に生成されます。クラスはそのインスタンスを作成する前に定義しなければなりません。
コードを見ると、インスタンス化を行い変数$bmwに代入しています。echoしているので「ドライブ」と表示されると考えられますが、この時点では、Carクラスのインスタンス化を行い、$bmwに代入しただけです。「ドライブ」と表示させるには、代入したインスタンスのdriveメソッドにアクセスする必要があります。代入されたインスタンスプロパティまたはインスタンスメソッドにアクセスするにはアロー演算子を使用します。
アロー演算子
インスタンス名 -> 呼び出すインスタンスのプロパティまたはメソッド名
$bmw -> drive();
結果 ドライブ
このようにインスタンスのプロパティやメソッドを呼び出すにはアロー演算子を使用します。インスタンスのプロパティやメソッドにアクセスするにはインスタンス化しなければなりません。インスタンス化を行わずに、クラスのプロパティやメソッドにアクセスするには、スコープ定義演算子「 :: 」を使用します。
スコープ定義演算子 ::
『ダブルコロン』はトークンの1つです。static、定数、およびオーバーライド(上書き)されたクラスのプロパティやメソッドにアクセスすることができます。これらの要素をクラスの定義の外から参照するには、クラスの名前を使用する。
class Math {
静的プロパティ
public static $a = 22;
静的メソッド
public static function sum($b,$c) {
echo '$b + $c;
}
}
クラス名 :: 呼び出すクラスのプロパティ名またはメソッド名
echo Math::$a; 静的プロパティへのアクセス
結果 22
Math::sum(2,2); 静的メソッドへのアクセス
結果 4
スコープ
プログラミングにおけるスコープとは、あるコンピュータ・プログラムにおいて、変数や関数などの識別子が参照できる範囲(有効範囲)のことです。
クラス名::
- 使用可能な場所: クラスの定義の中と外
- 明示されたクラス、クラス名さえ書いておけば、どのクラスを使うのかわかるためどこでも使える。
self::
- 使用可能な場所 : クラス定義の中
- 自クラスのプロパティ、メソッドへの静的アクセス
static::
- 使用可能な場所 : クラス定義の中
- 直近の”非転送コール”のクラス
parent::
- 使用可能な場所 : クラス定義の中
- 親クラスのプロパティやメソッドを呼び出すことが可能
非転送コール
C::foo()や$C->foo()といったクラス名(もしくはオブジェクト)を明示した呼び出し
転送コール
self:: parent:: static:: もしくはクラス階層の中でのforward_static_call()での呼び出し
クラスのプロパティとメソッドとインスタンスのプロパティとメソッドの違い
クラスのプロパティやメソッドにはstaticという修飾子を付ける必要があります。staticがあるかないかでクラスなのか?インスタンスなのか?の判断ができます。
インスタンス化するときに実行される特別なメソッド
new演算子でインスタンス化するときに実行される特別なメソッドをコンストラクタと言います。オブジェクト作成時に初期化処理が必要な場合など、コンストラクタ内に記述しておけば自動的に実行してくれます。
$tv = new Television();
print ('現在のチャンネルは'.$tv1->getChannel().'です。');
class Television {
private $channelNo;
function __construct() {
$this->channelNo = 8;
}
function getChannel() {
return $this->channelNo;
}
}
結果 現在のチャンネルは8です
$thisとself::
$thisはインスタンス自身(オブジェクト)を指し、インスタンス化した際、クラス内のメンバ変数やメソッドにアクセスする際に使用します。静的プロパティにはアクセスできません。
self::は自クラスを示します。クラス定数、static変数については、インスタンス化せずに使用します。そのため$thisは使用せず、代わりにselfを使用します。
静的なプロパティにアクセスする際にはself::を使用し、動的なプロパティやメソッドにアクセスする際には$thisを使用します。
<?php
class KaniClass {
public $val = 'kani-toto'; メンバ変数
public function KaniMethod() {
$val = 'Engineer'; ローカル変数
echo $this->val;
}
}
インスタンス化
$class = new KaniClass();
メソッドの呼び出し
$class->KaniMethod();
結果 kani-toto
上記では、クラスのメンバ変数とメソッドのローカル変数で同じ変数名を定義しています。$thisを使用すれば、例のようにメンバ変数を参照できます。$thisを使用しなければローカル変数を参照します。
クラスのメンバ変数のことをプロパティと言います。それ以外に属性やフィールドなどという呼び方もあります。メンバ変数はプロパティと読み替えてもらって差し支えないです。ということはメンバ関数はメソッドと読み替えても差し支えないということになる。
クラスの継承
Aというクラスを基にしてBというクラスを作成することが出来ます。基となるクラスの変数や関数を引き継いで新しいクラスを作成することを継承と呼びます。基となるクラスを親クラスまたはスーパークラスといい、継承してクラスを子クラスまたはサブクラスといいます。
class クラス名 extends 親クラス
親クラスは複数の子クラスを持てます。これを単一継承と言います。逆にみると子クラスはひとつの親クラスしか持てません。
子クラスは複数の親クラスを持てません。これを多重継承といいます。
親子の関係ですが、子クラスは親クラスの変数や関数を引き継いでいます。逆に親クラスは子クラスの変数や関数は引き継ぎません。is a関係が成り立つときに継承するべきと言われています。BMW is a Carのようにこのような関係が成り立つ際に利用するのが望ましいとされているようです。
クラスは進めば進むほど当たり前の理解が必要となりますのでしっかり理解したいですね。こちらを参考に今回は勉強させてもらいました。それでは、また!!