🍋

JSの中でPHPを使ったときに戸惑った論理判定

2025/02/01に公開

拡張子phpのファイル内で、html、js、phpを使用していて、論理式が思っているものと違ったのでそのときのメモ✏️

  • phpファイルで以下を実行すると、consoleに何が表示されるかで戸惑った
phpファイル
<script>
  let test  = <?= (strpos('bbbb', 'nnn') !== false ? 'true' : 'false') ?>;
  if (test) {
    console.log("test1"); 
  } else {
    console.log("test2");
  }
</script>

上記では、test = 'false'のように文字列のfalseが代入されてtest1が表示されると思っていたけど、
コンソールにはtest2が表示される。

testには文字列が渡されるんじゃないの??と戸惑った

文字列ではなく論理値が渡された理由

◎ PHPの短縮タグ <?= を使用すると、PHPの評価結果がそのまま出力される。

なるほど!💡

なんとなく使っていたけど、<?= は、<?php echo の省略形

たとえば、echo "やほー" を実行したら、やほーが出力されるように、
クォート、ダブルクォートは表示されない。

同じようにechoの省略形の<?=を使った、<?= 'false' ?>では、false が出力される。
クォートは付かずに出力されるのでfalseは論理値として認識される

<?= (strpos('bbbb', 'nnn') !== false ? 'true' : 'false') ?>

なので test = falseとなってtest2が表示される。

falseを文字列として表示したい場合

json_encodeを使うか、下記のようにクォートをつけるかにすると、test = 'false'のようにfalseが文字列として認識される。

"'" . (strpos('bbbb', 'nnn') !== false ? 'true' : 'false') . "

json_encode関数ではPHPデータをJSON形式に変換するので、文字列がダブルクォートで囲まれる。

Discussion