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

破棄されたブログ

このブログは破棄されました。

PHP の論理演算子と代入式

JavaScript は論理演算子でこういうことができるし、よく使う。
演算子の左が false と評価され、右が true と評価されれば、true ではなく右側の値を返すってやつ。機能検出とかでよく見かけるアレ。

var someVar = false || 'someValue'; // return 'someValue'

一応 ECMA-262 3rd Edition にもこの通り書いてある。

NOTE
The value produced by a && or || operator is not necessarily of type Boolean. The value produced will
always be the value of one of the two operand expressions.

http://www.ecma-international.org/publications/files/ECMA-ST-ARCH/ECMA-262,%203rd%20edition,%20December%201999.pdf

で、PHP はどうかっていうと、右側が TRUE と評価されても、右側を返してくれない。

$some_var = false || 'some_value'; // return TRUE

当たり前だけどマニュアルに書いてある通りの挙動。

$a || $b 論理和 $a または $b のどちらかが TRUE の場合に TRUE

http://www.php.net/manual/ja/language.operators.logical.php

で、PHPJavaScript みたいな挙動をさせたいときは、こういう感じかな。

<?php
$some_var = FALSE || $some_var = 'some_value';
echo $some_var; // 'some_value'
?>

マニュアルをきちんと読むまでは、($some_var = false) === TRUE だと思ってたから、このコードは失敗すると思ってた。
というのは、左辺の変数への代入が成功をもって式を TRUE として評価するんじゃないかと考えてたから。つまり、左辺が TRUE として評価されて、 $some_var = FALSE になるんじゃないかと。
でも、実際は、式で代入された値そのものが式の値となるから、左辺はそのまま FALSE と評価されて、右辺の式が実行される。

実際には、'$a = 5' は、それが何をするかによらず、 値 5 を有する式であることを意味します。 つまり、 '$b = ($a = 5)' のように書くことは、 '$a = 5; $b = 5;' と書くのと 同様なのです。

http://php.net/manual/ja/language.expressions.php

まあ確かにそうじゃないと、$b = $a = FALSE って式が $a = FALSE; $b = TRUE って意味になっちゃうよな。

広告を非表示にする