さて、もう1つのstaticメンバであるstaticメソッドの説明に入る前に、少し脇道に逸れます。staticプロパティは全インスタンス共通で使われる値でした。同じように、全インスタンスで1つしかない値として、定数があります。それを扱っておきましょう。
早速サンプルで見ていきましょう。まず、以下の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.