FC2ブログ

サラリーマンのすらすらIT日記

IT関連を中心とした日々を綴ります。
2012/04/18

JavaScriptとPHPの「三項演算子」

C言語使いの方はどうなのかは知りませんが、私のようなDelphi使いからすると、JavaScriptでプログラミングするようになって、言語仕様の面でいいなと思ったことが二つあります。一つはfor文。もう一つが三項演算子です。

Ext JSを使っていると、コンフィグの設定が出てきます。例えば


new Ext.data.Store({
url: 'hogehoge',
reader: reader
});

というコードだと、urlやreaderがコンフィグです。コンフィグの値にはif文などが書けません。コンフィグの種類(stringやobjectなど)に応じた値だけです。ある条件によってコンフィグの値を変えたい場合、三項演算子を使わないとすると

reader: getReader()

として、別の箇所に内部でif文を使った関数getReader()を用意するという方法になりますが、これだとわかりにくい。ところが三項演算子を使うと、関数を使わず1行で書けます。しかもわかりやすい。

reader: hoge === 1 ? reader1 : reader2

これに気をよくして、JavaScriptで三項演算子を多用するようになりました。本来switch~case文で書くようなコードを、下記のように三項演算子で書いたことがあります。

var a = 1;
var kekka = a === 1 ? "one" :
a === 2 ? "two" :
a === 3 ? "three" :
"other";

JavsScriptだと期待通りに動きますが、PHPで同じようなことをやった時、うまく動かないことに気がつきました。その時は真剣に原因を追求する時間がなくて、普通にswitch~case文で書き直しました。

今回、この記事を書くに当たって、PHPで次のようなコードを書いて試してみました。


$a = 1;
$kekka = $a === 1 ? "one" :
$a === 2 ? "two" :
$a === 3 ? "three" :
"other";
echo $kekka;

結果は、threeが表示されます。そして変数$aを2にしても3にしても、threeが表示されます。なぜか?

PHPの公式マニュアルには、このように書かれています。

三項演算子を "積み重ねて" 使用することは避けましょう。 ひとつの文の中で複数の三項演算子を使用した際の PHP の振る舞いは、 少々わかりにくいものです。



要は三項演算子のネスティングはしない、というのがPHPの作法ということです。どうしても使いたいのであれば、下記のように括弧をつけると期待通りの結果になります。

$a = 1;
$kekka = $a === 1 ? "one" :
($a === 2 ? "two" :
($a === 3 ? "three" :
"other"));
echo $kekka;

とはいえ、今後PHPでは三項演算子のネスティングをしないようにします。

スポンサーサイト



コメント

コメントの投稿

  • URL
  • コメント
  • パスワード
  • 秘密
  • 管理者にだけ表示を許可する

トラックバック

トラックバックURL:http://sookibizviz.blog81.fc2.com/tb.php/1169-7f1d9f68

■  カレンダー

07 | 2020/08 | 09
- - - - - - 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 - - - - -

■  プロフィール

sookibizviz

Author:sookibizviz
仕事の内容やソフトの紹介を交えながら、日々の悪戦苦闘を綴っていきます。

■  最新記事

■  最新コメント

■  最新トラックバック

■  月別アーカイブ

■  カテゴリ

未分類 (64)
BizViz (24)
IT (1119)
計量 (76)
環境 (26)
数学 (181)
ニュース (46)
本 (187)
音楽 (113)
囲碁 (5)
将棋 (26)
ブログ (14)
日記 (19)

■  FC2カウンター

■  検索フォーム

■  RSSリンクの表示

■  QRコード

QRコード