Search

検索したいワードを入力してください

2019年03月21日

PHPにおけるクラスとよく使うメソッドを解説【初心者向け】

この記事では、PHPでのクラスについての解説と、クラスで利用されるメソッドや概念の紹介と解説を行っています。だいぶ応用的な内容なので、理解するためにはクラスの基本的な知識が必要です。ぜひ理解して、PHPエンジニアとしてレベルアップを図りましょう。

PHPのクラスとは

PHPにおけるクラスとよく使うメソッドを解説【初心者向け】

PHPにおけるクラスとは、ある概念のデータと処理をまとめたモジュールのことを言います。クラスには、プロパティ(変数、定数)とメソッド(関数)の定義を行います。
あらゆるプログラミング言語でクラスは利用されます。

クラスは、PHPプログラミングでは以下のように記述されます。

class クラス名{
public $プロパティ名;

public function メソッド名(){
//処理
}
}

また、クラスをPHPプログラム中で実際に利用するにはインスタンスを生成する必要があります。インスタンスとは、クラスをもとに生成した実体データです。インスタンスは以下のようにして生成します。

$インスタンス名 = new クラス名();

クラスで定義したプロパティやメソッドにはインスタンスから以下のようにアクセスします。

$インスタンス名->プロパティ名; //プロパティアクセス
$インスタンス名->メソッド名(); //メソッドアクセス

PHPにおけるクラスの使い方と関連メソッド

ここからは、実際のPHPプログラムのクラスの使い方について解説していきます。以下のサンプルをもとに解説していきます。

class Cat{
public $name;

public function eat($item){
echo $item . 'を食べました';
}

public function meow(){
echo 'ニャー';
}
}

上記のサンプルクラスは、とても簡単な形をしたクラスになります。なお、クラス名は大文字で始めることが多いので覚えておきましょう。

また、各プロパティやメソッドの先頭に記述されているpublicというのはアクセス修飾子というもので、どの範囲からこのプロパティやメソッドにアクセスできるかを指定したものです。詳しくはまた別の記事で解説します。

まずこのCatクラスを利用するため、インスタンスを生成します。
$cat1 = new Cat();

これで、猫1匹に関するインスタンスが生成されました。

次に、このインスタンスに対して名前を設定します。クラスに設定した$nameプロパティに名前を代入します。

$cat1->name = 'tama';

これで、猫の名前tamaを設定しました。
では、このcat1インスタンスの名前を取得してみます。
echo $cat1->name; //tama

このように、代入されたプロパティは保存されます。

次にメソッドを利用してみましょう。クラスに定義したメソッドを利用するには以下のように指定します。
$cat1->eat('キャットフード'); //キャットフードを食べました

これでCatクラスで定義したeatメソッドを呼び出すことができました。

1:クラスの継承(extends)

クラスの継承とは、クラス定義の共通部分を別クラスにまとめ、それを利用する仕組みのことです。

例えば、先程のCatクラスの他に、DogクラスやRabbitクラスを作成する必要があり、さらにその中のプロパティやメソッドで共通のものがあった場合、それを全てのクラスで定義するのは非常に非効率的です。

そういった時に継承をうまく利用すると、プログラムをスリムに作成することができます。

extendsの使い方

PHPプログラムで継承を実現するにはextendsを利用します。

class 継承先クラス名 extends 継承元クラス名{
//共通処理
}

と記述します。ここでは、例としてCatクラスとDogクラスを作成し、その共通部分をAnimalクラスにまとめます。

class Animal{
public $name;

public function eat($item){
echo $item . 'を食べました';
}
}


class Cat extends Animal{
public function meow(){
echo 'ニャー';
}
}


class Dog extends Animal{
public function bark(){
echo 'ワン';
}
}

ここでCatクラスとDogクラスのインスタンスを生成し、nameの保存とeatメソッドの呼び出しをしてみましょう。
$cat = new Cat();
$cat->name = 'tama';
$dog = new Dog();
$dog->name = 'taro';
echo $cat->name; //tama
echo $dog->name; //taro
$cat->eat('またたび'); //またたびを食べました
$dog->dog('ドッグフード'); //ドッグフードを食べました

