PHPのboolean型の値をJavaScript変数に設定する方法

間違った書き方

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型のリテラルは、truefalse と同じなので、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型の変数を前提にしていました。

ところが、この変数には、truefalse 以外の、10 が設定されているかもしれません。

<?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型にキャストしたら、truefalse

false

ピンポーン

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

考えたことないよ。見た目では 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変数の値
truetrue
falsefalse
"true"
true
"false"true
1true
0false
"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の値
truetrue
falsefalse
"true"true
"false"false
1true
0false
"1"true
"0"false
"yes"true
"no"false
"on"true
"offfalse
""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変数の値比較後の値
truetrue
falsefalse
"true"false
"false"false
1false
0false
"1"false
"0"false
"yes"false
"no"false
"on"false
"offfalse
""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)

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

ふつうはないわね

タイトルとURLをコピーしました