間違った書き方
PHP側のデバグフラグ変数と、javascript側のデバグフラグ変数を連動させたいことがありました。
仮に、PHP側の変数を $isMyDebug、javascript側の変数を isMyDebug とします。
深く考えずに次のように書きました。
<script>
var isMyDebug = <?php echo $isMyDebug; ?>;
</script>Code language: PHP (php)
PHP側の変数 $isMyDebug が true のときは、
<script>
var isMyDebug = true;
</script>Code language: HTML, XML (xml)
期待どおりですね。
ところが、PHP側の変数 $isMyDebug が false のときは、どうでしょうか。
<script>
var isMyDebug = ;
</script>Code language: HTML, XML (xml)

false を echo しても、何も表示されないんだね!
ChromeのConsoleを見ると、SyntaxErrorが発生していました。
Uncaught SyntaxError: Unexpected token ';'Code language: plaintext (plaintext)

まあ、なんてことでしょう!
true/falseを出力するには
var_export関数
1つめは、var_export関数 を使う方法です。PHPもJavaScriptもboolean型のリテラルは、true、false と同じなので、PHPのvar_export関数を使うことができます。
ねんのため、var_export前に、(bool)キャストします。
<script>
var isMyDebug = <?php var_export((bool)$isMyDebug); ?>;
</script>Code language: PHP (php)
$isMyDebugがtrueの場合は、
<script>
var isMyDebug = true;
</script>Code language: HTML, XML (xml)
$isMyDebugがfalseの場合は、
<script>
var isMyDebug = false; ?>;
</script>Code language: HTML, XML (xml)
期待どおりの結果です。

(bool)キャストは必要なの?

$isMyDebugが文字列の"0"のとき、問題なのよ
var_export関数は、boolean変数専用ではないんですね。例えば、$isMyDebugが文字列の"0"の場合、次のような結果になります。そして、JavaScriptでは、文字列の'0' は、trueと評価されてしまいます。
<script>
var isMyDebug = ’0';
</script>Code language: HTML, XML (xml)
三項演算子
2つめは、三項演算子を使う方法です。
<?php
function bool_str($v)
{
return $v ? "true" : "false";
}
?>
<script>
var isMyDebug = <?php echo bool_str($isMyDebug); ?>;
</script>Code language: PHP (php)
$isMyDebugがtrueの場合は、
<script>
var isMyDebug = true;
</script>Code language: HTML, XML (xml)
$isMyDebugがfalseの場合は、
<script>
var isMyDebug = false;
</script>Code language: HTML, XML (xml)
期待どおりの結果です。

ねんのための(bool)キャストしなくてもいいのかな?

三項演算子の内部で(bool)キャストするから、必須ではないわ。
boolean型に変換するには
さきほどのvar_export関数や三項演算子の例は、boolean型の変数を前提にしていました。
ところが、この変数には、true や false 以外の、1 や 0 が設定されているかもしれません。
<?php
$isMyDebug = 1;Code language: PHP (php)
環境変数で外から与えている場合、getenv関数からは、文字列の"1" や"0"が返ってきます。
$ export IS_MY_DEBUG=0Code language: Bash (bash)
<?php
$isMyDebug = getenv("IS_MY_DEBUG");Code language: PHP (php)

文字列の"0" を bool型にキャストしたら、true ? false ?

false ?

ピンポーン

それでは、文字列の"false" を bool型にキャストしたら、true ? false ?

考えたことないよ。見た目では false っぽいけど