Animalクラスに定義したプロパティやメソッドが継承先のクラスであるCatクラスやDogクラスのインスタンスから呼び出すことができました。このように、継承を利用すると共通処理をまとめることができます。

2:クラスを抽象化する(abstract)

次にPHPの抽象クラスについて解説します。抽象クラスは、継承される前提で作成されるクラスで、継承先のクラス定義に対して規定を与える役割があります。抽象クラスの特徴は以下のようなものがあります。
・抽象クラスを継承したサブクラスは、抽象クラスにある抽象メソッドを上書き(オーバーライド)しなければならない
・直接インスタンス化できない
・PHPでは多重継承が認められていない
他にもありますが、まずここをおさえましょう。

abstractの使い方

PHPで抽象クラスを定義する際には、abstractを利用します。
abstract class 抽象クラス名{
abstract protected function 抽象クラス名();
}


のような形で定義します。抽象クラスには抽象メソッドを定義できます。抽象メソッドとは処理が書かれていない、名前の定義のみの関数です。{ }は省いて定義します。

では、具体的な使い方を以下に示します。

abstract class AnimalAbstract{
abstract protected function eat();
protected function walk(){
console.log('散歩にいきました');
}
}


class Dog extends AnimalAbstract{
public $name;

public function eat($item){
echo $item . 'を食べたワン';
}
}

class Cat extends AnimalAbstract{
public $name;

public function eat($item){
echo $item . 'を食べたニャー';
}
}

まず、抽象クラスであるAnimalAbstractを定義します。そして、そこに抽象メソッドとしてeatメソッドを定義しています。このように定義することで、この抽象クラスを継承したクラスは必ずeatメソッドを実装しなければなりません。実装していない場合はエラーとなります。

前項のextendsの際のeatメソッドと異なる部分は、eatメソッドの処理がクラスごとで異なる点です。「eatメソッドは実装してほしいけど、処理はクラスごとに定義してほしい」といった場合に抽象クラスを定義しておきます。

また、抽象クラス内に通常のメソッドも記述できます。抽象メソッドでない場合は、継承先のクラスで定義する必要はありません。通常の継承の時と同じ扱いをすることが可能です。

3:クラスのコンストラクタ(__construct)

次にPHPのコンストラクタについて解説します。コンストラクタとは、クラスがインスタンス生成された時に起動する関数のことです。

つまり、new クラス名と指定された際に実行する処理を定義する関数になります。インスタンスが生成された時点で取得したいデータなどを取得する際によく利用されます。

__constructの使い方

PHPでコンストラクタを定義する際は、__constructと記述します。

class クラス名{
public function __construct(){
//処理
}
}


と定義します。コンストラクタはインスタンスが生成された時点、つまり$インスタンス名 = new クラス名();の部分で実行されます。

もちろん引数を取ることもでき、引数を取る際は以下のようになります。
class クラス名{
public function __construct(引数){
//処理
}
}

その際のインスタンス生成は、$インスタンス名 = new クラス名(引数に渡す値);と指定します。

具体的な使い方を以下に示します。

class Cat{
public $name;

public function __construct($name){
$this->$name = $name;
}
}


$cat = new Cat('tama');
echo $cat->name; //tama

今回は、nameプロパティへの代入をコンストラクタを利用して行いました。コンストラクタを定義しておくと、必ずその処理は行われるため、思わぬエラーやバグを防ぐことにつながります。今回であれば、nameのデータを必ず設定させるような処理になるため、nameの取得漏れがなくなります。

4:クラスで静的メンバを使用する(static)

クラスは基本的にインスタンスの形で利用されます。同じクラスから生成されたインスタンスでも、その内部データに関係性はありません。インスタンス毎にプロパティ(メンバ)が割り当てられるからです。

しかし、状況によっては、あるクラスから生成された全インスタンスが変数を共有したい場合があります。例えば、生成されたインスタンスの総数などといった情報です。そういった場合に利用するのが静的メンバです。

staticの使い方

静的メンバを設定するにはstaticを利用します。

