PHPの基礎文法をおさらいする(定数・演算子・函数)
定数
スカラー値(integer, float, boolean, string)は定数として定義することができる。定数は任意のスカラー値の別名と考えることができる。あるいは、値を一度代入したらその値が変わることがない変数と見なすことができる。配列も定数にすることができるらしいが、奨励されていない。
定数を定義するにはdefine函数を用いる。ただしdefine函数を使った定数の定義はクラスの中では使えない。クラスの中ではconstキーワードを使って変数のように値を代入して定義する。
define函数はdefine(定数名, 任意のスカラー値);
という書式で使う。指定する定数名やスカラー値が文字列の場合、シングルクォーテーションかダブルクォーテーションで挟む必要がある。改行を表す\n
のようにエスケープしたい文字列がある場合にはダブルクォーテーションで挟む。定数名は変数名と違い、先頭に$を付けてはならず、大文字と小文字を区別しないことに注意。ただし、定数名は全て大文字にするのが分かりやすく、他の言語と同じくそれが慣例になっているようだ。自動的に定義される特殊な定数であるマジック定数は、定義済みの定数の一種で、二つの下線(__)の接頭辞と接尾辞が付く(例:__FILE__)。
次のスクリプトは消費税抜きの価格から消費税込みの価格を計算するもの。define函数を用いて消費税率を定数に置き換えている。
<?php // 消費税率を定数化 define('C_TAX',0.08); echo '税抜価格を入力してください(円):'; // 標準入力を実数型で受け取る $price = (real)(fgets(STDIN,1024)); // $priceが0より大きいなら if ($price > 0) { // 消費税込みの価格を計算して小数点以下を切り捨てる $price_tax = (int)($price * (C_TAX + 1)); // 計算結果を表示 echo "消費税込みの価格は{$price_tax}円です。",PHP_EOL; } // $priceが0より小さいなら else { echo '0より大きい数値を入力してください。',PHP_EOL; }
このようにスクリプトの冒頭で消費税率を定数化しておけば、消費税率が10%に変わってもここだけを書き換えるだけで済む。ちなみに、消費税の計算結果をint型で型キャストをすると、小数点以下が切り捨てられる。ちなみに、改行を意味するPHP_EOL、真を意味するTRUE、偽を意味するFALSE、未定義を意味するNULLも定数。
このスクリプトの実行結果は例えば次のようになるはず。
$ php sample.php 税抜価格を入力してください(円):iearuei 0より大きい数値を入力してください。 $ php sample.php 税抜価格を入力してください(円):384 消費税込みの価格は414円です。
次のスクリプトは連想配列の要素になっている値をforeach構文を用いてHTMLのtable要素に整形して表示するもの。その部分以外のtable要素をdefine函数を用いてstring型の定数として定義し、利用している。
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8" /> <title>英語の人称代名詞単数形</title> <?php // HTMLを定数化 define('TABLE_HEAD','<table> <tbody> <tr>'); define('TABLE_FOOT','</table> </tbody> </tr>'); // 連想配列を用意 $singular_pronouns = [ '第一人称' => 'I', '第二人称' => 'you', '第三人称男性' => 'he', '第三人称女性' => 'she', '第三人称中性' => 'it']; $plural_pronouns = [ '第一人称' => 'we', '第二人称' => 'you', '第三人称' => 'they']; ?> </head> <body> <?php print "<h4>人称代名詞単数形</h4>\n"; print TABLE_HEAD; // foreach構文を用いて連想配列をHTMLの表に整形 foreach($singular_pronouns as $key => $value){ print "<tr></tr><th>{$key}</th><td>{$value}</td></tr>\n"; } print TABLE_FOOT; ?> <br> <?php print "<h4>人称代名詞複数形</h4>\n"; print TABLE_HEAD; // foreach構文を用いて連想配列をHTMLの表に整形 foreach($plural_pronouns as $key => $value){ print "<tr></tr><th>{$key}</th><td>{$value}</td></tr>\n"; } print TABLE_FOOT; ?> </body> </html>
このスクリプトをターミナル・エミュレータ上で実行すると次のようになる。
$ php sample.php <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8" /> <title>英語の人称代名詞単数形</title> </head> <body> <h4>人称代名詞単数形</h4> <table> <tbody> <tr><tr></tr><th>第一人称</th><td>I</td></tr> <tr></tr><th>第二人称</th><td>you</td></tr> <tr></tr><th>第三人称男性</th><td>he</td></tr> <tr></tr><th>第三人称女性</th><td>she</td></tr> <tr></tr><th>第三人称中性</th><td>it</td></tr> </table> </tbody> </tr><br> <h4>人称代名詞複数形</h4> <table> <tbody> <tr><tr></tr><th>第一人称</th><td>we</td></tr> <tr></tr><th>第二人称</th><td>you</td></tr> <tr></tr><th>第三人称</th><td>they</td></tr> </table> </tbody> </tr></body> </html>
演算子
PHPの演算子はPerlやC言語に倣っている。+ - * / % ++ --といった代数演算子、= += -= *= /= &= .=
といった代入演算子、== === != !== < > <= >= ?
といった比較演算子、&& and || or xor !
といった論理演算子、| & ^ - << >>
といったビット演算子、条件分岐の制御構文のように働く条件演算子、結合演算子としてのピリオド、型演算子と呼ばれるinstanceof、null合体演算子と呼ばれる??、エラー制御演算子と呼ばれる@ばかりでなく、クラスをインスタンス化するnewキーワード、オブジェクトのクローンを作るcloneキーワード、(int) (float) (double) (real) (string) (array) (object) (bool)
といった型キャスト、システムコマンドとして認識させるためのバッククォートなど、これらすべてが演算子に含まれる。
演算子には処理される順番に優先順位がある。優先順位が高い演算子から順番に処理される。PHPの公式マニュアルの中にある「演算子の優先順位」でその順位を確認できる。
しかし演算子の優先順位をすべて覚えることは大変。数学的によく知られた優先順位、つまり足し算や引き算よりも掛け算や割り算のほうを先に計算するという規則を除き、丸括弧で表した結合規則によって優先順位をできるかぎり明示することが望ましいとされている。
<?php $expression1 = 3 + 5 * 2 + 7; print <<<EOT 3 + 5 * 2 + 6 = 3 + 10 + 7 = {$expression1} EOT; echo PHP_EOL,PHP_EOL; $expression2 = (3 + 5) * (2 + 6); print <<<EOT (3 + 5) * (2 + 7) = 8 * 9 = {$expression2} EOT; echo PHP_EOL;
<<<EOT...EOT;はヒアドキュメント。実行結果は次のようになるはず。
$ php sample.php 3 + 5 * 2 + 6 = 3 + 10 + 7 = 20 (3 + 5) * (2 + 7) = 8 * 9 = 64
函数
ひとつ以上の値を入力すると決まった内部処理をしてひとつの値を返してくれること、または、ひとつ以上の原因からただひとつの結果が生じる関係のことを数学では函数と呼ばれているけれども、プログラミング言語にも似たようなものがある。
多くのプログラミング言語では入力値を引数と呼び、出力値を戻り値と呼ぶ。PHPにおいて函数を利用するには、他の多くのプログラミング言語と同じように、函数名(実引数1,実引数2,...);
という書式で呼び出す。定義済みの函数はこのように呼び出せるが、ユーザー自身が函数を定義するにはfunctionキーワードを用いることにより、function 函数名(仮引数1,仮引数2,...){内部処理; return 戻り値;}
という書式で記す必要がある。
函数を呼び出すときに指定する引数は具体的な値が確定した状態なので実引数と呼ばれ、函数を定義するときに指定する引数は具体的な値がまだ未定なので仮引数と呼ばれる。
例として、身長と体重の値を渡してやるとボディマス指数(Body Mass Index)を計算して返してくれる函数を考えてみる。ボディマス指数の計算は身長(m)を2乗した値で体重(kg)を割って求めることができる。
<?php // 函数を定義 function body_mass_index($weight,$height){ $bmi = $weight / ($height * $height); return $bmi; } // 体重と身長の値を得る echo 'あなたの体重をキログラム単位で入力してください:'; $weight = (real)(fgets(STDIN,1024)); echo 'あなたの身長をメートル単位で入力してください:'; $height = (real)(fgets(STDIN,1024)); // 得られた2つの値が共に0以上であるならば if ($weight > 0 and $height > 0) { // BMIを計算して表示 echo "あなたの体重は{$weight}kg",PHP_EOL; echo "あなたの身長は{$height}m",PHP_EOL; // 定義したbody_mass_index函数を呼び出す echo 'あなたのBMIは'.body_mass_index($weight,$height); echo PHP_EOL; } // そうでなければ else { echo '0以上の数値を得られなかったので終了します。',PHP_EOL; }
函数の中で使われている変数である$weightと$heightは、函数の外で使われている変数である$weightと$heightとは別物。函数内の変数は函数内でのみ有効なので同じ名前でも別の変数として働く。この点は制御構文の場合とは異なる。
このスクリプトの実行結果は例えばこうなるはず。
$ php sample.php あなたの体重をキログラム単位で入力してください:0 あなたの身長をメートル単位で入力してください:0 0以上の数値を得られなかったので終了します。 $ php sample.php あなたの体重をキログラム単位で入力してください:63.5 あなたの身長をメートル単位で入力してください:1.707 あなたの体重は63.5kg あなたの身長は1.707m あなたのBMIは21.792481353701
ユーザーが定義する函数を外部のファイルに独立して記述し、他のファイルから呼び出せると便利。その場合はrequire_once文を用いる。体重と身長からボディマス指数をはじき出す函数body_mass_index函数を例にすると、函数を定義している部分を独立したファイルbody_mass_index.phpにし、それ以外の本体をsample.phpというファイルに記述したとすると、sample.php内のPHPコードからbody_mass_index函数を利用するためにbody_mass_index.phpファイルを読み込む必要がある。
require_once文の書式はrequire_once 'ファイル名';
になる。
<?php // 外部のファイルを取り込む require_once 'body_mass_index.pnp'; // 体重と身長の値を得る echo 'あなたの体重をキログラム単位で入力してください:'; $weight = (real)(fgets(STDIN,1024)); echo 'あなたの身長をメートル単位で入力してください:'; $height = (real)(fgets(STDIN,1024)); // 得られた2つの値が共に0以上であるならば if ($weight > 0 and $height > 0) { // BMIを計算して表示 echo "あなたの体重は{$weight}kg",PHP_EOL; echo "あなたの身長は{$height}m",PHP_EOL; // 定義したbody_mass_index函数を呼び出す echo 'あなたのBMIは'.body_mass_index($weight,$height); echo PHP_EOL; } // そうでなければ else { echo '0以上の数値を得られなかったので終了します。',PHP_EOL; }
require_once文は、指定した外部ファイルが存在しなかった場合にスクリプトの実行を止めてエラーメッセージを出力してくれ、指定した外部ファイルがすでに取り込まれていたら再取り込みを行わない。
まだまだつづく。次はおそらくクラスの定義。
コメント
コメントを投稿