クラスの継承や抽象化の意味や使い方がいまいちわからない
PHPのクラスを使いこなせるようになりたい
PHPのクラスは通常のクラスとしての使い方以外に、クラスを継承したり、静的メンバの参照、クラス内で定数を使用する方法など、クラスを使用してさまざまな処理が可能です。
しかし、できることが多すぎていまいちクラスの使い方を理解している方も多いのではないでしょうか?
そこで、今回はクラスとは何か?というところから、実際のクラスの使い方、継承や抽象化などより応用的な使い方についても解説していきます。
この記事はこんな人のために書きました
- クラスの概要や使い方について知りたい方
- クラスの継承や抽象化について知りたい方
- クラスのさまざまな使い方について知りたい方
この記事を読んで、PHPのクラスを使いこなせるようになりましょう!
PHPのクラスとは
クラスとは簡単に説明すると、プログラムの処理をまとめたオブジェクトのことで、あらゆるプログラミング言語でクラスは使用されます。
クラスの中では主に、プロパティ(変数や定数)やメソッド(関数)の定義を記述します。クラスを定義するには、classキーワードを指定し、その次にクラス名を指定します。
クラスの書き方:
class クラス名 { //プロパティの宣言 public $変数名 = 値; //メソッドの宣言 public function メソッド名(){ メソッド内処理... } }
クラス名には予約語以外のあらゆる名前を指定することができます。クラス名の後には波括弧{}のペアを指定して、そのなかにクラスの処理を記述していきます。
PHPなどのオブジェクト指向のプログラミング言語では、クラスを使用するために、クラスのオブジェクトを生成する必要があります。
$クラスオブジェクト = new クラス名();
生成したオブジェクトからプロパティの値を参照したり、メソッドを呼出したりすることができます。
PHPのクラスの使い方
基本的な使い方
ここでは、クラスの使い方を見ていきましょう。以下にclassを使用した簡単なサンプルを記述します。
サンプルプログラム
<?php class SampleClass { //プロパティの宣言 public $var = 'This is Sample Class.'; } //インスタンスの生成 $sample = new SampleClass(); echo $sample->var; ?>
実行結果:
This is Sample Class.
サンプルでは、クラスSampleClassを作成し、その中でプロパティを宣言して値を代入しています。実際にクラスを使用するには、クラスのオブジェクトを生成する必要があるため、「$sample = new SampleClass()」でインスタンスを生成しています。
クラス内のプロパティを参照するには、作成したオブジェクト変数に矢印演算子(->)でクラスのプロパティを指定します。
継承(extends)
クラスのプロパティやメンバを、他のクラスで継承する場合はextendsを指定します。extendsを使用して、クラスを継承するためには、以下のように記述します。
継承の書き方:
class クラス名 extends 継承元クラス名{ 処理… }
以下にextendsを指定してクラスを継承する方法を記述します。
サンプルプログラム
<?php //親クラス class ParentClass{ public function WorkItem1($str){ echo $str.'ParentClass <br>'; } public function WorkItem2(){ echo 'Processing of WorkItem2 of ParentClass. <br>'; } } //子クラス class ChildClass extends ParentClass{ public function WorkItem1($str){ echo $str.'ChildClass <br>'; } } //インスタンスを生成 $parent = new ParentClass(); $child = new ChildClass(); //メソッドの呼出し $parent->WorkItem1('Processing of '); $child->WorkItem1('Processing of '); $parent->WorkItem2(); $child->WorkItem2(); ?>
実行結果:
Processing of ParentClass Processing of ChildClass Processing of WorkItem2 of ParentClass. Processing of WorkItem2 of ParentClass.
このサンプルでは親クラスであるParentClassと、子クラスであるChildClassクラスを定義しています。
ChildClassではextendsを指定して、親クラスのParentClassクラスを継承しています。クラスの継承を指定すれば、子クラスのインスタンスから親クラスのメソッドにアクセスできます。
クラスを継承する方法については、以下の記事で詳しく解説していますので、ぜひ参考にしてくださいね!
抽象化(abstract)
抽象クラスとは他のクラスを継承して使用するためのクラスです。
クラスを抽象化すると、そのクラスは直接インスタンスを生成できなくなります。抽象クラスを使用するためにはabstractを指定する必要があります。
抽象クラスの定義:
abstract 抽象クラス名{ }
抽象クラスには抽象メソッドを定義することができます。抽象メソッドは直接処理を持たない名前だけ定義されたメソッドです。抽象メソッドを定義するには抽象クラスと同じくabstractを指定します。
抽象メソッドの定義:
abstract 抽象クラス名{ abstract public function メソッド名(); }
以下に抽象クラスを使用したサンプルを紹介します。
サンプルプログラム
//抽象クラス abstract class AbstractClass { // 抽象メソッドの定義 abstract protected function getValue(); abstract protected function getText($str); // メソッドの定義 public function thisClass() { echo $this->getValue() . '<br>'; } } class SampleClass1 extends AbstractClass { protected function getValue() { return "SampleClass1"; } public function getText($str) { return "{$str}SampleClass1"; } } class SampleClass2 extends AbstractClass { public function getValue() { return "SampleClass2"; } public function getText($str) { return "{$str}SampleClass2"; } } $class1 = new SampleClass1; $class1->thisClass(); echo $class1->getText('Samurai_') .'<br>'; $class2 = new SampleClass2; $class2->thisClass(); echo $class2->getText('Engineer_') .'<br>';
実行結果:
SampleClass1 Samurai_SampleClass1 SampleClass2 Engineer_SampleClass2
サンプルプログラムでは通常のクラスのオブジェクトを生成し、オブジェクトから抽象クラスのメソッドを呼出しています。抽象クラスで定義している抽象メソッドは、継承先のクラスで必ず再定義(オーバーライド)する必要があります。
コンストラクタ(__construct)
コンストラクタとはクラスからインスタンスを生成するときに、最初に呼び出される関数のことを言います。コンストラクタは__construct()で定義し、newでインスタンスを生成すると必ず実行されます。
コンストラクタの定義:
class クラス名{ function __construct(){ …処理… } }
コンストラクタはクラスのインスタンスを生成する度に実行されますので、変数などを初期化する処理でよく使われます。以下にコンストラクタを使用したサンプルを紹介します。
サンプルプログラム
class SampleClass { protected $text; //コンストラクタの定義 function __construct() { $this->text = 'Samurai Engineer'; } //メソッドの定義 function show() { echo $this->text; } } //インスタンスの生成 $class = new SampleClass(); //メソッドの呼出し $class->show();
実行結果:
Samurai Engineer
サンプルプログラムではクラスのインスタンス生成と同時にコンストラクタ(__construct)が呼び出され、変数$textの初期化処理を行っています。
そのあとに「$class->show()」でメソッドを呼び出し、変数を参照すると変数に値が設定されていることが分かります。
静的メンバの使用(static)
クラスのプロパティやメソッドなどのメンバを参照するには、new演算子を使用して、クラスのインスタンスを生成する必要があります。
しかし、クラス内でstaticを指定すれば、そのクラスのメンバはインスタンスを生成しなくても、参照することが可能です。
staticな変数を指定するには、以下のように記述します。
静的メンバの定義:
クラス名{ static $変数名 = 値; //処理 }
以下にstaticな変数を定義して、クラス外からインスタンスを生成しないでアクセスするサンプルを紹介します。
サンプルプログラム
<?php class Foo { //静的変数を作成する public static $val = 10; } //静的変数を参照する $value = Foo::$val; echo $value; ?>
実行結果:
10
staticを指定して静的メンバを参照する方法については、以下の記事で詳しく解説しています!
定数の使用(const)
クラス内で定数を指定するには、constを使用します。constを指定した定数をクラス内部で定義するときにはconstの後に定数名と値を指定します。
定数の定義:
class クラス名{ const 定数名 = 値; }
以下にconstを使用して定数を指定する方法を紹介します。
サンプルプログラム
<?php class ConstClass { //定数を定義する const CONSTNUM1 = 100; const CONSTNUM2 = 200; function showConst(){ echo self::CONSTNUM1.'<br>'; echo self::CONSTNUM2; } } $Class = new ConstClass(); $Class->showConst(); ?>
実行結果:
100 200
定数を使用する方法については、以下の記事で詳しく解説しています!
例外の指定(exception)
プログラムの実行中に発生する例外を扱うには、try~catch文を指定します。
例外は独自の例外クラスを使用することも可能です。使用するには、Exceptionクラスを拡張します。
例外処理:
try { // 例外が発生する可能性のあるコード } catch (Exception $e) { // 例外が発生した場合に行う処理 }
そんな例外クラスの使用方法については、以下の記事で詳しく解説しています!
プロパティを取得(get_class_vars)
クラスのデフォルトのプロパティのを取得するにはget_class_vars関数を使用します。
get_class_vars関数は以下のように記述します。
書き方:
array get_class_vars ( string $クラス名 )
返り値:
現在のスコープから参照できる変数やデフォルト値を連想配列で返します。配列要素は「変数名=>値」となります。エラーが発生した場合はFALSEを返します。
サンプルプログラム
以下にget_class_vars関数を使用して、クラスのプロパティを取得するサンプルを紹介します。
<?php class sampleclass { var $item1; var $item2 = "ABCD"; var $item3 = 100; public $item4 = 1000; private $item5 = 2000; // コンストラクタ function __construct() { //プロパティを設定する $this->item1 = "EFGH"; $this->item2 = "300"; return true; } } $sample_class = new sampleclass(); $class_array = get_class_vars(get_class($sample_class)); print_r($class_array); ?>
実行結果:
Array ( [item1] => [item2] => ABCD [item3] => 100 [item4] => 1000 )
先述したようにget_class_vars関数は、実行時のスコープから参照できる範囲の値を取得します。そのため、コンストラクタでプロパティの値を変更してもget_class_varsでは参照できません。
クラスが定義済みか確認する(class_exists)
クラスが定義済みか確認したい場合はclass_exists関数を使用します。
書き方:
bool class_exists ( string $クラス名 [, bool $autoload = true ] )
引数:
第一引数にはクラス名を指定します。クラス名は大文字と小文字を区別しません。
第二引数にTRUEを指定すると、クラスのオートローディングを行います。
オートローディングについては以下のサイトで詳しく解説しています。
http://php.net/manual/ja/language.oop5.autoload.php
返り値:
指定したクラスが定義されている場合はTRUE、指定されていない場合はFALSEを返します。
サンプルプログラム:
class SampleClass1{ function __construct() { echo 'SampleClass1<br>'; } } if (class_exists('SampleClass1')) { $class = new SampleClass1(); } if (class_exists('SampleClass2')) { $class = new SampleClass2(); }else{ echo 'SampleClass2は定義されていません'; }
実行結果:
SampleClass1 SampleClass2は定義されていません
まとめ
ここでは、PHPで使用するクラス(class)について以下の内容を解説しました。
- クラスとは
- クラスの基本的な使い方
- クラスの継承(extends)
- クラスの抽象化(abstract)
- クラスのコンストラクタ(__construct)
- クラスで静的メンバを使用する(static)
- クラス内で定数を使用する(const)
- 例外を指定する(exception)
- クラスのプロパティを取得する(get_class_vars)
- クラスが定義済みか確認する(class_exists)
クラスはプログラムを扱う上で、基本的な処理となりますので使い方はしっかりと覚えておきましょう。もし、クラスを使用する方法を忘れてしまったら、この記事を思い出してくださいね。