class クラス名{
public static $メンバ変数名 = 初期値;
}
と指定します。
また、この静的メンバ変数をクラス内で呼び出す場合は以下のように記述します。

class クラス名{
public static $メンバ変数名 = 初期値;

public function __construct(){
self::$メンバ変数名++;
};
}


通常のプロパティをクラス内で呼び出す際は$this->と記述してましたが、静的メンバではself::と記述します。

また、外部から静的メンバを呼び出す際はクラス名::$メンバ変数名と指定します。

以下にサンプルコードを示します。

class Cat{
public static sum = 0;

public function __construct(){
self::sum++;
}
}


$cat1 = new Cat();
echo Cat::sum; //1
$cat2 = new Cat();
echo Cat::sum; //2

cat1が生成された時点で、Catクラスのsumには1が代入されます。そしてcat2が生成されると、sumは静的メンバなので、そのまま加算が行われsumには2が代入されます。静的メンバはインスタンスごとに生成されるのではなく、クラス自体に情報をもっているような形になります。

なお、インスタンスから静的メンバにアクセスしようとするとエラーとなってしまうので注意して下さい。

5:クラス内で定数を使用する(const)

次に、クラス内の定数について解説します。PHPプログラミングをしていると、クラスを作成する際に、どこからも変更されないようなデータを定義しておきたい場合がでてきます。そのような場合に利用するのが定数です。

定数として定義しておくことで、データを呼び出しやすくなり、また変更されないことが保証されているので安心してプログラムを組むことが可能になります。

constの使い方

クラス内で定数を設定する際には、constを利用します。具体的には以下のように設定されます。

class クラス名{
const 定数名 = 定数値;
}


なお、constにはアクセス修飾子が付きません。(php7.1.0以降は付けられる)なので、基本的にはどこからでも呼び出すことが可能です。定数を呼び出す際は以下のように指定します。

クラス名::定数名

以下にサンプルコードを示します。

class Cat{
const CRY_SOUND = 'ニャー';
}


echo Cat::CRY_SOUND; //ニャー

PHPでは定数は慣例的に全部大文字で記述します。定数になにか値を代入しようとするとエラーとなってしまうので注意して下さい。

6:例外を指定する(exception)

次に例外について解説します。PHPプログラムにおける例外とは、なんらかの原因で正規の処理フローから外れてしまい、そのまま処理を続行することが厳しい状況のことを言います。そういった状況になってしまった際は、プログラムを問題なく終了させるため例外処理を行う必要があります。

exceptionの使い方

PHPで例外処理を行う上で重要なのが、exceptionとtry catchです。try catchとは、例外を捕捉するための仕組みで、tryのコードブロック内で発行されたexceptionはcatchブロックで捕捉されます。

具体的には以下のように記述されます。
try{
//処理
throw new Exception();
}catch(Exception $e){
//exceptionが発行された際の処理
}

なお、Exceptionのコンストラクタは引数をとることができ、例外が生じたさいに発行するメッセージを設定できます。そのメッセージはgetMessage()メソッドで受け取ることができます。

try{
//処理
  throw new Exception(メッセージ);
}catch(Exception $e){
//例外処理
//$e->getMessage();でExceptionに設定したメッセージを取得できる
}

以下にサンプルコードを示します。

function division ($a, $b){
if($b === 0){
throw new Exception('ゼロ除算');
}
return $a / $b;
}
try{
division(10, 0);
}catch(Exception $e){
echo $e->getMessage(); //ゼロ除算
}

7:クラスのプロパティを取得する(get_class_vars)

次に、クラスのプロパティ情報を取得する方法について解説します。クラスのデフォルトで定義されたプロパティと値のリストを取得するにはPHPのget_class_vars関数を利用します。get_class_vars(クラス名)と指定します。戻り値は、[プロパティ名]=>値の連想配列となります。

コンストラクタ生成後に設定された値や作成されたプロパティは、get_class_varsでは取得できません。また、get_class_vars関数が実行された箇所のスコープで取得できるプロパティを取得することができます。

get_class_varsの使い方

