間違った書き方
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=0
Code 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)
デバグフラグでこんな場面あるのかな?
ふつうはないわね