式は、PHP における最も重要な基盤石です。PHPにおいては、 ほとんど全てのものは式で記述されます。
最も簡単で最も正確な式の定義は、"全ての式には値がある。" です。
考えられる簡単な例は、定数と変数です。 "$a = 5" と入力すると、$a に '5'
を代入することになります。 '5' は、明らかに、 5 という値です。 言葉を変えると '5' は 5
という値を有する式なのです。 (この場合、'5' は整数定数です。)
この代入の後、$a の値は、5 であることが予想されます。 よって、$b = $a
と書いた場合、$b = 5 と書いたのと 同じように動作することが予想されます。 言い換えると $a は 5
という値を持つ式なのです。 全てが正しく動作する場合、何が起こるかをこのことが正確に表現しています。
少しだけより複雑な式の例は、関数です。 例えば、次の関数を考えてみましょう。
あなたが関数の概念に慣れていると仮定すると (そうでない場合は、関数に関する章を参照下さい。)、
$c = foo()
と入力することは、
$c = 5
と書くことと本質的に全く同じで あると予想されたかもしれません。この予想は、正しいです。
関数は、その返り値を値とする式なのです。 foo() は 5 を返すので、式 'foo()' の値は 5 です。
通常、関数は、決まった数だけを返すのではなく、何かを計算します。
もちろん、PHP の値は整数である必要はありませんし、 多くの場合、そうではありません。 PHP
は、3 種類のスカラー型(整数、浮動小数点数、文字列)をサポートします。
(スカラーとは、配列とかと異なり、より小さな部分に'分割する'ことが できない値のことです。) PHP
は、2種類の複合(非スカラー)型(配列とオブジェクト)もサポートします。 これらの型の値は、変数に代入することができ、
関数からの返り値とすることができます。
これまでのところ、PHP/FI 2 のユーザーは何も変わったところがないと 思ったことでしょう。
しかし、PHP は、他の多くの言語が行うのと同じ手法で、 更に多くの式を使用可能です。 PHP 3
は、ほとんど全てが式であるという意味で、式指向の言語です。 既に取り扱った '$a=5' という例について考えてみましょう。
この式には、整数定数の '5' と 5 に更新された $a の値という 2
つの値が現れているということに容易に気づくことでしょう。 しかし、実際には、ここにはもうひとつの値が含まれています。
それは、代入自体の値です。 代入式は、それ自体、代入値を評価します。 この場合、その値は 5 になります。
このことは、実際には、'$a = 5' は、それが何をするかによらず、 値 5 を有する式であることを意味します。 つまり、
'$b = ($a = 5)' のように書くことは、'$a = 5; $b = 5;' と書くのと
同様なのです。(セミコロンは、文の終わりを示します。) 代入は、右から左へ実行されるため、'$b = $a = 5'
と書くことも 可能です。
式の配置に関する別の良い例は、前置、後置加算子、あるいは減算子です。 PHP/FI 2
と他の多くの言語のユーザーは、variable++ や variable-- といった表記法に慣れていることでしょう。
これらは、加算子および減算子です。 PHP/FI 2 においては、文 '$a++' は値を持ちませんでした。
(この文は、式ではありませんでした。) このため、この式に代入したり、なんらかの手法でこれを使用することが できませんでした。
PHP は、C 言語のようにこれらの式を同時に作ることにより 加算子、減算子の機能を拡張しました。 PHP においては、C
言語のように、 前置加算と後置加算という、2 種類の加算があります。
前置加算と後置加算は、両方とも、基本的には変数を増加させ、 変数に対する効果は同じです。
異なっているのは、加算する式の値です。 前置加算は、'++$variable' と書かれますが、 加算後の値を評価します。
(PHP はその値を読む前に変数を増加させるので、'前置加算(pre-increment)' という名前がついています。)
後置加算は、'$variable++' と書かれますが、加算される前の $variable の元の値を評価します。 (PHP
は、その値を読んだ後に変数を増加させるので、 '後置加算(post-increment)'
という名前がついています。)
比較演算子は、極めて標準的な式です 比較演算子は、0、1のどちらかを値とします。
この値の意味は、(それぞれ、)
FALSE
と
TRUE
です。 PHPは、 (大なり)、 =(大なりイコール)、=(イコール)、 (小なり)、 =(小なりイコール)をサポートします。
これらの式は、
if
文のような条件式の内部で一般的に 使用されます。
式の最後の例として、ここでは、演算子+代入式の複合演算式 を扱います。 既にご存知のように、$a に
1 を加えたい場合は、'$a++' または '++$a' と書くだけで十分です。 しかし、1より大きな数、例えば 3
を加えたい場合は、どうすればよいの でしょう? '$a++' を複数回使うこともできますが、当然これはあまり効率的で快適な
手法ではありません。 多くの場合は、'$a = $a + 3' と書かかれます。 '$a + 3' は、$a + 3
の値を評価し、$a に代入します。 この結果、$a に 3 が加えられます。 PHP においては、C
のような他の言語と同様に、 この例をより短かく書くことができます。 これにより、より明確になり、同時に理解も迅速になります。
$a の現在の値に 3 を加える式は、 '$a += 3' と書くことができます。 この式の正確な意味は、 "$a
の値を取得し、それに 3 を加え、$a に再代入しなさい。" です。
より短く、明確になっただけでなく、実行もより高速になります。 '$a =+ 3'
の値は、通常の代入と同様に、代入された値です。 この値は 3 ではなく、$a に 3 を加えた加算値 (この値が、$a
に代入された値です。)であることに注意して下さい。 '$a -= 5' ($a から 5 を引く)や '$b *= 7'
($b に 7 をかける)等のように、 全ての 2 項演算子は、この演算子+代入式のモードで使用することができます。
もう一種類、terniary 条件文という式がありますが、
他の言語で見たことがない場合には理解できないかもしれません。
次の例は、前置および後置加算子と多少一般的な式の理解を 助けてくれることでしょう。
function double($i) { return $i*2; } $b = $a = 5; /* 値 5 を %a と $b に代入します */ $c = $a++; /* 後置加算なので、$c に代入される値は、$a の 元の値 (5) です */ $e = $d = ++$b; /* 前置加算なので、$d と 4e に代入される値は、 加算後の $b の値 (6) です */ /* ここままで、$d と $e は、6 です */ $f = double($d++); /* $f には、$d が加算される emphasis 前 /emphasis の値を2倍した値、 つまり 2*6 = 12 が、代入されます。 $g = double(++$e); /* $g には、$e が加算された emphasis 後 /emphasis の値を2倍した値、 つまり 2*7 = 14 が、代入されます。 $h = $g += 10; /* まず、$g に 10 が加算され、24 になります。代入値 (24) は、 $h に代入されます。そして、$a も同様に 24 になります。 */ |
本章のはじめで、様々な文の型について書くと言いましたが、 約束したように、式は、文なのです。
しかし、全ての式がひとつの文なわけではありません。 この場合、文は、'式'';' 、つまり式の後にセミコロンがついた形式です。
'$b=$a=5' において、$a=5 は有効な式ですが、自身を値とする文では ありません。しかし、'$b=$a=5;'
は有効な文です。
最後に、有益な事項として式の論理値について説明します。
多くのイベント、主に条件付き実行とループにおいて、 式の特定な値には関心がないが、
TRUE
または
FALSE
のどちらを 意味するかに関心があるということがあります。 定数
TRUE
と
FALSE
(大文字小文字を区別しない)は、論理型の値がとり得る 値です。必要に応じて式は論理値に変換されます。詳細な手法については、
型キャストに関するセクション
を参照ください。
PHP は、完全で強力な式の実装を提供します。
それを完全に記述することは、このマニュアルの範囲を超えています。
上記の例は、式とは何か、そして、便利な式をどうやって作るかということ に関して良いアイデアを与えるに違いありません。
本マニュアルの残りの部分では
expr
という マークを使用しますが、これは PHP の有効な式を意味します。