get_class_varsの使い方を解説します。以下にサンプルコードを示します。

サンプルコード
class Sample{
public $var1 = 'aaaaa';
private $var2 = 'bbbb';

public function __construct(){
$this->var1 = 'cccc';
}
public static function echoVars(){
print_r(get_class_vars(__CLASS__));
}
}



Sample::echoVars();
print_r(get_class_vars('Sample'));
$sample = new Sample();
print_r(get_class_vars(get_class($sample)));

結果
(
[var1] => aaaaa
[var2] => bbbb
)
Array
(
[var1] => aaaaa
)
Array
(
[var1] => aaaaa
)

クラス内部でget_class_vars関数を起動した場合、アクセス修飾子がpublicのものとprivateのものの両方が取得できていることがわかります。また、クラス外部からget_class_vars関数を起動した場合、publicなプロパティのみ取得できていることがわかります。

さらに、インスタンス化してコンストラクタにてプロパティ値を変更したものに対してget_class_vars関数を適用させても、クラス定義した際の値が取得できていることがわかります。

8:クラスが定義済みか確認する(class_exists)

クラスが定義済みかどうかを調べるPHP関数としてclass_exists関数があります。この関数は、動的にクラスを呼び出す際に利用されることが多いです。

例えば、オートローダーを実装する際にはこの関数を利用して実際に存在するクラスなのかどうかを判定してからロード処理を走らせます。

class_existsの使い方

class_existsはclass_exists(クラス名)で指定します。そして、クラスが存在すればtrue、存在しなければfalseを返します。

以下にサンプルコードを示します。
class Sample{

}
echo class_exists('Sample'); //true

まとめ

今回はPHPのクラスについての解説と、クラスを利用するにあたってよく利用するメソッドや概念の紹介をしました。今回紹介した内容は常に利用するものではありません。

実装するシステムの全体を考えて利用するべきかを検討するようなレベルのものばかりです。かなり応用的な内容なので、理解するのも大変かと思いますが、これらの概念を踏まえて設計や実装ができるようになるとPHPエンジニアとしては十分な知識をもっていると言えます。

ぜひこの内容を理解して、PHPエンジニアとしてレベルアップを図ってください。

【PR】多くの人がプログラミングを諦めてしまう理由をご存知ですか?



近年プログラミングを勉強する人が増えています。

プログラミング学習者の多くは独学から取り組もうとしますが、だいたい80%ほどは3ヶ月も続かずに諦めてしまいます。早い人は1日目で。

多くの人がプログラミングを独学しようとして諦める理由は、次の3つ。
●モチベーションが維持できない
●エラーの原因・解決方法が分からない
●どう学習すればよいか分からない

TechBoostというプログラミングスクールでは、みんなと一緒にプログラミングをするのでモチベーションの維持ができ、分からないことがあればマンツーマンで教えてくれ、徹底的に研究された初心者向けの教材が揃っています。

TechBoostを卒業後、実際にエンジニアとして転職した方もいるほど。

本気でプログラミングを学びたい方は、一度無料のカウンセリングでご相談ください。プログラミングを嫌いになる前に。

tech boostについて

オーダーメイド型の学習コンテンツを提供する「tech boost」 は、エンジニアのキャリア支援に特化したサービスを複数展開している株式会社Branding Engineerが運営しているプログラミングスクールです。最短3ヶ月間で、未経験から『プログラミングの基礎』、『実際に業務で必要となるスキル』、『今のトレンドとなっている知識』まで学べ、ご希望の方にはプロのキャリアアドバイザーによる就業支援を行うことができます。

tech boost卒業生インタビュー

tech boostの卒業生の声を聞きました。あなたがプログラミングを学びたい理由を、一度考えてみてください。
営業→Javaエンジニア→Rubyエンジニアと転向し、第一志望のFinTech企業で働く山下さん
元営業、ビジネスのわかるエンジニアを目指す菅原さん
サンフランシスコに交換留学し、シリコンバレーのVCでインターン中の梅本さん
予備校の営業から半年でエンジニア転職を果たした小田島さん

tech boostの口コミ



Related