PHP 的比较运算与逻辑运算,php运算逻辑
1、以下值用 empty() 被判断为true:
未赋值变量、未声明变量、0、"0"、""、false、null、空数组 array() 、对象的魔术方法 __get() 返回的值
在低于 PHP5.0 的版本中,没有任何属性的对象也被 empty 判断为 true
注意:empty() 只接受变量或变量的索引值或属性值,不能直接传入常量,也不能传入运算表达式,PHP 5.5 之后支持表达式
2、被 isset() 判断为 false 的值:未赋值变量、未声明变量、null、__get() 返回的值,接受的参与 empty()一样,不能是常量和表达式.
3、不同类型的数据比较
如果有一个是 boolean 型或者 null, 转换成 boolean 比较,
否则如果有一个是 number,转换成 number 比较,
否则如果有一个是 string,转换成 string 比较
object 类型总是大于 array 类型和标量类型,array 类型总是大于 标量类型
注意这些比较结果:

<span>//</span><span>0开头的数字字符串转数字时不会按八进制转换,而是简单地丢弃把 '0' 丢弃按数字进行比较,</span> 123=='0123' <span>//</span><span>true</span> "123"<"0124" <span>//</span><span>true,0开头的数字字符串直接按十进制数字比较而非八进制</span> "012" == 10 <span>//</span><span> false</span> 012 == 10 <span>//</span><span> true</span> 0x12 == 18 <span>//</span><span> true</span> "0x12" == 18 <span>//</span><span> true</span> <span>false</span> < <span>true</span>; <span>//</span><span>true</span> 2><span>true</span>; <span>//</span><span> false</span> 2==<span>true</span>; <span>//</span><span> true </span> <span>null</span>==0; <span>//</span><span>true</span> -1<0;<span>//</span><span>true</span> -1<<span>null</span>;<span>//</span><span>false ,-1 转 bool 是true</span>

4、类型转换规则
被 empty() 判断为 true 的值转换为 boolean 型得到 false ,反之,得到 true ( __get() 返回的值需按具体的值判断)
被 empty() 判断为 true 的值转换成 number 得 0,非空的 array 转 number 得到1 ( __get() 返回的值需按具体的值判断)

<span>class</span><span> Test{ </span><span>private</span> <span>$k</span>=1<span>; </span><span>public</span> <span>function</span> __get(<span>$propertyName</span><span>){ </span><span>return</span> 123<span>; } } </span><span>$obj</span> = <span>new</span><span> Test(); </span><span>echo</span> json_encode(<span>empty</span>(<span>$obj</span>->k)); <span>//</span><span>true</span> <span>echo</span> json_encode(<span>isset</span>(<span>$obj</span>->k)); <span>//</span><span>false</span> <span>echo</span> json_encode((bool)(<span>$obj</span>->k)); <span>//</span><span>true</span>

几个string 转 number 的场景:

<span>echo</span> 'abc'*1 ; <span>//</span><span>0 </span> <span>echo</span> '012'*1; <span>//</span><span>12 乘法:可以转换十六进制数,不是数字开头则返回 0</span> <span>echo</span> '0x12.123'*1; <span>//</span><span>18</span> <span>echo</span> (<span>float</span>)'0x12' ;<span>//</span><span>0 </span> <span>echo</span> (int)'0x12' ; <span>//</span><span>0 不能处理十六进制数</span> <span>echo</span> (<span>float</span>)'12abc'; <span>//</span><span>12 截取左侧字符串</span> <span>echo</span> (<span>float</span>)'abc'; <span>//</span><span> 0 不是数字返回0</span> <span>is_numeric</span>('0x123'); <span>//</span><span>true 能识别十六进制数</span> <span>is_numeric</span>('0x123.123'); <span>//</span><span>false 识别目标是整个字符串而非截取前面一部分</span>

string 转 number 时截取左侧的数字字符串进行转换,如果没有则返回 0.
其他数据转字符串:

