定数
変数とはデータの入れ物なので、当然、スクリプトの実行途中でその中身を入れ替える事ができる。
一方、入れ物と中身がワンセットになっており、途中で中身を変更できない入れ物のことを定数と言う。
定数の基本
まずは定数を使わない例。
$price = 1000;
$sum = $price * 1.1;
値の意味が曖昧
今回の例は比較的類推しやすいかもしれないが、コードが複雑になってくると1.1が値上げ率を表すのか、サービス料金を表すのか、それとも全く異なる何かなのか汲み取りにくくなる。
一般的にコードに埋め込まれた名前のない値は自分以外の人間にとっては意味を持たない謎の値だと考えるべき。
そのような値のことをマジックナンバーという。
値の修正に弱い
コードのそちこちに1.1を使用していた場合、将来的に消費税が12%.15%と変化したらそれらの値を漏れなく検索/修正すると言う作業が必要となる。
それは面倒なだけでなく修正漏れなどバグの原因となる。
そこで1.1という値を次のように定数化する
<?php
const TAX = 1.1;
$price = 1000;
$sum = $price * TAX;
print $sum;
//結果: 1100
constは定数を宣言する為の命令で、ここではTAXに1.1という値を設定している。
これを使えば後から消費税が変更になった場合にも、const TAX = 1.1の、1.1の部分だけを修正すれば良いので、修正漏れの心配がない。
定数のルール
定数の構文は変数と似ているが、いくつか異なる点もある。
名前の先頭に「$」は付けない
変数とは異なり1文字目の「$」は不要。
名前は、PHPで意味を持つ予約語でないこと
予約語は、定数だけでなく関数、クラス/インターフェイスなどの名前としても利用できない。
変数は頭に「$」が付くので例外的に「$if」のような名前も可能だが、混乱を招くのであえて使う意味はない。
全て大文字で命名する
構文規則ではないが、定数は変数と区別しやすいように全て大文字で命名するのが通例。
複数の単語を含むような名前をつけたい場合には「CONSUMPTION_TAX」のようにアンダースコアで区切る。
利用できる型は限定される
型とはデータの種類を識別する為の情報。
具体的には以下の型だけを利用できる。
整数(int)、小数(float)、文字列(string)、true/false(bool)、null、以上の値を含んだ配列。
define関数
定数は(const以外にも)defineで定義しても良い。
例えば以下は先ほどのconst命令をdefine関数で書き換えたもの。
define(‘TAX’, 1.1);
関数とはPHPで利用できる命令の一種。
いずれも似たような役割を担うが、微妙にできる事が異なる。
const/defineの相違点
①トップレベル以外での宣言
const ×
define ◯
トップレベル以外とは、if/whileなどの制御命令、functionの配下ではconstを利用できないと言うこと。
②クラス定数の宣言
const ◯
define ×
③変数、関数の戻り値を設定
const ◯
define ×
例えば以下のように、constでは変数の値や演算の結果を定数に割り当てられないということ。
const VALUE = $x;
const MAIN = dirname(__FILE__).’/test.php';
このような定数については、define関数を利用しなければならない。
define(‘VALUE’, $x);
define(‘MAIN’, dirname(__FILE__).’/test.php’);