php三元运算符只是'返回'是真还是假?

时间:2012-01-02 18:23:13

标签: php javascript

我有一个php三元运算符,如下所示:

 var newLoginTxt = <?=$_SESSION['loginStatus']? 'Logged in' : 'Login'?>;
 alert("About to set the navbar's login text to: " + newLoginTxt);

根本没有出现警告框。

然而,这确实有效:

var curLoginStatusSessionVar = <?=$_SESSION['loginStatus']? 'true' : 'false'?>;
alert("Testing: " + curLoginStatusSessionVar);

出现警告框并显示“Testing:false”

我有以下文章似乎说php CAN中的三元运算符实际上返回的值不是'true'或'false': http://davidwalsh.name/php-shorthand-if-else-ternary-operators

好吧,更奇怪 - 在下面的代码中,为什么会出现第一个“测试”警告框,然后第二个“测试”警告框不会出现?这是完全相同的代码:

      // THIS "Testing" ALERT BOX APPEARS FINE**
var curLoginStatusSessionVar = <?=$_SESSION['loginStatus']? 'true' : "false"?>;
alert("Testing: " + curLoginStatusSessionVar);


var newLoginTxt = <?=$_SESSION['loginStatus']? 'Logged in' : 'Login'?>;
alert("About to set the navbar's login text to: " + newLoginTxt);


    // THIS IDENTICAL "Testing" ALERT BOX NEVER APPEARS**
curLoginStatusSessionVar = <?=$_SESSION['loginStatus']? 'true' : 'false'?>;
alert("Testing" + curLoginStatusSessionVar);

3 个答案:

答案 0 :(得分:4)

你的问题与三元表达完全无关:在JavaScript中,就像在现代php中一样,字符串必须用引号封装。

true和false恰好是JavaScript常量。因此,您想要:

var newLoginTxt = "<?=$_SESSION['loginStatus']? 'Logged in' : 'Login'?>";
//                ^                                                    ^

或者,如果数据更复杂,请使用json_encode。例如,如果要在JavaScript中访问php变量$title(可能包含引号)的值:

<?php $title = '"Java"Script'; ?>
var title = <?php echo json_encode($title); ?>;
alert(title);

答案 1 :(得分:3)

您观察到此行为的原因是您错过了一组引号。

执行:

var newLoginTxt = "<?=$_SESSION['loginStatus']? 'Logged in' : 'Login'?>";
alert("About to set the navbar's login text to: " + newLoginTxt);

它会起作用。

如果你看原始代码,输出将是:

var newLoginTxt = Logged in; // Syntax error
// ...or...
var newLoginTxt = Login; // Used (probably) undefined variable

第二个例子没有这个问题的原因是输出将是:

var curLoginStatusSessionVar = true;
// ...or...
var curLoginStatusSessionVar = false;

...正如您所看到的,它们都是布尔值的有效赋值。当布尔值在JS中转换为字符串时(例如,当您提醒它们时),您将看到字符串truefalse

如果添加额外的引号集,则输出现在为:

var newLoginTxt = "Logged in";
// ...or...
var newLoginTxt = "Login";

哪些都是有效的字符串赋值,所以应该解决问题。

作为旁注,您应该暂时避免使用<?=简写PHP标记。这是因为(在PHP 5.4之前)使用此语法需要启用short_open_tag,这在许多环境中都不会,例如大多数共享主机。在PHP 5.4更广泛可用之前,出于可移植性的原因,您应始终坚持使用完整的<?php标记。所以你的线路实际上是:

var newLoginTxt = "<?php echo $_SESSION['loginStatus'] ? 'Logged in' : 'Login' ?>";

答案 2 :(得分:1)

这可能无法解决您的问题,但您应该确保您正在运行的$ _SESSION变量存在,如下所示:

empty($_SESSION['loginStatus']) ? "false" : "true"

这样,如果$_SESSION['loginStatus']不存在,代码仍然有效。

此外,三元操作可以返回任何你想要的东西......它不限于TRUE / FALSE。