<span>//几个转字符串的值</span>
(<span>string</span>)0 ; <span>//</span><span> "0"</span> (<span>string</span>)<span>true</span>; <span>//</span><span> "1"</span> (<span>string</span>)<span>false</span>; <span>//</span><span> ""</span> (<span>string</span>)<span>null</span>; <span>//</span><span> ""</span> (<span>string</span>)<span>array</span>(); <span>//</span><span> "<span>Array</span>"</span>

数组可以直接进行字符串拼接操作但不能进行数学运算.
object 类型转换成 boolean 总是 true, object 类型不能转换成 number 和 string ,因此也不能进行字符串拼接和数学运算
标量转换成 array 的方式是将数组第一个元素设置成标量,返回该数组。
标量转换成 object 得到一个 stdClass 类的实例,标量的值被赋给名为 scalar 的属性: Object( [scalar] => 234)
array 转 object 得到一个 stdClass 类的实例,数组的 key 为实力的属性名。
object 转 array 有点复杂:
方法、静态属性、类常量被丢弃
保护属性名称前面被被加上一个 "*"
私有属性前面被加上类名作为前缀(大小写与类名完全相同)
这些前缀的前后都加上空字符 \0
例如一个由 object 转换来的 array 为:
<span>Array</span>( [*v] => 444 [bf] => 333 [bk] => 99977 [Ak] => 999 [*p] => 888 [a2] => 22)
原对象中有:
public 属性 a2, protected 属性 v、p ,这些属性来自哪个类无法鉴别(被重写则取子类的属性)
来自类 b 的 private 属性 f、k,(从数组 key 来看,以bf为例,无法判断他是属性名为bf,还是来自类b的私有属性f)
来自类 A 的 private 属性 k
无法鉴别 b 和 A 哪个是子类哪个是父类(仅从 array 的key来看,也无法推断出原对象构造自哪个类)
例子:

<span>class</span><span> A { </span><span>private</span> <span>$A</span> = 'private property, $A of class A'; <span>//</span><span> This will become '\0A\0A'</span> <span>protected</span> <span>$C</span> = 'protected property, $C of class A'<span>; } </span><span>class</span> B <span>extends</span><span> A { </span><span>private</span> <span>$A</span> = 'private property, $A of class B'; <span>//</span><span> This will become '\0B\0A'</span> <span>public</span> <span>$AA</span> = 'public property, $AA of class B'; <span>//</span><span> This will become 'AA'</span> <span>protected</span> <span>$B</span> = 'protected property, $B of class B'<span>; } </span><span>$arr</span> = (<span>array</span>) <span>new</span><span> B(); </span><span>foreach</span> (<span>$arr</span> <span>as</span> <span>$key</span> => <span>$value</span><span>) { </span><span>echo</span> '<br />'<span>; </span><span>echo</span> <span>$key</span> .',length: '.<span>strlen</span>(<span>$key</span>).' value: '.<span>$value</span><span>; }</span>

输出结果:
BA,length: 4 value: <span>private</span> property, <span>$A</span> of <span>class</span><span> B AA</span>,length: 2 value: <span>public</span> property, <span>$AA</span> of <span>class</span><span> B </span>*B,length: 4 value: <span>protected</span> property, <span>$B</span> of <span>class</span><span> B AA</span>,length: 4 value: <span>private</span> property, <span>$A</span> of <span>class</span><span> A </span>*C,length: 4 value: <span>protected</span> property, <span>$C</span> of <span>class</span> A
5、 逻辑运算总是返回 true 或 false (写多了 javascript 的人要注意),逻辑运算符优先级从高到低 为 &&、 ||、 and、 or ,逻辑运算符的短路效果可以使用语句中,但记住他们不会像 javascript 中那样返回一个 不是 boolean 类型的值,在表达式中使用要注意。

<span>$a</span> = 1<span>; </span><span>$b</span>=0<span>; </span><span>$b</span> and <span>$a</span> = 100<span>; </span><span>echo</span> <span>$a</span>; <span>//</span><span>1</span> <span>$b</span> || <span>$a</span> = 200<span>; </span><span>echo</span> <span>$a</span>; <span>//</span><span>200</span>

6、switch 的比较不是 "===" 而是 "==" (在 javascript 中是 "===")
7、 在 php4 中,object 之间的比较方式与 array 相同,在 php5 中 , object 类型间的 "==" 比较为 true的前 提是,他们属于同一个类的实例(当然还要进行属性的比较,这类似标量的"==="比较),object 间的 "===" 比较为 true 的前提是他 们 就是同一个对象。
在 PHP4 中 ,不包括任何成员变量的对象 被 empty() 判断为 true
字符串偏移 offset 取字符的 empty() 判定: 取对应 offset 的字符进行判断,在PHP5.4 以前,使用索引从字符串中取字符时会先将索引进行取整,因此左侧不包含数字的字符串都被转换成0,PHP5.4之后,不再对非整形格式的字符串索引进行取整,因此判断为 true, 同理,isset() 判定为false. 如:

<span>$str</span> = 'ab0d'<span>; </span><span>empty</span>(<span>$str</span>[0]); <span>//</span><span>false</span> <span>empty</span>(<span>$str</span>[0.5]); <span>//</span><span>false 索引被向下取整 为 0</span> <span>empty</span>(<span>$str</span>["0.5"]); <span>//</span><span>false 索引被向下取整 为 0,PHP5.4之后不取证,判定为 true </span> <span>empty</span>(<span>$str</span>[2]); <span>//</span><span>true ,取得的字符为 "0"</span> <span>empty</span>(<span>$str</span>["3"]); <span>//</span><span>false ,取得的字符为 "d"</span> <span>empty</span>(<span>$str</span>[4]); <span>//</span><span>true ,索引超出范围,notice 警告,但 empty() 会忽略警告</span> <span>empty</span>(<span>$str</span>['a']); <span>//</span><span> false ,左侧不包含数字字符串索引 PHP5.4之前被处理为 $str[0],PHP5.4之后,直接为判定 true </span>

无论是“不等于”还是”==“ ,不要在 PHP 的跨类型数据比较中使用”传递性“:
$a == $b; //true
$b == $c; //true
并不能说明 $a == $c 为 true
数组的比较方法

<span>//</span><span> 数组是用标准比较运算符这样比较的</span> <span>function</span> standard_array_compare(<span>$op1</span>, <span>$op2</span><span>) { </span><span>if</span> (<span>count</span>(<span>$op1</span>) < <span>count</span>(<span>$op2</span><span>)) { </span><span>return</span> -1; <span>//</span><span> $op1 < $op2</span> } <span>elseif</span> (<span>count</span>(<span>$op1</span>) > <span>count</span>(<span>$op2</span><span>)) { </span><span>return</span> 1; <span>//</span><span> $op1 > $op2</span> <span> } </span><span>foreach</span> (<span>$op1</span> <span>as</span> <span>$key</span> => <span>$val</span><span>) { </span><span>if</span> (!<span>array_key_exists</span>(<span>$key</span>, <span>$op2</span><span>)) { </span><span>return</span> <span>null</span>; <span>//</span><span> uncomparable</span> } <span>elseif</span> (<span>$val</span> < <span>$op2</span>[<span>$key</span><span>]) { </span><span>return</span> -1<span>; } </span><span>elseif</span> (<span>$val</span> > <span>$op2</span>[<span>$key</span><span>]) { </span><span>return</span> 1<span>; } } </span><span>return</span> 0; <span>//</span><span> $op1 == $op2</span> }

8、三元运算符 ?: ,跟其他大多数编程语言不一样,PHP 的三元运算符是左结合的!

<span>$arg</span> = 'T'<span>; </span><span>$vehicle</span> = ( ( <span>$arg</span> == 'B' ) ? 'bus' :<span> ( </span><span>$arg</span> == 'A' ) ? 'airplane' :<span> ( </span><span>$arg</span> == 'T' ) ? 'train' :<span> ( </span><span>$arg</span> == 'C' ) ? 'car' :<span> ( </span><span>$arg</span> == 'H' ) ? 'horse' : 'feet'<span> ); </span><span>echo</span> <span>$vehicle</span>; <span>//</span><span>horse</span>

三元运算表达式被划分为
( <span>$arg</span> == 'B' ) ? 'bus' : ( <span>$arg</span> == 'A'<span> ) </span>? 'airplane' : ( <span>$arg</span> == 'T'<span> ) </span>? 'train' : ( <span>$arg</span> == 'C'<span> ) </span>? 'car' : ( <span>$arg</span> == 'H'<span> ) </span>? 'horse' : 'feet' ;

PHP是一種服務器端腳本語言,用於動態網頁開發和服務器端應用程序。 1.PHP是一種解釋型語言,無需編譯,適合快速開發。 2.PHP代碼嵌入HTML中,易於網頁開發。 3.PHP處理服務器端邏輯,生成HTML輸出,支持用戶交互和數據處理。 4.PHP可與數據庫交互,處理表單提交,執行服務器端任務。

PHP在過去幾十年中塑造了網絡,並將繼續在Web開發中扮演重要角色。 1)PHP起源於1994年,因其易用性和與MySQL的無縫集成成為開發者首選。 2)其核心功能包括生成動態內容和與數據庫的集成,使得網站能夠實時更新和個性化展示。 3)PHP的廣泛應用和生態系統推動了其長期影響,但也面臨版本更新和安全性挑戰。 4)近年來的性能改進,如PHP7的發布,使其能與現代語言競爭。 5)未來,PHP需應對容器化、微服務等新挑戰,但其靈活性和活躍社區使其具備適應能力。

