簡體   English   中英

php三元運算符只“返回”是對還是錯?

[英]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中轉換為字符串時(例如,當警告它們時),您將看到字符串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' ?>";

這可能無法解決您的問題,但是您應該確保要操作的$ _SESSION變量如下所示:

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

這樣,如果$_SESSION['loginStatus']不存在,則代碼仍然有效。

另外,三元運算可以返回您想要的任何內容……不限於TRUE / FALSE。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM