PHP運算子優先權的一個例外
今天在老王的技术手册看到一个问题:
<?php if ($a = 100 && $b = 200) { var_dump($a, $b); }
输出是什么?
这个问题, 咋一看或许觉得简单, 但其实仔细推敲并不简单,
如果说布尔与之前的部分, 是由于优先级的问题, 但是如果仅仅是优先级的问题的话, 那么结果应该是:
$a = (100 && $b) = 200
而实际上的结果, 确实高优先级的&&让步给次优先级的=, 让 $b = 200 先结合了.
究其原因, 是因为PHP并不完全遵守优先级的定义, 这个在PHP的手册中也有说明:
Note: Although = has a lower precedence than most other operators, PHP will still allow expressions similar to the following: if (!$a = foo()), in which case the return value of foo() is put into $a.
这样的设计, 个人不发表看法, 反正在C语言中, 这样类似的语句是判定为语法错的. PHP采用这样的设计, 很可能是历史原因,
有好奇的同学, 会想知道到底为什么, 之前jayeeliu网友也问过:
laruence你好:
问一个php运算符优先级的问题
$t == 1 && $tt = 2
按照php运算符优先级应该是
(($t == 1) && $tt) = 2
这个顺序执行,但实际上应该是
($t == 1) && ($tt = 2)
我有些不太理解。
其实也简单, 运算符优先级是在存在二义性文法的时候的一种规约规则选择的手段, 而PHP的语法分析文件定义中, 却让等号和T_BOOLEAN_AND(&&)之前不存在了规约冲突:
expr_without_variable: // 有隐规则存在, 相当于T_BOOLEAN_AND成为了"一元操作符". | expr T_BOOLEAN_AND { zend_do_boolean_and_begin(&$1, &$2 TSRMLS_CC); } expr
最后, 顺便说一下, PHP对应于T_BOOLEAN_AND 还定义了 T_LOGICAL_AND(and) 和 T_LOGICAL_OR(or) , 这俩个的优先级都低于等号, 于是就会有了, 很多PHP入门教材示例代码中经典的:
$result = mysql_query(*) or die(mysql_error());
类似的还可以用or来实现三元操作符(?:)的功能:
$person = $who or $person = "laruence"; //等同于: $person = empty($who)? "laruence" : $who;
更多PHP相关知识,请访问PHP中文网!
以上是PHP運算子優先權的一個例外的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

熱門話題

Windows透過為它們分配優先級,在將系統資源分配給最需要它的進程和程序方面做得非常好。您安裝的大多數應用程式都可以在預設的「正常」優先權等級下完美運作。 然而,有時,您可能需要以高於預設正常水平的水平運行程序,例如游戲,以提高它的性能。但這樣做是有代價的,而且是一筆值得深思的交易。 當您將應用程式設定為高優先級時會發生什麼? Windows執行不同的進程和程式時總共有六個優先權——低、低於正常、正常、高於正常、高和即時。 Windows將根據它們的優先順序對應用程式進行排名和排隊。優先權越高,應用

通知是提高生產力的好工具,但有時會讓人分心。無論您是要完全停用通知還是要為選定的應用程式停用通知,此頁面都是您所需要的。我們還將了解如何使用FocusAssist自動停用和啟用通知。此外,如果「設定」應用程式不適合您,您可以使用命令提示字元、註冊編輯器和群組原則編輯器等工具,使用更極客的方式來停用通知。請查看以下教學課程,了解在Windows11上停用通知的7種方法。為什麼要在Windows11上停用通知?禁用通知有其各種優點,其中一些已在下面列出。但是,請記住,禁用重要應用程式的通知可能會

什麼是進程優先權?計算機與其創造者並無太大差異。儘管看起來他們同時在處理多項任務,但實際上他們是自發性地在不同任務之間兼顧。但並非所有進程或程序都可以平等地分配資源。 重要的進程,例如保持系統盡可能平穩運行所需的進程,被賦予高優先級,而那些僅在外圍工作的進程可以被分配較低的優先權。這有助於系統即使在承受大量壓力時也能順利運作。 什麼是優先權? 進程有6個不同的優先權。這些如下:低—— 這是最低的優先順序。具有「低」優先權的進程只有在所有其他任務完成後才會獲得必要的資源。 BelowNorma

Windows 11 22H2中的新工作管理員對進階使用者來說是個福音。現在,它透過附加資料提供更好的 UI 體驗,以密切關注您正在運行的流程、任務、服務和硬體元件。如果您一直在使用新的任務管理器,那麼您可能已經注意到新的效率模式。它是什麼?它是否有助於提高 Windows 11 系統的效能?讓我們來了解一下! Windows 11 中的效率模式是什麼?效率模式是任務管理器中的一

在c語言中,沒有開根號運算符,開根號使用的是內建函數“sqrt()”,使用語法“sqrt(數值x)”;例如“sqrt(4)”,就是對4進行平方根運算,結果為2。 sqrt()是c語言內建的開根號運算函數,其運算結果是函數變數的算術平方根;此函數既不能運算負數值,也無法輸出虛數結果。

對於Golang開發者來說,「invaliduseof…operator」是一個常見的報錯。這個報錯通常會在使用變長參數函數時出現。它在編譯時就會被檢測出來,並指出哪些部分有問題。這篇文章將介紹如何解決這個報錯。一、什麼是變長參數函數變長參數函數也稱為可變參數函數,是Golang語言中的一種函數型別。使用變長參數函數可以像如下方式定義多個

Linux程序優先級調整方法詳解在Linux系統中,進程的優先順序決定了其在系統中的執行順序和資源分配。合理調整進程的優先順序可以提高系統的效能和效率。本文將詳細介紹Linux中如何調整進程的優先級,並提供具體的程式碼範例。一、進程優先權概述在Linux系統中,每個行程都有一個與之相關聯的優先權。優先權的範圍一般是-20到19,其中-20表示最高優先權,19表

自訂常規通知設定讓我們從通知設定的基礎開始。首先,如果您想在Windows11上進行通知設置,有兩種方法可以做到。最快的方法是右鍵單擊任務欄一角的日期和時間部分,然後選擇通知設定。或者,您可以使用“開始”功能表開啟“設定”應用程序,然後在“系統”部分(預設為開啟)中選擇“通知”。在這裡,您會看到通知設定的概覽。您可以完全停用通知,或按一下第一個選項Notifications以展開下拉式功能表。此選單有一些附加選項,例如關閉通知聲音。您也可以選擇是否要在鎖定畫面上顯示通知,包括提醒和來電的特定設定。