PHP的核心優勢包括易於學習、強大的web開發支持、豐富的庫和框架、高性能和可擴展性、跨平台兼容性以及成本效益高。 1)易於學習和使用,適合初學者;2)與web服務器集成好,支持多種數據庫;3)擁有如Laravel等強大框架;4)通過優化可實現高性能;5)支持多種操作系統;6)開源,降低開發成本。

PHP沒有死。 1)PHP社區積極解決性能和安全問題,PHP7.x提升了性能。 2)PHP適合現代Web開發,廣泛用於大型網站。 3)PHP易學且服務器表現出色,但類型系統不如靜態語言嚴格。 4)PHP在內容管理和電商領域仍重要,生態系統不斷進化。 5)通過OPcache和APC等優化性能,使用OOP和設計模式提升代碼質量。

PHP和Python各有優劣,選擇取決於項目需求。 1)PHP適合Web開發,易學,社區資源豐富,但語法不夠現代,性能和安全性需注意。 2)Python適用於數據科學和機器學習,語法簡潔,易學,但執行速度和內存管理有瓶頸。

PHP用於構建動態網站,其核心功能包括:1.生成動態內容,通過與數據庫對接實時生成網頁;2.處理用戶交互和表單提交,驗證輸入並響應操作;3.管理會話和用戶認證,提供個性化體驗;4.優化性能和遵循最佳實踐,提升網站效率和安全性。

PHP在數據庫操作和服務器端邏輯處理中使用MySQLi和PDO擴展進行數據庫交互,並通過會話管理等功能處理服務器端邏輯。 1)使用MySQLi或PDO連接數據庫,執行SQL查詢。 2)通過會話管理等功能處理HTTP請求和用戶狀態。 3)使用事務確保數據庫操作的原子性。 4)防止SQL注入,使用異常處理和關閉連接來調試。 5)通過索引和緩存優化性能,編寫可讀性高的代碼並進行錯誤處理。

在PHP中使用預處理語句和PDO可以有效防範SQL注入攻擊。 1)使用PDO連接數據庫並設置錯誤模式。 2)通過prepare方法創建預處理語句,使用佔位符和execute方法傳遞數據。 3)處理查詢結果並確保代碼的安全性和性能。


熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

Atom編輯器mac版下載
最受歡迎的的開源編輯器

EditPlus 中文破解版
體積小,語法高亮,不支援程式碼提示功能

PhpStorm Mac 版本
最新(2018.2.1 )專業的PHP整合開發工具

WebStorm Mac版
好用的JavaScript開發工具