検索
連載

PHPのstaticプロパティとstaticメソッド、定数Web業界で働くためのPHP入門(15)(2/3 ページ)

オープンソースのWeb開発向けスクリプト言語「PHP」の文法を一から学ぶための入門連載。今回はクラスの機能として、staticと定数を扱います。

Share
Tweet
LINE
Hatena

定数

 さて、もう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)
    }
}
リスト3 phplesson/chap15/Circle.php

 クラスの内容としては、「プロパティに格納された半径の値を基に円周と円の面積を計算する」というものです。プロパティに格納する半径の値は、コンストラクタで受け取ります。また、円周と円の面積それぞれを計算して返すメソッドとして、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)
リスト4 phplesson/chap15/useCircle.php

 実行結果は以下の通りです。

半径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.

ページトップに戻る