前回オブジェクト指向やクラスとは何かについて書きました。
ちょっとおさらいです。クラスはオブジェクトの設計書で処理やデータを記述し、オブジェクト(インスタンス)はクラスを元に生成した実体化したものです。
今回は具体的にPHPでクラスを定義する方法とその使い方についてご説明します。
基本的なクラスの書き方
これから実際にクラスを書いてみます。
このクラスは水を貯めるだけのポットクラスです。
データとして水の量を持ち、水を追加する処理と現在の水の量を返す処理を持っています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
class Pot { private $water = 0; function __construct($water) { $this->water = $water; } public function addWater($water) { $this->water += $water; } public function getWater() { return $this->water; } } |
クラスを書くときは class クラス名 { // 中身 } のように定義します。
// 中身 の部分にデータや処理などを書きます。
インスタンス変数
1 |
private $water = 0; |
メソッド内に書く変数のことをローカル変数と言います。
インスタンス変数は、クラスをインスタンス化したときに直接アクセスすることが出来ます。
ただし、今回のコードはアクセス修飾子が private となっているためクラス外からアクセスすることは出来ません。
このアクセス修飾子は省略することも出来ます。省略した場合は public 扱いになり、外部からアクセス出来るようになります。
クラス内でインスタンス変数にアクセスする場合には、$this->water のように買います。
$this はそのクラス自身のことです。
メソッド
メソッドは処理を記述する部分です。
受け取った値を処理したり、指定された値を返したり、DBにアクセスしてデータを取得したりします。
1 2 3 |
public function addWater($water) { $this->water += $water; } |
上のメソッドは水を追加する処理を行います。
引数で渡された水の量をインスタンス変数である $this->water に追加するという処理です。
1 2 3 |
public function getWater() { return $this->water; } |
これは現在の水の量を返す処理です。
水の量を保持するインスタンス変数 $this->water の値を返します。
上の二つのメソッドはどちらもアクセス修飾子が public になっています。
外部からアクセス出来るということです。
コンストラクタ
コンストラクタは、クラスをインスタンス化したときにまっさきに呼ばれるメソッドです。
そのインスタンスの初期化を行うために使います。
コンストラクタは省略でき、書かなかった場合は下のように引数なしで処理もなしの状態になります。
1 |
function __construct() {} |
つまり書かなくても暗に存在するということになります。
今回は最初に水の量を渡してポットオブジェクトを生成した際に同時に水がある状態にしました。
1 2 3 |
function __construct($water) { $this->water = $water; } |
後ほど詳しく説明しますが、コンストラクタは new 演算子を使ってインスタンス化をしたときに書く下の赤字の部分です。
ここでちょっと注意点です。
今回は引数有りのコンストラクタを自前で定義しています。
その場合は引数無しでインスタンス化は出来なくなります。
自前で何かしらコンストラクタを定義した場合は、コンストラクタを書かなかった場合のデフォルトのコンストラクタが使えなくなるのです。
そこだけ注意しておきましょう。
アクセス修飾子
アクセス修飾子は public, private protected の3つがあります。
public はどこからでもアクセスが出来ます。何も書かないとこれになります。
private はクラス内でのみアクセスが可能です。
protected は、クラス内と継承された子クラスからのアクセスが可能です。
※継承については別記事で解説します。
クラスをインスタンス化する方法
作成したクラスはインスタンス化をして扱います。
ちょっと雑ですが、上で作成したポットクラスをインスタンス化して水の量を画面に出力するサンプルです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
<html> <head> <meta charset="UTF-8"> <title>PHPテスト</title> <meta name="description" content="このページの概要を書く"> <link rel="stylesheet" href="css/style.css"> </head> <body> <?php class Pot { private $water = 0; function __construct($water) { $this->water = $water; } public function addWater($water) { $this->water += $water; } public function getWater() { return $this->water; } } $pot = new Pot(20); $pot->addWater(100); echo "現在の水の量は、".$pot->getWater()."です。"; ?> </body> </html> |
11-24行目はポットクラスを定義しています。
26行目 $pot = new Pot(20); でポットクラスをインスタンス化し、初期値としてコンストラクタに20を渡しています。
27行目は、更に水の量を100足しています。
29行目で水の量は何になったかを出力します。
クラスを定義してインスタンス化し、そのインスタンスのメソッドを実行して水を足したり水の量を取得したりしています。
だいたいイメージはこんな感じですが、通常の開発の現場では基本的にクラスは別ファイルに定義します。
1クラス1PHP ファイルになる場合がほとんどだと思います。
別ファイルにクラスを定義した場合の読み込み方について次で説明します。
クラスを別のファイルに定義する
こちらの記事でも説明しましたが、オブジェクト指向のメリットは各パーツごとに製作者を分けることで開発者同士の競合を無くしたりできることです。
「クラスをインスタンス化する方法」で説明したような書き方をしてしまうと、ポットクラスとそれを表示するビューが同じファイルに定義されてしまいます。
なので通常は1クラス1ファイルでファイルを分けて管理します。
その場合、どのクラス(ファイル)を使うかを定義して使うことが出来ます。
サンプルコード
sample.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<html> <head> <meta charset="UTF-8"> <title>PHPテスト</title> <meta name="description" content="このページの概要を書く"> <link rel="stylesheet" href="css/style.css"> </head> <body> <?php require_once("Pot.php"); $pot = new Pot(20); $pot->addWater(100); echo "現在の水の量は、".$pot->getWater()."です。"; ?> </body> </html> |
Pot.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<?php class Pot { private $water = 0; function __construct($water) { $this->water = $water; } public function addWater($water) { $this->water += $water; } public function getWater() { return $this->water; } } |
クラスを定義する場合は閉じタグなし?
そのファイル内にPHPコードしか無い場合は閉じタグを書く必要がありません。
というか書かないのがルールです。
PHPのコードを書くためのPHPタグ以外の部分は全てHTMLコードと認識されます。
不用意に閉じタグを書いてその後に改行が含まれている場合、画面に出力したHTMLのほうで改行が増えちゃいます。
改行が増えたからなんだって話ですが、PHPしか書かないファイルは閉じタグを省略できるのはPHPの仕様なのでそれに甘えて不要なバグはなくしましょう。
そういう小さい部分の積み重ねがバグの軽減になり、スキルと言われるものになると思います。
外部のPHPファイルを読み込む
1 |
require_once("Pot.php"); |
引数には、ファイルのパスを入力します。
今回は読み込み元と先が同じディレクトリ内だったのでファイル名だけ書きました。
相対パスで指定したということです。
絶対パスで書く場合はURLではなくディレクトリ構成を書いてください。
ファイルの読み込み方は他にもありますが、それはまた別記事にまとめます。
まとめ
クラスを書くときは、class クラス名 {} と書く。
クラス内にはインスタンス変数、コンストラクタ、メソッドがある。
コンストラクタは省略してもよい。
クラスを定義する場合は別ファイルに書き、利用するPHPファイル内でクラスファイルを読み込む。
コメントを残す