【PHP】クラスの書き方と使い方の基本
PHPにおけるクラスの基本概念から、定義、プロパティやメソッドの記述、インスタンスの生成・利用方法を解説します。インスタンス初期化に使うコンストラクタ、クラスの継承、メソッドのオーバーライドといったオブジェクト指向の基礎まで、具体的なコードを交えて学べます。
開発環境
- OS: Windows10
- Editor: Visual Studio Code
- PHP: 8.0以降
PHPのクラスとは
PHPにおけるクラスとは、データと、そのデータに対する操作(メソッド)をひとまとめにした設計図のようなものです。プログラムを効率的に作成し、かつ再利用可能な形で構造化するためにクラスを活用します。
クラスを利用することで、関連するデータと機能を整理し、システムの複雑さを管理しやすくなります。これにより、プログラムの保守性や拡張性が向上します。
クラスとインスタンス
- クラス: 設計図やテンプレートに相当します。例えば、家を建てる際の設計図のように、どのようなデータ(部屋の数、広さなど)を持ち、どのような操作(ドアを開ける、電気をつけるなど)ができるかを定義するものです。
- インスタンス: クラスという設計図を基に実際に生成された、具体的なオブジェクトのことです。設計図に基づいて実際に建てられた家そのものに例えられます。同じクラスから複数のインスタンスを生成でき、それぞれが独立したデータを持つことができます。
アクセス修飾子
アクセス修飾子とは、クラス内のプロパティ(データ)やメソッド(操作)に対して、どこからアクセスできるかという権限を制御するためのキーワードです。PHPでは主にpublic、protected、privateの3種類があります。
- public:
publicが指定されたプロパティやメソッドは、どこからでもアクセス可能です。これは、クラスの外部や、クラスから生成されたインスタンスからも自由に呼び出すことができるという意味です。 - protected:
protectedが指定されたプロパティやメソッドは、そのプロパティやメソッドが定義されたクラス自身、またはそのクラスを継承した(関連性のある)クラスからのみアクセスが可能です。クラスの外部や、直接のインスタンスからはアクセスできません。 - private:
privateが指定されたプロパティやメソッドは、そのプロパティやメソッドが定義されたクラス内からのみアクセス可能です。最もアクセス制限が厳しく、継承されたクラスからもアクセスすることはできません。
サンプルコード
php/chapter14/01.php
まず、PHPにおける「クラス」の基本的な考え方と書き方についてご説明します。 クラスとは、プログラムを構成する基本的な単位の一つで、データ(プロパティ)と、そのデータを操作する処理(メソッド)を一つにまとめたものです。オブジェクトを生成するための定義(設計)であると考えることができます。
クラスを定義する際には、まず class キーワードを使用します。その後にクラス名を記述します。
クラス名の決め方にはルールがあります。
- クラス名は大文字で始めます。
- 複数の単語で構成される場合は、各単語の先頭を大文字にする「キャメルケース」という書き方を使用します。例えば
MyClassのように書きます。
クラスの中には「プロパティ」と「メソッド」を記述します。 プロパティは、クラスが持つデータ(変数)のことです。 メソッドは、クラスが行う処理(関数)のことです。
上記のコードでは、class クラス名 { からクラスの定義が始まり、public $プロパティ名; でクラス内にプロパティを定義しています。public というキーワードは、このプロパティがクラスの外からもアクセスできることを示しています。
01.php1<?php 2// クラスの命名規則 3// クラス名は大文字で始める 4// 2つ以上の単語で構成される場合、キャメルケース(各単語の先頭を大文字にして区別する)を使用する 5// PHPのクラスの書き方 6// クラスの定義 7class クラス名 { 8 // プロパティ(変数) 9 public $プロパティ名; 10
php/chapter14/02.php
このコードでは、public function メソッド名($引数) { ... } でクラス内にメソッドを定義しています。メソッドもプロパティと同様にpublicキーワードを付けて、クラスの外から実行できるようにしています。} でクラスの定義が終了します。
02.php1<?php 2 // メソッド(関数) 3 public function メソッド名($引数) { 4 // 処理の内容 5 } 6} 7
php/chapter14/03.php
クラスはあくまで定義(設計)であり、実際にその機能を使うためには、クラスから「インスタンス」と呼ばれる具体的なオブジェクトを生成する必要があります。インスタンスとは、クラスという定義(設計)に基づいて、実際にメモリ上に作成された具体的なオブジェクト(実体)のことです。
インスタンスの生成は new キーワードを使用して行います。
上記のコードでは、new クラス名() によってクラスの新しいインスタンスが生成され、それが $インスタンス変数名 という変数に代入されています。この変数が、作成されたインスタンスを指し示します。
03.php1<?php 2// インスタンスの生成 3$インスタンス変数名 = new クラス名(); 4
php/chapter14/04.php
インスタンスが生成されたら、そのインスタンスが持つメソッドを実行することができます。
インスタンスのメソッドを実行するには、$インスタンス変数名->メソッド名($引数); のように、-> (アロー演算子) を使ってメソッド名を指定します。
04.php1<?php 2// インスタンスメソッドの実行 3$インスタンス変数名->メソッド名($引数); 4
php/chapter14/05.php
ここでは、具体的なコードを使ってクラスとインスタンスメソッドの動作を見ていきます。
このサンプルコードでは、「Person」というクラスを定義しています。
この Person クラスには、info というメソッドが一つだけあります。
info メソッドは、$name、$age、$gender という3つの引数を受け取り、それらの情報を使って文字列を組み立てて返します。
コードの後半では、まず new Person() で Person クラスのインスタンスを生成し、それを $person という変数に代入しています。
そして、$person->info("山田", 30, "男性") を実行することで、作成したインスタンスの info メソッドを呼び出しています。引数として「山田」、30、「男性」を渡しており、実行結果として「山田 さんは 30 歳の 男性 です。」という文字列が表示されます。
05.php1<?php 2// サンプルコード1: 基本的なインスタンスメソッド 3class Person { 4 public function info($name, $age, $gender) { 5 return "$name さんは $age 歳の $gender です。"; 6 } 7} 8 9$person = new Person(); 10echo $person->info("山田", 30, "男性"); 11
php/chapter14/06.php
次に「コンストラクタ」という特別なメソッドについてご説明します。
コンストラクタとは、インスタンスが生成されるときに自動的に実行されるメソッドのことです。クラス内のプロパティに初期値を設定するなど、インスタンスが利用可能になる前の準備作業によく使われます。
PHPでは、__construct という特殊な名前のメソッドがコンストラクタとして認識されます。
このサンプルコードの Person クラスには、$name、$age、$gender という3つのプロパティがあります。
そして __construct メソッドが定義されています。このメソッドは3つの引数を受け取り、受け取った値を $this->name、$this->age、$this->gender というプロパティにそれぞれ代入しています。
$this は、現在実行中のインスタンス自身を指す特別なキーワードです。これにより、インスタンスが持つプロパティやメソッドにアクセスできます。
Person クラスのインスタンスを生成する際に、$person = new Person("山田", 30, "男性"); のように引数を渡しています。この引数が __construct メソッドに渡され、インスタンスが生成されると同時に、そのインスタンスの $name、$age、$gender プロパティが初期化されます。
info メソッドでは、$this->name、$this->age、$this->gender を直接参照して文字列を組み立てています。これにより、インスタンス生成時に設定されたプロパティの値が利用されます。
実行結果は「山田 さんは 30 歳の 男性 です。」となり、前のサンプルコードと同様の結果が得られますが、プロパティとして情報を保持している点が異なります。
06.php1<?php 2// サンプルコード2: コンストラクタ 3class Person { 4 public $name; 5 public $age; 6 public $gender; 7 8 public function __construct($name, $age, $gender) { 9 $this->name = $name; 10 $this->age = $age; 11 $this->gender = $gender; 12 } 13 14 public function info() { 15 return "$this->name さんは $this->age 歳の $this->gender です。"; 16 } 17} 18 19$person = new Person("山田", 30, "男性"); 20echo $person->info(); 21
php/chapter14/07.php
次に「クラスの継承」についてご説明します。
継承とは、既存のクラス(親クラス、または基底クラス)のプロパティやメソッドを、新しいクラス(子クラス、または派生クラス)が引き継ぐことができる仕組みです。これにより、共通の機能を再利用し、コードの重複を減らすことができます。
継承を行うには、子クラスの定義時に extends キーワードを使用します。
このサンプルコードでは、Person クラスが親クラスとして定義されています。
そして、User クラスが class User extends Person { ... } という形で Person クラスを継承しています。
User クラスの定義の中には、プロパティもメソッドも記述されていませんが、extends Person と記述したことにより、Person クラスが持つすべてのプロパティ($name, $age, $gender)とメソッド(__construct, info)を User クラスも利用できるようになります。
コードの後半では、new User("山田", 30, "男性") で User クラスのインスタンスを生成しています。
この際、User クラスは __construct メソッドを持っていませんが、親クラスである Person クラスの __construct メソッドが呼び出され、インスタンスのプロパティが初期化されます。
そして、echo $user->info(); を実行すると、User クラス自身にはない info メソッドが親クラスから継承されて実行され、「山田 さんは 30 歳の 男性 です。」という結果が表示されます。
07.php1<?php 2//サンプルコード3: クラスの継承 3class Person { 4 public $name; 5 public $age; 6 public $gender; 7 8 public function __construct($name, $age, $gender) { 9 $this->name = $name; 10 $this->age = $age; 11 $this->gender = $gender; 12 } 13 14 public function info() { 15 return "$this->name さんは $this->age 歳の $this->gender です。"; 16 } 17} 18 19class User extends Person { 20 // Personクラスのすべての機能を継承 21} 22 23$user = new User("山田", 30, "男性"); 24echo $user->info(); 25
php/chapter14/08.php
最後に「メソッドのオーバーライド」についてご説明します。
オーバーライドとは、親クラスから継承したメソッドを、子クラスで独自に再定義することです。これにより、親クラスと同じ名前のメソッドを持ちながら、子クラスで異なる処理を実行させることができます。
このサンプルコードも、Person クラスを親クラスとし、User クラスが Person クラスを継承しています。
親クラスの Person には info() メソッドが定義されています。
子クラスの User にも、親クラスと同じ名前の info() メソッドが定義されています。これがメソッドのオーバーライドです。
User クラスの info() メソッドは、親クラスの info() メソッドとは異なり、「ユーザーの」という文字が追加された文字列を返すように記述されています。
コードの後半では、new User("山田", 30, "男性") で User クラスのインスタンスを生成しています。
そして、echo $user->info(); を実行すると、User クラス自身でオーバーライドされた info() メソッドが呼び出されます。
その結果、「ユーザーの 山田 さんは 30 歳の 男性 です。」という文字列が表示されます。
もし User クラスに info() メソッドが定義されていなければ、親クラスの Person の info() メソッドが実行されますが、オーバーライドされたため子クラスの info() メソッドが優先して実行されるのです。
これでPHPのクラスの基本的な概念、インスタンスの生成、コンストラクタ、継承、オーバーライドについて理解を深められたことと思います。これらの概念は、より複雑なプログラムを効率的に作成するために非常に重要です。
08.php1<?php 2// サンプルコード4: メソッドのオーバーライド 3class Person { 4 public $name; 5 public $age; 6 public $gender; 7 8 public function __construct($name, $age, $gender) { 9 $this->name = $name; 10 $this->age = $age; 11 $this->gender = $gender; 12 } 13 14 public function info() { 15 return "$this->name さんは $this->age 歳の $this->gender です。"; 16 } 17} 18 19class User extends Person { 20 public function info() { 21 return "ユーザーの $this->name さんは $this->age 歳の $this->gender です。"; 22 } 23} 24 25$user = new User("山田", 30, "男性"); 26echo $user->info(); 27
おわりに
この記事を通して、PHPのクラスがデータと操作をひとまとめにした設計図であり、そこから具体的なインスタンスを生成して利用する基本的な流れを学ぶことができました。特に、インスタンス生成時に自動実行されるコンストラクタや、既存のクラスの機能を再利用する継承、そして継承したメソッドを子クラスで再定義するオーバーライドといったオブジェクト指向の基礎についても理解を深められました。これらの概念は、効率的で保守しやすいプログラムを作成するために非常に重要です。今回学んだクラスの知識を土台として、今後さらに複雑なシステム開発へと挑戦する一歩を踏み出してください。