[英]does php ternary operator only 'return' a true or false?
我有一個如下的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中的三元運算符實際上可以返回'true'或'false'以外的值: http : //davidwalsh.name/php-shorthand-if-else-ternary-operators
好的,更奇怪的是-在下面的代碼中,為什么第一個“ Testing”警報框出現,然后第二個“ Testing”警報框沒有出現? 這是完全相同的代碼:
// 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);
您的問題與三元表達式完全無關:在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);
觀察到此行為的原因是因為您錯過了一組引號。
做:
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中轉換為字符串時(例如,當警告它們時),您將看到字符串true
或false
。
如果添加額外的引號集,則輸出為:
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' ?>";
這可能無法解決您的問題,但是您應該確保要操作的$ _SESSION變量如下所示:
empty($_SESSION['loginStatus']) ? "false" : "true"
這樣,如果$_SESSION['loginStatus']
不存在,則代碼仍然有效。
另外,三元運算可以返回您想要的任何內容……不限於TRUE / FALSE。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.