読者です 読者をやめる 読者になる 読者になる

PSLブログ

ヨシナシゴトヲツヅリマス

PHPのコーディングでよく間違える件(1)

Perl/CGI PHP

このブログは5ヶ月ぶりとなってしまった。いろいろ書きたかったけれど、夏前くらいから忙しくなってしまい、今は手が足りていない。スタッフが欲しいところなのだが、指示するにも結構手を取られるから忙しいときに人員を増やしても楽にはなりそうにないし、給料を払える余裕もないのであった。

普段Perlばかり使っているので、たまにPHPを使うと混乱するのだが、よくあるものを。

forとforeachを混同する

Perlではforeach文もforで書けるので、タイプを減らすという理由により、今ではすべてforで統一している。そのため、PHPでforeachを使うべきところでforを使ってしまうとエラーになってしまう。

Illegal offset typeのエラー

上記と似ているが、foreach文で、キーだけを取り出すか、キーと値をセットで取り出すかで別の構文がある。

for ($array as $key) { } # タイプA
for ($array as $key => $value) { } # タイプB

今日、

$data = array(
    "key1" => array(1,2,3),
    "key2" => array(4,5,6),
);

のようなデータにアクセスするために、Aの表現をしたところ、タイトルのエラーが出てしまった。

$data = $v1 || $v2; のように書くと、論理値(true/false)が返ってしまう

Perlだと、$v1が真のときは$v1の値が、そうでなければ$v2の値が返るので、このまま使うと間違う。

三項演算子の結合順位が違う

私は三項演算子が好きで多用するのだが、以前はまったことがある。

$return = $cond1 ? $v1 : $cond2 ? $v2 : $v3;

Perlでこのように書くと、Excel関数のCASE文のように、左から評価していって、$cond1が真なら$v1、$cond2が真なら$v2、でなければ$v3、となるが、これをPHPで書くと

$return = $cond1 ? $v1 : ($cond2 ? $v2 : $v3);

とカッコで囲まなければならない。

(たぶんつづく)