PHPのstaticプロパティとstaticメソッド、定数:Web業界で働くためのPHP入門(15)(2/3 ページ)
オープンソースのWeb開発向けスクリプト言語「PHP」の文法を一から学ぶための入門連載。今回はクラスの機能として、staticと定数を扱います。
定数
さて、もう1つのstaticメンバであるstaticメソッドの説明に入る前に、少し脇道に逸れます。staticプロパティは全インスタンス共通で使われる値でした。同じように、全インスタンスで1つしかない値として、定数があります。それを扱っておきましょう。
定数はconstで定義
早速サンプルで見ていきましょう。まず、以下のCircleクラスを作成してください。
<?php class Circle { //πを表す定数。 const PI = 3.14; //(1) //半径を表すプロパティ。 private $radius = 0; //コンストラクタ。半径を引数でもらう。 public function __construct(int $radius) { $this->radius = $radius; } //円周を得るメソッド。 public function getCircuit() { return 2 * self::PI * $this->radius; //(2) } //円の面積を得るメソッド。 public function getArea() { return self::PI * $this->radius * $this->radius; //(3) } }
クラスの内容としては、「プロパティに格納された半径の値を基に円周と円の面積を計算する」というものです。プロパティに格納する半径の値は、コンストラクタで受け取ります。また、円周と円の面積それぞれを計算して返すメソッドとして、getCircuit()、getArea()を用意しています。
ところで、円周や円の面積の計算では、円周率が登場します。例えば、円周は「2×半径×円周率」です。この円周率をソースコード上では数値として記入して、下記のように記述しても確かに計算できます。円の面積も同じです。
2 * $this->radius * 3.14
ところが、このように記述した状態で、例えば、円周率を「3.14」ではなく、「3.1416」で計算するように仕様が変更されたとしましょう。そうなると、場合によってはソースコードの至るところを変更しなければならなくなります。当然変更漏れによるバグも出てきます。こういった状態を避けるには円周率をどこか1箇所に定義しておいて、それを利用します。その定義としてプロパティも考えられますが、プロパティは変数なので、値が変えられてしまいます。そこで値の書き換えができない定数を使います。
リスト3で、円周率を表す定数を定義している部分は(1)です。見慣れない記述ですが、定数は以下のように記述します。
構文 定数の定義
const 定数名 = 値;
定数名の付け方にも注意しておいてください。全て大文字のスネーク記法で、$は付けません。
リスト3の(1)では、定数名「PI」として円周率定数を定義しています。
クラス内で定数を利用する
リスト3の(1)で定義した円周率定数を利用している部分が(2)と(3)です。クラス内で定数を利用するには以下の書式です。
構文 クラス内の定数へのアクセス
self::定数名
もう、お分かりですね。staticプロパティと同じ書式なのです。ただし、staticプロパティとは違い、定数は値の書き換えが行えません。従って、例えば、下記のような定数への代入式を記述すると、エラーとなります。
self::PI = 3.1416;
もっとも、プロパティは小文字から始まるキャメル記法で、定数は大文字のみのスネーク記法ですので、このルールを守っていれば、このように間違ったコードを記述することはないでしょう。
クラス外から定数を利用する
次に、この定数が定義されたCircleクラスを利用する実行部分を作成しながら、クラス外から定数を利用する方法をみていきます。以下のuseCircle.phpを作成し、実行してください。
<?php require_once("Circle.php"); //Circleインスタンスを生成。半径として11を渡す。 $circle = new Circle(11); //Circleインスタンスのメソッドを使って円周と円の面積を取得。 $circuit = $circle->getCircuit(); $area = $circle->getArea(); //取得した円周と円の面積を表示。 print("半径11の円周は".$circuit."で円の面積は".$area."です<br>"); //Circleクラスの定数を表示。 print("円周率は".Circle::PI."で計算しています"); //(1)
実行結果は以下の通りです。
半径11の円周は69.08で円の面積は379.94です 円周率は3.14で計算しています
Circleクラスに定義した定数PIを利用している部分は、リスト4の(1)です。こちらもstaticプロパティと同じく以下の書式となります。
構文 クラス外から定数へのアクセス
クラス名::定数名
定数をまとめたクラス
定数を利用する際、リスト3のCircleのように、クラス内で利用するパターンもあります。一方、クラス外から利用する場合、よくあるパターンでは、そのシステムの動作に必要な定数情報を1つのクラスにまとめておく方法です。例えば、データベースに接続するための設定情報やサーバ内のパス情報などを、以下のように1つのクラスファイルの定数としてまとめて記述しておきます。
class Conf { const DB_URI = "…"; const SERVER_PATH = "…"; : }
そして、システム全体からその定数を利用するものです。その際、例えば以下のように使います。
Conf::DB_URI
これのメリットは、例えば、テスト環境と本番環境でDB_URIが違うなど、システムの設定情報を変更したい場合は、このConfクラスの定数を変更するだけでシステム全体に反映されることです。
Copyright © ITmedia, Inc. All Rights Reserved.
関連記事
- WordPress活用に欠かせない、PHPをWindowsにダウンロードしてインストール、アンインストールする
本連載では、さまざまなソフトウェアのインストール、実行するためのセットアップ設定、実行確認、アンインストールの手順を解説する。今回は、PHPとは何か、PHPで動くツールの紹介、PHPのインストールとアンインストールについて解説。PHPプログラミングを始める参考にしてほしい。 - PHPにおけるクラスの書き方と呼び出し方――インスタンス、メソッド、プロパティ
「PHPで、どのようにオブジェクト指向プログラミングをしていくか」を解説する連載。初回は、「クラス」の書き方と簡単な使い方、メソッド/クラス定義内関数、プロパティ/クラス定義内変数、マルチプルインスタンスについて紹介します。 - PHP(スクリプト言語)
PHPは、HTMLへの埋め込みが可能なスクリプト言語(およびその処理系)。主としてWebアプリ開発に使用される。