Friction River Software

  • お問い合わせ

CakePHP5入門【コラム③】定数と命名規則

C菜

源泉徴収税率が10.21%なので、給与額に0.1021を掛けて源泉徴収税額を計算するです~

このときプログラムでは変数$tax_rateに0.1021を代入して使ってるんですけど、関数呼出しの際、いちいち引数として渡すのは面倒です~

B美

ふむ、直接0.1021という数値を掛けていない点については誉めてあげましょう

そういうわけの分からない数字のことを「マジックナンバー」って言うの
(魔法の数字…つまり、「意味の分からない数字」という意味)

もしも「マジックナンバー」がプログラム中に散りばめられていると、将来その数字(この場合、税率)が変更されたときに大変なことになるからね
(全て変更していく労力が…(笑))

A子

変数名が「$tax_rate」なら、その値が「税率」なんだなってすぐに分かるもんね

変更しなきゃいけなくなったとき、変えるのはその一ヶ所だけだし…

B美

そうね
ただ、そういう場合は「変数」に格納するのではなく、「定数」化したほうが良いわ

「変数」ってのは、プログラムを実行中にその値が変化する(かもしれない)ものだからね

C菜

「定数」ということは、0.1021をそのまま記述するってことですか~?

B美

違う違う!
その値(0.1021)に対して、別の名前を付ける感じね

<?php

define("TAX_RATE", 0.1021);
echo TAX_RATE;

?>

を実行確認してみれば分かるわよ

C菜

あ、0.1021って表示されました~

もしかして、プログラム内で「TAX_RATE」と記述されたところは「0.1021」に置き換えられるってことでしょうかぁ~?

B美

その通り!

ちなみに、関数の外側だろうが、関数の内側だろうが普通に使えるからね
引数として渡す必要は無いってこと)

A子

定数の名前って、全部大文字にしないといけないの?

B美

良い質問ね

別に規則として決まっているわけじゃないけど、慣習的にそうする人が多いって感じかな
(定数名であることが分かりやすいようにね)

A子

アンダーバーで二つの英単語をつなぐのも慣習ってわけ?

C菜

「アンダーバー」じゃなくて「アンダースコア」ですよ~

略して「アンスコ」です~

B美

いや、略さないから(苦笑)

テニスウェアの「アンダースコート」を思い浮かべちゃうし…

A子

ん?「アンスコ」って、ソフトの「アンインストール」の意味で使ったりもするよ

B美

まぁ、それはどうでも良いとして…(苦笑)

あ、でも「アンダーバー」や「アンダーライン」って言い方も、別に間違いってわけじゃないわよ
(正式名称は「アンダースコア」だけどね)

んで、そもそもの質問に対する回答だけど…
複数の英単語を「アンダースコア」で接続するってのは、よくやるのよね
(「file_get_contentsファイルゲットコンテンツ」関数でも使ってたでしょ?)

A子

$tax-rateやTAX-RATEのようにハイフンを使っちゃダメなの?

B美

ダメ!
だってハイフンって、引き算で使う演算子だもの

ちなみに、複数の単語を「アンダースコア」でつなぐ記法を「スネークケース」と呼んでるわ
(見た目が蛇みたいでしょ?)

C菜

わざわざ名前が付いているってことは、ほかの記法もあるんですか~?

B美

ええ、もちろん

「スネークケース」以外には「キャメルケース」と「パスカルケース」があるわね

A子

「キャメル」って「らくだ」のことよね?

ん?「パスカル」ってフランスの哲学者?

B美

この場合は「Pascal」という名前のプログラム言語のことね

まぁ、その「Pascal」って名称は、哲学者「ブレーズ・パスカル」を語源とするんだけど…

C菜

それで、その三つの違いは、どういうものなんでしょうか~?

B美

具体例として、変数「$tax_rate」で説明するわね

Snakeスネーク Caseケース → $tax_rate
Camelキャメル Caseケース → $taxRate
Pascalパスカル Caseケース → $TaxRate

ってこと…

どう?
もう分かったんじゃない?

A子

・単語の区切り文字として「アンダースコア」を使うのが「スネークケース」
二つ目以降の単語の頭文字を大文字にするのが「キャメルケース」
全ての単語の頭文字を大文字にするのが「パスカルケース」

…ってことじゃないかしら?

C菜

あ~
「キャメルケース」のRの部分が、らくだのこぶみたいです~

B美

二人とも正解よ

ちなみに「Pascal」というプログラム言語では、変数名や関数名を「パスカルケース」のように記述するって慣習があったのよ
(そこからの名付けってわけ)

A子

あれ?ちょっと待って…

だったら、defineする定数名って「スネークケース」でしか書けないよね?

B美

その通りよ

まぁ、「全て大文字で記述する」というのは文法規則ってわけじゃないから(ただの「慣習」だから)、「パスカルケース」で定数名を付けても良いんだけどね

C菜

defineの使い方って、なんだか関数みたいです~

最初の引数が「定数名」で、次の引数が「」ということじゃないでしょうか~?

B美

お、そこに気付くとは、なかなかやるわね
そう、実はdefineって関数なのよね

あ、あとね
defineで別名を付けられるのは、単なる値(数値や文字列)だけじゃなくて、配列連想配列もだからね

<?php

define("ARRAY_SAMPLE", [1, 2, 3, 4, 5]);
define("HASH_SAMPLE", ['first' => 'A子', 'second' => 'B美', 'third' => 'C菜']);

echo ARRAY_SAMPLE[2]."<br />".HASH_SAMPLE['third'];

?>

C菜

「3」と「C菜」が表示されました~

使い方は普通の配列や連想配列と同じなんですねぇ~

B美

配列の定数化って、47の都道府県名を配列に格納しておきたいときなんかによく使うわね

だって、都道府県名って変更されることがほぼ無いからねぇ(絶対無いとは言えないけど)

A子

なるほどねー

色々と応用が効きそうな感じ…(面白いじゃん)