【问题标题】:does php ternary operator only 'return' a true or false?php 三元运算符是否只“返回”真或假?
【发布时间】:2012-01-02 18:23:12
【问题描述】:

我有一个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);

出现警告框并显示“正在测试:假”

我有以下文章似乎在说 php CAN 中的三元运算符实际上返回的值不是“真”或“假”: 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);

【问题讨论】:

  • 使用客户端工具查看生成的输出并打开 JS 控制台,看看哪里出了问题。这不会是三元运算符的错。
  • 您的问题与三元运算符无关,您没有正确关闭字符串。查看 phihag 的答案。

标签: php javascript


【解决方案1】:

您的问题与三元表达式完全无关:在 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);

【讨论】:

  • 谢谢。这就是问题所在。好眼力!我向所有发现这个问题的人表示向上箭头,我接受这个答案——谢谢大家。
【解决方案2】:

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

做:

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";

这两个都是有效的字符串分配,所以应该解决问题。

附带说明一下,您目前应该避免使用&lt;?= 速记PHP 标记。这是因为(在 PHP 5.4 之前)使用此语法需要启用 short_open_tag,这在许多环境中并不如此,例如大多数共享主机。在 PHP 5.4 更广泛地可用之前,出于可移植性的原因,您应该始终坚持使用完整的 &lt;?php 标签。所以你的行实际上是:

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

【讨论】:

  • Dave 非常感谢 = 语法的陷阱!我现在要使用
【解决方案3】:

这可能无法解决您的问题,但您应该确保您正在操作的 $_SESSION 变量像这样存在:

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

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

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

【讨论】:

  • 非常感谢,但是在执行此代码之前,在第一次站点访问时在 index.php 的 onLoad() 上使用了 isset() 并设置了“loginStatus”会话变量。证明是上面的第一个“测试”警告框看起来很好,并且正确地表明“登录状态”设置为“假”。
  • 我明白了……我只是想说明引用 PHP 变量的意义,而不是任何事情。
  • 谢谢,非常感谢您的努力——我从您的评论中学到了一些东西,我以前从未使用过“空”——感谢您的努力。
猜你喜欢
  • 2014-08-03
  • 1970-01-01
  • 2014-12-15
  • 1970-01-01
  • 1970-01-01
  • 2017-09-18
  • 2018-04-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多