ぶっぶー、true でした。
(bool)キャストのほかにも、PHP変数をboolean型に変換する方法はいくつかあります。
(bool)キャスト
(boolean)キャスト、== trueで比較する、!!演算、boolval関数、いずれも同じ効果があります。
文字列の "1" や "0" を期待どおりに true、false に変換します。
ただし、文字列の"false"、"no"、"off"は、trueに変換します。
ちょっとしたデバグフラグ用途には、ちょうどいいと思います。
<?php
$isMyDebug = (bool)getenv('IS_MY_DEBUG');
?>
<script>
var isMyDebug = <?php var_export((bool)$isMyDebug); ?>;
</script>
Code language: PHP (php)
| PHP変数の値 | JavaScript変数の値 |
|---|---|
| true | true |
| false | false |
| "true" | true |
| "false" | true |
| 1 | true |
| 0 | false |
| "1" | true |
| "0" | false |
| "yes" | true |
| "no" | true |
| "on" | true |
| "off" | true |
| "" | false |
filter_var($v, FILTER_VALIDATE_BOOLEAN)
filter_var関数を使って、getenv関数の戻り値のような文字列をboolean型にする方法です。
"1"、"0"、"yes"、"no"、"on"、"off"のような文字列を期待通りに true false に変換します。
ただ、ちょっとしたデバグフラグには、大げさな感じがします。
<?php
function to_boolean($v)
{
return filter_var($v, FILTER_VALIDATE_BOOLEAN);
}
$isMyDebug = to_boolean(getenv('IS_MY_DEBUG'));
?>
<script>
var isMyDebug = <?php var_export($isMyDebug); ?>;
</script>
Code language: PHP (php)
| PHP変数の値 | filter_varの値 |
|---|---|
| true | true |
| false | false |
| "true" | true |
| "false" | false |
| 1 | true |
| 0 | false |
| "1" | true |
| "0" | false |
| "yes" | true |
| "no" | false |
| "on" | true |
| "off | false |
| "" | false |
=== true で比較する
PHP変数がboolean型の true の場合だけ、true。それ以外の場合は、false。
環境変数をgetenv関数で取得すると文字列が返ってきます。getenv関数の戻り値とtrueを===比較すると、常にfalseになってしまいます。
<?php
$isMyDebug = getenv('IS_MY_DEBUG') === true;
?>
<script>
// 常にfalse
var isMyDebug = <?php var_export($isMyDebug); ?>;
</script>Code language: PHP (php)
| PHP変数の値 | 比較後の値 |
|---|---|
| true | true |
| false | false |
| "true" | false |
| "false" | false |
| 1 | false |
| 0 | false |
| "1" | false |
| "0" | false |
| "yes" | false |
| "no" | false |
| "on" | false |
| "off | false |
| "" | false |
おすすめの書き方
PHPファイル内でture、false、1、0を設定しているなら
true、falseのほかに、数値の 1 や 0 も許容するなら、var_export前に (bool)キャストします。
<?php
$isMyDebug = true;
$isMyDebug = false;
$isMyDebug = 1;
$isMyDebug = 0;
?>
<script>
var isMyDebug = <?php var_export((bool)$isMyDebug); ?>;
</script>Code language: PHP (php)
PHPファイル内でture、falseを設定しているなら
型チェックの正確さを求めて、値は、true または falseだけに限定。
var_export前に、=== trueと比較しています。
<?php
$isMyDebug = true;
$isMyDebug = false;
?>
<script>
var isMyDebug = <?php var_export($isMyDebug === true); ?>;
</script>Code language: PHP (php)

数値の1や0もfalse扱いなんだね。

デバグフラグ用途としては生真面目すぎるかもね
環境変数で1または0を設定しているなら
環境変数の値が、"1"、"0" だけなら、getenv関数の戻り値を(bool)キャストします。
ねんのため、var_export前にも (bool)キャストします。
<?php
$isMyDebug = (bool)getenv('IS_MY_DEBUG');
?>
<script>
var isMyDebug = <?php var_export((bool)$isMyDebug); ?>;
</script>Code language: PHP (php)
環境変数でyes、no、on、offを設定しているなら
環境変数の値として、"yes"、"no"、"on"、"off"なども許容したい場面であれば、getenv関数の戻り値をfilter_var関数で処理します。
ねんのため、var_export前にも (bool)キャストします。
<?php
function to_boolean($v)
{
return filter_var($v, FILTER_VALIDATE_BOOLEAN);
}
$isMyDebug = to_boolean(getenv('IS_MY_DEBUG'));
?>
<script>
var isMyDebug = <?php var_export((bool)$isMyDebug); ?>;
</script>Code language: PHP (php)

デバグフラグでこんな場面あるのかな?

ふつうはないわね

