tohokuaikiのチラシの裏

技術的ネタとか。

PHPの演算子の強さがどこまでわかってるかとstrposの返り値

<?php
$foo = '123hoge456';
$baz = true;

if ($bar = strpos($foo, 'hoge') && $baz){
    var_dump('A', $bar); 
}

if (($bar = strpos($foo, 'hoge')) && $baz){
    var_dump('B', $bar); 
}

$foo = 'hoge456';
$baz = true;

if ($bar = strpos($foo, 'hoge') && $baz){
    var_dump('C', $bar); 
}


$foo = 'hoge456';
$baz = true;

if (($bar = strpos($foo, 'hoge')) && $baz){
    var_dump('D', $bar); 
}

これの結果がどうなるか。

string(1) "A"
bool(true)
string(1) "B"
int(3)

です。

演算子として&&は=より強いし、strposの返り値は0もあるので。

ただ、こういう演算子の強さを知識の前提としたコードはよくないと思う。多少長くなっても

$foo = 'hoge456';
$baz = true;

$bar = strpos($foo, 'hoge');
if ($bar !== false && $baz){
    var_dump('D', $bar); 
}

と書くのがイイと思う。