gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区

站長資訊網(wǎng)
最全最豐富的資訊網(wǎng)站

PHP學(xué)習(xí)中實(shí)用的知識(shí)點(diǎn)和坑分享

本篇文章給大家分享一些 PHP 中有用的知識(shí)和坑。有一定的參考價(jià)值,有需要的朋友可以參考一下,希望對(duì)大家有所幫助。

PHP學(xué)習(xí)中實(shí)用的知識(shí)點(diǎn)和坑分享

在一次偶然查看 PHP 文檔的時(shí)候,發(fā)現(xiàn)了一些有趣的內(nèi)容,隨著閱讀的增加,越發(fā)覺得有趣的內(nèi)容或者說時(shí)坑越來越多,所以我決定記錄下來,分享出去,下文中一些內(nèi)容摘錄自一些優(yōu)秀的博客、PHP 文檔的用戶筆記,或者文檔原文。

尤其是文檔原文,我發(fā)現(xiàn)很多人不會(huì)去讀,很多東西也不會(huì)去注意(是的,我也是這樣,所以借著這次機(jī)會(huì),一起來學(xué)習(xí)一下。)

我忘了PHP函數(shù)的參數(shù)順序,它們是隨機(jī)的嗎?

PHP is a glue that brings together hundreds of external libraries, so sometimes this gets messy. However, a simple rule of thumb is as follows:

Array functionparameters are ordered as " needle, haystack" whereas String functionsare the opposite, so " haystack, needle".

譯:數(shù)組相關(guān)方法的參數(shù)順序?yàn)椋竛eedle, haystack」,字符串相關(guān)方法則是相反的 「haystack, needle」,

來源: https://www.php.net/manual/zh/faq.using.php#faq.using.parameterorder

我應(yīng)該如何保存“鹽”?

當(dāng)使用 password_hash() 或者 crypt() 函數(shù)時(shí), “鹽”會(huì)被作為生成的散列值的一部分返回。 你可以直接把完整的返回值存儲(chǔ)到數(shù)據(jù)庫中, 因?yàn)檫@個(gè)返回值中已經(jīng)包含了足夠的信息, 可以直接用在 password_verify() 或 crypt() 函數(shù)來進(jìn)行密碼驗(yàn)證。

下圖展示了 crypt() 或 password_hash() 函數(shù)返回值的結(jié)構(gòu)。 如你所見,算法的信息以及“鹽”都已經(jīng)包含在返回值中, 在后續(xù)的密碼驗(yàn)證中將會(huì)用到這些信息。

來源: https://www.php.net/manual/zh/faq.passwords.php#faq.password.storing-salts

下面代碼怎么沒有分成兩行顯示?

<pre> <?php echo "This should be the first line."; ?> <?php echo "This should show up after the new line above."; ?> </pre>

在 PHP 中,一段代碼的結(jié)束標(biāo)記要么是“?>”要么是“?>n”(n 表示換行)。因此在上面的例子中,輸出的句子將顯示在同一行中,因?yàn)?PHP 忽略了代碼結(jié)束標(biāo)記后面的換行。這意味著如果要輸出一個(gè)換行符,需要在每段 PHP 代碼的結(jié)束標(biāo)記后面多加一個(gè)換行。

PHP 為什么這么做呢?因?yàn)樵诟袷交5?HTML 時(shí),這樣通常會(huì)更容易。假如輸出了換行而你不需要這個(gè)換行時(shí),就不得不用一個(gè)非常長的行來達(dá)到這樣的效果,或者讓產(chǎn)生的 HTML 頁面的源文件的格式很難讀。

來源: https://www.php.net/manual/zh/faq.using.php#faq.using.newlines

字符串連接操作符的優(yōu)先級(jí)問題

如果你運(yùn)行下面的代碼,他將會(huì)輸出一個(gè)警告和結(jié)果 3 ,因?yàn)樽址B接操作符 . 和 數(shù)學(xué)運(yùn)算符 +- 的優(yōu)先級(jí)時(shí)一樣的,它們將從左往右執(zhí)行。 Result: 會(huì)被強(qiáng)轉(zhuǎn)成數(shù)組 0 。如果你在低版本的 PHP 中運(yùn)行,會(huì)告訴你 中邊不是一個(gè)數(shù)字,如果你在 7.4 中運(yùn)行,會(huì)告訴你,在 PHP 8 中 +- 的優(yōu)先級(jí)將會(huì)被提高。如果你使用了 PHPSTORM 中的 EA 插件,將會(huì)提醒你這個(gè)問題。

<php $var = 3;  echo "Result: " . $var + 3;

如果你不希望這樣,那么最好使用括號(hào)把它包裹起來,就像下面那樣。

<?php $var = 3;  echo "Result: " . ($var + 3);

來源: https://www.php.net/manual/zh/language.operators.string.php#41950

字符串連接操作符與數(shù)字

運(yùn)行下面代碼,尤其是第三行,請(qǐng)注意,如果 . 左右存在空格,那么即使是一個(gè)數(shù)字,也將會(huì)作用成字符串連接。

<?php  echo "thr"."ee";           //prints the string "three" echo "twe" . "lve";        //prints the string "twelve" echo 1 . 2;                //prints the string "12" echo 1.2;                  //prints the number 1.2 echo 1+2;                  //prints the number 3

來源: https://www.php.net/manual/zh/language.operators.string.php#41950

使用 http_build_query

NULL 的值將會(huì)被會(huì)略

<?php $arr = array('test' => null, 'test2' => 1);  // test2=1 echo http_build_query($arr);

來源: https://www.php.net/manual/zh/function.http-build-query.php#60523

True 和 False 將會(huì)被轉(zhuǎn)換成數(shù)字

<?php $a = [teste1= true,teste2=false]; // teste1=1&teste2=0 echo http_build_query($a)

來源: https://www.php.net/manual/zh/function.http-build-query.php#122232

空的數(shù)組不會(huì)出現(xiàn)在結(jié)果中

<?php  $post_data = array('name'=>'miller', 'address'=>array('address_lines'=>array()), 'age'=>23); // name=miller&age=23 echo http_build_query($post_data);

來源: https://www.php.net/manual/zh/function.http-build-query.php#109466

簡述 OpCache 的原理

PHP執(zhí)行這段代碼會(huì)經(jīng)過如下4個(gè)步驟(確切的來說,應(yīng)該是PHP的語言引擎Zend)

  • 1. Scanning(Lexing) ,將PHP代碼轉(zhuǎn)換為語言片段(Tokens)
  • 2. Parsing, 將Tokens轉(zhuǎn)換成簡單而有意義的表達(dá)式
  • 3. Compilation, 將表達(dá)式編譯成Opocdes
  • 4. Execution, 順次執(zhí)行Opcodes,每次一條,從而實(shí)現(xiàn)PHP腳本的功能。

現(xiàn)在有的Cache比如APC,可以使得PHP緩存住Opcodes,這樣,每次有請(qǐng)求來臨的時(shí)候,就不需要重復(fù)執(zhí)行前面3步,從而能大幅的提高PHP的執(zhí)行速度。

來源: https://www.laruence.com/2008/06/18/221.html

var_dump(1…9)輸出什么?

<?php  // 10.9 var_dump(1...9);

輸出10.9, 乍一看這個(gè)var_dump的輸出很奇怪是不是? 為什么呢?

這里教大家,如果看到一段PHP代碼感覺輸出很奇怪,第一反應(yīng)是看下這段代碼生成的opcodes是啥,雖然這個(gè)問題其實(shí)是詞法分析階段的問題,不過還是用phpdbg分析下吧(一般為了防止opcache的影響,會(huì)傳遞-n):

phpdbg -n -p /tmp/1.php function name: (null) L1-35 {main}() /tmp/1.php - 0x7f56d1a63460 + 4 ops L2 #0 INIT_FCALL<1> 96 "var_dump" L2 #1 SEND_VAL "10.9" 1 L2 #2 DO_ICALL L35 #3 RETURN<-1> 1

所以這么看來,早在生成opcode之前,1…9就變成了常量10.9,考慮到這是字面量,我們現(xiàn)在去看看zend_language_scanner.l, 找到這么一行:

DNUM ({LNUM}?"."{LNUM})|({LNUM}"."{LNUM}?)

這個(gè)是詞法分析定義的浮點(diǎn)數(shù)的格式,到這里也就恍然大悟了:
1…9 會(huì)被依次接受為: 1. (浮點(diǎn)數(shù)1), 然后是 . (字符串連接符號(hào)) 然后是.9(浮點(diǎn)數(shù)0.9)

所以在編譯階段就會(huì)直接生成 “1” . “0.9” -> 字符串的字面量”10.9”

來源: https://www.laruence.com/2020/02/23/1990.html

HTTPOXY 漏洞

這里有一個(gè)核心的背景是, 長久一來我們習(xí)慣了使用一個(gè)名為"http_proxy"的環(huán)境變量來設(shè)置我們的請(qǐng)求代理。

http_proxy=127.0.0.1:9999 wget http://www.laruence.com/

如何形成?

在CGI(RFC 3875)的模式的時(shí)候, 會(huì)把請(qǐng)求中的Header, 加上HTTP_ 前綴, 注冊(cè)為環(huán)境變量, 所以如果你在Header中發(fā)送一個(gè)Proxy:xxxxxx, 那么 PHP 就會(huì)把他注冊(cè)為HTTP_PROXY環(huán)境變量, 于是getenv("HTTP_PROXY")就變成可被控制的了. 那么如果你的所有類似的請(qǐng)求, 都會(huì)被代理到攻擊者想要的地址,之后攻擊者就可以偽造,監(jiān)聽,篡改你的請(qǐng)求了

如何影響?

所以, 這個(gè)漏洞要影響你, 有幾個(gè)核心前提是:

  • 你的服務(wù)會(huì)對(duì)外請(qǐng)求資源
  • 你的服務(wù)使用了HTTP_PROXY(大寫的)環(huán)境變量來代理你的請(qǐng)求(可能是你自己寫,或是使用一些有缺陷的類庫)
  • 你的服務(wù)跑在PHP的CGI模式下(cgi, php-fpm)

如何處理?

以Nginx為例, 在配置中加入:

fastcgi_param HTTP_PROXY "";

所以建議, 即使你不受此次漏洞影響, 也應(yīng)該加入這個(gè)配置.
而如果你是一個(gè)類庫的作者,或者你因?yàn)槭裁丛驔]有辦法修改服務(wù)配置, 那么你就需要在代碼中加入對(duì)sapi的判斷, 除非是cli模式, 否則永遠(yuǎn)不要相信http_proxy環(huán)境變量,

<?php if (php_sapi_name() == 'cli' && getenv('HTTP_PROXY')) {   //只有CLI模式下, HTTP_PROXY環(huán)境變量才是可控的 }

補(bǔ)充: 從PHP5.5.38開始, getenv增加了第二個(gè)參數(shù), local_only = false, 如果這個(gè)參數(shù)為true, 則只會(huì)從系統(tǒng)本地的環(huán)境變量表中獲取, 從而修復(fù)這個(gè)問題, 并且默認(rèn)的PHP將攔截HTTP_PROXY:fix

HTTPOXY漏洞說明 – 風(fēng)雪之隅
https://www.laruence.com/2016/07/19/3101.html

運(yùn)算符優(yōu)先級(jí)

&& 和 and 在賦值運(yùn)算中的問題

運(yùn)行下面的代碼,第一個(gè) $bool 將打印為 false ,預(yù)期如此,但是第二個(gè) $bool 將打印 true 。這是因?yàn)?= 的優(yōu)先級(jí)高于 and 運(yùn)算符,所以,第二個(gè) $bool 將會(huì)被當(dāng)成 ($bool = true) and false 執(zhí)行。

<?php  $bool = true && false; // false var_dump($bool);   $bool = true and false; // true var_dump($bool);

來源: https://www.php.net/manual/zh/language.operators.precedence.php#117390

instanceof 運(yùn)算符

你是否曾經(jīng)寫過下面這樣的代碼?

<?php  class A {  }  $A = new A();  var_dump((! $A instanceof A));  // 其實(shí)不用擔(dān)心,因?yàn)?instanceof 的優(yōu)先級(jí)要高于 ! ,你可以放心的使用, // 不必添加括號(hào),讓他們看起來是一個(gè)表達(dá)式,但是在復(fù)雜的情況下例外。 var_dump(! $A instanceof A);

在你需要對(duì) instanceof 運(yùn)算的結(jié)果做取反運(yùn)算時(shí),因?yàn)槿》催\(yùn)算符 ! 的優(yōu)先級(jí)低于 instanceof 所以,你不必再它們外面再加上一個(gè)圓括號(hào)來表明這是一組表達(dá)式,但是再復(fù)雜情況下例外。

array_map 的有趣用法

通常,我會(huì)使用 array_map 來處理一個(gè)數(shù)組,讓他返回一個(gè)新的數(shù)組,當(dāng)然,它的用處就是這樣的,但是除了這種基礎(chǔ)的用法,它其實(shí)還有一些有趣的用法,并且,這些用法都存在于 PHP 的手冊(cè)中。

多個(gè) array 用法

通常你會(huì)這樣使用它。

<?php  $arr1 = ['apple', 'orange', 'mango', 'pear']; $newArr1 = array_map('strtoupper',$arr1);

這只是一個(gè)簡單的,它會(huì)把所有的值轉(zhuǎn)為大寫的。那么看看下面的用法,猜猜會(huì)打印什么?

<?php  $arr1 = ['apple', 'orange', 'mango', 'pear']; $arr2 = ['cauliflower', 'lettuce', 'kale', 'romaine'];  function map1($a, $b){     var_dump($a, $b);   // apple   cauliflower   // orange  lettuce   // mango   kale   // pear    romaine }  array_map('map1', $arr1, $arr2);

如上 map1 方法所示,將會(huì)順序遍歷 $arr1 , $arr2 中的值,并且傳遞給 map1 ,根據(jù)手冊(cè)所定義: 如果多個(gè)數(shù)組的長度不一,即短的數(shù)組將會(huì)被填充空,至長的數(shù)組一樣

原生函數(shù)使用不當(dāng)?shù)脑挄?huì)比你想象的要慢

array_unique、array_merge 等,如果使用方法不正確,會(huì)比你想想的要慢,甚至是慢很多,遠(yuǎn)不如 foreach。

在下面這個(gè)回答中,列舉了 PHP 中一些 array_* 方法的時(shí)間復(fù)雜度
performance – List of Big-O for PHP functions – Stack Overflow

小心代碼中的比較

下面的比較將會(huì)返回 true,是不是不敢相信?

因?yàn)閮蓚€(gè) md5 值都有開始'0e',所以PHP類型理解這些字符串是科學(xué)符號(hào)。根據(jù)定義,0 的任何次方都是 0,所以在這里會(huì)成立?,所以當(dāng)你確定一個(gè)變量的類型時(shí),你最好使用 ===(恒等于)進(jìn)行比較。

<?php  $a = md5('240610708');// 0e462097431906509019562988736854 $b = md5('QNKCDZO'); // 0e830400451993494058024219903391  var_dump($a == $b); // true

注意,當(dāng)你在考慮使用 md5 存儲(chǔ)密碼時(shí),你應(yīng)該放棄這個(gè)想法,應(yīng)該改用為 password_hash 系列方法。

來自:https://www.php.net/manual/zh/function.md5.php#123392

禁用 PHP 中不安全的 eval 方法

眾所周知, 在 php 中,eval 方法可以執(zhí)行任意 PHP 代碼,如果沒有做好處理,被用戶利用了, 就有可能會(huì)造成安全漏洞,所以最好想辦法禁用它,談到禁用 php 函數(shù),你應(yīng)該想到了 php.ini 中的 disable_functions參數(shù),可以用來禁用 PHP 函數(shù),一些集成環(huán)境中也會(huì)禁用一些高風(fēng)險(xiǎn)函數(shù)來降低風(fēng)險(xiǎn)。

但是,這個(gè)配置項(xiàng),卻禁用不了 eval 函數(shù),因?yàn)楦鶕?jù)官方文檔的定義, eval 不是一個(gè)函數(shù),他如同 echo 、這些特殊方法一樣,他是一個(gè)語法結(jié)構(gòu),所以不能使用 disable_functions進(jìn)行禁用,除此之外,還有 require、list、array、print、unset、include、isset、empty 、die、exit 等,這些都是語法結(jié)構(gòu),不是函數(shù),如果你使用 function_exists判斷,他們都會(huì)返回 false

如果你真的需要禁用 eval ,你得安裝一些第三方擴(kuò)展來實(shí)現(xiàn),比如 mk-j/PHP_diseval_extension

參考:https://www.php.net/manual/zh/functions.variable-functions.php#functions.variable-functions

將任意類型轉(zhuǎn)換為 null

聽起來沒什么用但是你確實(shí)可以這樣做。

<?php  $a = 'Hi!'; // 在 PHP 7.2 以下,這行代碼會(huì)返回 null,7.2 ~ 7.4 會(huì)返回 NULL,但是會(huì)提示被遺棄, // 8.0 開始,將不再支持 var_dump((unset)$a); var_dump($a);

除此之外,你還可以用 settype 函數(shù)
參考:https://www.php.net/settype

參考:https://www.php.net/manual/zh/function.unset.php#example-5601

isset 和 unset 同時(shí)支持多個(gè)參數(shù)

unset 支持多個(gè)參數(shù),想必大多數(shù)人是知道的,但是 isset 也支持喲。

<?php  var_dump(isset($a, $b, $c));  unset($a, $b, $c);

你不需要擔(dān)心這幾個(gè)變量沒有被設(shè)置,他們?cè)谶@里都是安全的,不會(huì)報(bào)錯(cuò),在 isset 多個(gè)變量時(shí),必須要所有變量都不為 null時(shí),才會(huì)返回 true,當(dāng)遇到一個(gè)不存在時(shí),將會(huì)立即返回。

參考:https://www.php.net/isset

快速查詢一個(gè)函數(shù)或者類或語法的參考

當(dāng)你要查詢一個(gè) php 方法或者對(duì)象或者語法時(shí),你不需要打開 php 手冊(cè)進(jìn)行搜索,你只需要在 https://php.net/<keyword>后面跟上方法、語法、對(duì)象的名字即可,并且不需要關(guān)心大小i額,比如像下面這些鏈接。

  • https://php.net/curlfile
  • https://php.net/isset
  • https://php.net/if

使用反射調(diào)用 protected 或者 private 的類方法

如果想避免一個(gè)方法被外部可見或者子類可見,可以采用 protected 或者 private 關(guān)鍵字來修改這些類,但是我們有時(shí)候又想在外部調(diào)用這些方法,應(yīng)該怎么辦呢?只能改成 public 嗎?如果這是我們自己的代碼,當(dāng)然可以這樣做,但是如果是引入的外部代碼的話,可能就不太好直接修改了。

現(xiàn)在,我們可以在外部使用 反射 來調(diào)用這些方法,現(xiàn)在我們來定義一個(gè) Lisa 類

<?php  class Lisa {     public function name()     {         return 'Lisa';     }      protected function age()     {         return 22;     }      private function weight()     {         return 95;     }        private static function eat(){         return 1;     } }

通常情況下,我們是沒有辦法直接調(diào)用 age 和 weight 方法的,現(xiàn)在,我們使用反射來調(diào)用。

<?php // ... $reflectionClass = new ReflectionClass('Lisa'); $ageMethod = $reflectionClass->getMethod('age'); // 獲取 age 方法 $ageMethod->setAccessible(true); // 設(shè)置可見性 // 調(diào)用這個(gè)方法,需要傳入對(duì)象作為上下文 $age = $ageMethod->invoke($reflectionClass->newInstance()); var_dump($age);// 22

上面的代碼看起來有些繁瑣,還有一個(gè)更簡單的辦法。

<?php // ... $reflectionClass = new ReflectionClass('Lisa'); $weightMethod = $reflectionClass->getMethod('weight');// 獲取 weight 方法 // 獲取一個(gè)閉包,然后調(diào)用,同樣需要傳入對(duì)象作為上下文,后面調(diào)用的地方就可以傳入?yún)?shù) $weight = $weightMethod->getClosure($reflectionClass->newInstance())(); var_dump($weight);

調(diào)用靜態(tài)方法

<?php // ... $reflectionClass = new ReflectionClass('Lisa'); $eatMethod = $reflectionClass->getMethod('eat'); $eatMethod->setAccessible(true); $eat = $eatMethod->invoke(null); // 如果是一個(gè)靜態(tài)方法,你可以傳遞一個(gè) null var_dump($eat);

同樣,類成員也可以使用反射進(jìn)行修改。
參考: https://www.php.net/manual/zh/class.reflectionproperty.php

實(shí)例化一個(gè)類,但是繞過他的構(gòu)造方法

有沒有這樣想過?實(shí)例化一個(gè)類,但是卻不想調(diào)用他的構(gòu)造方法(__construct),這里也可以用反射做到。

<?php  class Dog {     private $name;      public function __construct($name)     {         $this->name = $name;     }      public function getName()     {         return $this->name;     } }  $dogClass = new ReflectionClass('Dog'); // 創(chuàng)建一個(gè)新實(shí)例,但是不調(diào)用構(gòu)造方法 $dogInstance = $dogClass->newInstanceWithoutConstructor(); var_dump($dogInstance->getName()); // null

如果你的環(huán)境不能使用反射,你還可以試試另一個(gè)很 cool 的方法,就是使用反序列化,可以參考包 doctrine/instantiator – Packagist

參考: https://www.php.net/manual/zh/reflectionclass.newinstancewithoutconstructor.php

獲取類一個(gè)類的所有父類

使用 class_parents可以獲取一個(gè)類的所有父類,并且支持自動(dòng)加載。

<?php  class A{} class B extends A{} class C extends B{} class D extends C{}  var_dump(class_parents('D')); /* array(3) {   'C' =>   string(1) "C"   'B' =>   string(1) "B"   'A' =>   string(1) "A" } */

參考:https://www.php.net/manual/zh/function.class-parents.php

有趣的遞增和遞減

遞增遞減不能作用域 bool 值

遞增、遞減不能使用在 false 上面,但是 +=-= 可以

<?php  $a = false;  ++$a;  var_dump($a);// false  $a++;  var_dump($a);// false  --$a;  var_dump($a);// false  $a--;  var_dump($a);// false  $a-= 1;  var_dump($a);// -1  $a+= 1;// 因?yàn)榍懊娓淖兞耍兂闪?-1,所以下面是 0 ,請(qǐng)不要在這里疑惑  var_dump($a);// 0

遞增可以作用域 NULL,但是遞減不可以

<?php  $a = null; ++$a; var_dump($a); //1  $a = null; --$a; var_dump($a); // null

遞增可以作用于字母,但是遞減不可以

a-y 遞增時(shí)字母都將向后增加一個(gè),但是當(dāng) z 的時(shí)候,就將會(huì)回到 aa ,循環(huán)如此,但是只能遞增,不能遞減

<?php  $a = 'a'; ++$a; var_dump($a); // b  $a = 'z'; ++$a; var_dump($a); // aa  $a = 'A'; ++$a; var_dump($a); // B  $a = 'Z'; ++$a; var_dump($a); // AA

混合遞增數(shù)字和字母

現(xiàn)在你還可以把字母和數(shù)字混合起來,就像這樣:

>>> $a = 'A1' => "A1" >>> ++$a => "A2" >>> ++$a => "A3" >>> $a = '001A' => "001A" >>> ++$a => "001B" >>> ++$a => "001C" >>> $a = 'A001' => "A001" >>> ++$a => "A002" >>> ++$a => "A003"

但是請(qǐng)注意一些意外情況,比如這樣。

>>> $a = '9E0' => "9E0" >>> ++$a => 10.0

這是因?yàn)?E0 被當(dāng)作成了浮點(diǎn)數(shù)的字符串表示,被 PHP 當(dāng)成了 9*10^0 ,被評(píng)估成了 9 ,然后在執(zhí)行的遞增。

參考來源: https://www.php.net/manual/zh…

請(qǐng)注意你的嵌套強(qiáng)制類型轉(zhuǎn)換,否則他會(huì)發(fā)生意外

<?php  var_dump(TRUE === (boolean) (array) (int) FALSE);// true  var_dump((array) (int) FALSE);

因?yàn)楫?dāng)把 FALSE 轉(zhuǎn)為數(shù)字是,他是 0,再轉(zhuǎn)為數(shù)組后,就成了,[0],所以再轉(zhuǎn)為 boolean 時(shí),將會(huì)返回 true,因?yàn)閿?shù)組不為空,并且 [0] != []

參考:https://www.php.net/manual/zh/language.types.type-juggling.php#115373

高版本中的數(shù)字與字符串進(jìn)行比較

自 PHP 8.0 開始。

數(shù)字與非數(shù)字形式的字符串之間的非嚴(yán)格比較現(xiàn)在將首先將數(shù)字轉(zhuǎn)為字符串,然后比較這兩個(gè)字符串。 數(shù)字與數(shù)字形式的字符串之間的比較仍然像之前那樣進(jìn)行。 請(qǐng)注意,這意味著 0 == "not-a-number" 現(xiàn)在將被認(rèn)為是 false 。

Comparison Before After
0 == "0" true true
0 == "0.0" true true
0 == "foo" true false
0 == "" true false
42 == " 42" true true
42 == "42foo" true false

參考:https://www.php.net/manual/zh/migration80.incompatible.php#migration80.incompatible.core

數(shù)組也可以直接比較

你可以直接使用 == 比較兩個(gè)數(shù)組有相同的鍵值對(duì),如果這不是一個(gè)關(guān)聯(lián)數(shù)組,那么就要保證值的順序相對(duì)應(yīng),如果時(shí)一個(gè)關(guān)聯(lián)數(shù)組,你就可以不用擔(dān)心。

>>> $b = [1,2,3,4] => [      1,      2,      3,      4,    ] >>> $a = [1,2,3,4] => [      1,      2,      3,      4,    ] >>> $a == $b => true  // 注意,他不會(huì)比較類型。  >>> $a = [0,1,2,3,4] => [      0,      1,      2,      3,      4,    ] >>> $b = [false,1,2,3,4] => [      false,      1,      2,      3,      4,    ] >>> $a == $b => true  // 如果你要比較類型,你應(yīng)該使用 ===  >>> $a === $b => false

無序的比較:
下面的列表中,使用 == 將會(huì)返回 true ,因?yàn)樗麄兊闹凳窍嗟鹊模皇琼樞虿煌侨绻褂?=== 將會(huì)返回類型,因?yàn)?=== 的時(shí)候會(huì)考慮鍵值順序和數(shù)據(jù)類型。

>>> $a = ['name'=>'Jack','sex'=>1,'age'=>18]; => [      "name" => "Jack",      "sex" => 1,      "age" => 18,    ] >>> $b = ['name'=>'Jack','age'=>18,'sex'=>1]; => [      "name" => "Jack",      "age" => 18,      "sex" => 1,    ] >>> $a == $b => true >>> $a === $b => false >>>

來源:PHP: 數(shù)組運(yùn)算符 – Manual

https://www.php.net/manual/zh/language.operators.array.php

合并數(shù)組

數(shù)組還可以相加 (+),用來合并數(shù)組,使用 array_merge 可以合并數(shù)組可以把兩個(gè)數(shù)組相加,想必是都知道的,但是其實(shí) + 號(hào)也可以,雖然都是合并數(shù)組,這兩個(gè)方法各有區(qū)別。+ 更像是替換。

1、使用 array_merge 合并非關(guān)聯(lián)數(shù)組時(shí),不會(huì)過濾重復(fù)項(xiàng)目, + 會(huì)(更像是替換)

>>> $a = [1,2,3] => [      1,      2,      3,    ] >>> $b = [2,3,4] => [      2,      3,      4,    ] >>> array_merge($a,$b) => [      1,      2,      3,      2,      3,      4,    ] >>> $a + $b => [      1,      2,      3,    ]

2、使用 array_merge 合并關(guān)聯(lián)數(shù)組時(shí),如果鍵重復(fù),將會(huì)保留最后一個(gè)數(shù)組的值,而使用 + 將會(huì)保留第一個(gè)鍵下面的值。

>>> $a = ['name'=>'Jack','sex'=>1,'age'=>18]; => [      "name" => "Jack",      "sex" => 1,      "age" => 18,    ] >>> $b = ['name'=>'Jack','age'=>'18','sex'=>'1']; => [      "name" => "Jack",      "age" => "18",      "sex" => "1",    ] >>> array_merge($a, $b) => [      "name" => "Jack",      "sex" => "1",      "age" => "18",    ] >>> $a + $b => [      "name" => "Jack",      "sex" => 1,      "age" => 18,    ]

3、當(dāng)關(guān)聯(lián)數(shù)組中存在數(shù)字鍵時(shí), array_merge 會(huì)重置數(shù)字鍵, + 則不會(huì)

>>> $a = ['name'=>'Jack','sex'=>1,'age'=>18]; => [      "name" => "Jack",      "sex" => 1,      "age" => 18,    ] >>> $b = ['name'=>'Jack','age'=>'18','sex'=>'1','10'=>'hi']; => [      "name" => "Jack",      "age" => "18",      "sex" => "1",      10 => "hi",    ] >>> array_merge($a,$b) => [      "name" => "Jack",      "sex" => "1",      "age" => "18",      // 注意這里      0 => "hi",    ] >>> $a + $b => [      "name" => "Jack",      "sex" => 1,      "age" => 18,      // 注意這里      10 => "hi",    ]

下面用一張圖來概括一下。

PHP學(xué)習(xí)中實(shí)用的知識(shí)點(diǎn)和坑分享

圖片來源:array_merge vs array_replace vs + (plus aka union) in PHP | SOFTonSOFA

結(jié)束

  • 文章中大部分內(nèi)容來自網(wǎng)絡(luò)搜集,我已經(jīng)盡所能去驗(yàn)證其真實(shí)性,但可能部分會(huì)有紕漏,如果有請(qǐng)不吝賜教。
  • 另外,如果文中的內(nèi)容侵犯到了你得權(quán)益,請(qǐng)與我聯(lián)系處理。
  • 你還可以點(diǎn)擊文章中的來源鏈接,了解更詳細(xì)的內(nèi)容。

推薦學(xué)習(xí):《PHP視頻教程》

贊(0)
分享到: 更多 (0)
?
網(wǎng)站地圖   滬ICP備18035694號(hào)-2    滬公網(wǎng)安備31011702889846號(hào)
gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区
国产高清999| 五月天婷婷激情视频| 欧美大黑帍在线播放| 天堂…中文在线最新版在线| 日韩av在线第一页| 国产91色在线观看| 中文字幕精品在线播放| av之家在线观看| 超碰超碰在线观看| 18禁裸男晨勃露j毛免费观看| 国产一区二区三区小说| 欧美 激情 在线| 国产精品久久久久久久99| 国产精品视频网站在线观看 | 亚洲免费成人在线视频| 800av在线免费观看| 成年人黄色片视频| 国产精品av免费观看| 激情综合网俺也去| 日韩精品视频在线观看视频| 日日躁夜夜躁aaaabbbb| 日韩一二区视频| 一级做a免费视频| 日韩免费视频播放| 日本一二三四区视频| 免费毛片小视频| 亚洲国产一二三精品无码 | 久久综合久久色| a级网站在线观看| 精品少妇无遮挡毛片| www.国产二区| 北条麻妃亚洲一区| 久久久久久久久久久福利| wwwjizzjizzcom| 亚洲综合123| 日韩一区二区三区久久| 国产一区亚洲二区三区| 青草视频在线观看视频| 精品国产无码在线| 日韩在线不卡一区| 天天色综合天天色| 久久人妻精品白浆国产 | 三年中国国语在线播放免费| 僵尸世界大战2 在线播放| 欧美xxxx吸乳| 国产手机视频在线观看| 欧美日韩中文不卡| 日本特黄a级片| 中文久久久久久| 色片在线免费观看| www.cao超碰| 中文字幕在线导航| 熟妇人妻va精品中文字幕| 丰满人妻中伦妇伦精品app| 久久久久久久午夜| 欧美图片激情小说| 久久精品视频16| 免费在线激情视频| aⅴ在线免费观看| 免费涩涩18网站入口| 免费看污黄网站| 色91精品久久久久久久久| 在线免费黄色网| 国产四区在线观看| 日韩精品综合在线| 亚洲熟妇无码另类久久久| 欧美亚洲精品一区二区| 无码人妻丰满熟妇区毛片18| 日本男人操女人| 最新免费av网址| 大片在线观看网站免费收看| 真实国产乱子伦对白视频| 久久国产亚洲精品无码| 久久人妻精品白浆国产 | 男女激情无遮挡| 一本久道综合色婷婷五月| 日本黄大片一区二区三区| 国内av免费观看| 国产成人无码a区在线观看视频| 欧美 日韩精品| 天天做天天干天天操| 99精品一区二区三区的区别| 97视频久久久| 欧美日韩中文不卡| 欧美精品久久久久久久自慰 | av片中文字幕| 91精品999| 精品久久一二三| 精品综合久久久久| 国产精品久久中文字幕| 欧美伦理片在线观看| 欧美中日韩在线| 波多野结衣xxxx| 男女视频网站在线观看| 日韩av一卡二卡三卡| 青青草视频在线免费播放| 毛片毛片毛片毛片毛片毛片毛片毛片毛片| 午夜大片在线观看| 少妇高清精品毛片在线视频| 一级淫片在线观看| 日韩在线xxx| 精品无码国产一区二区三区av| 一区二区在线播放视频| 每日在线观看av| dy888午夜| 国产三级国产精品国产专区50| 久久www视频| 亚洲精品国产一区二区三区| 亚洲人成无码网站久久99热国产| 久久久久久久久久久久久久久国产 | 国内自拍视频网| 日韩伦理在线免费观看| 黄瓜视频免费观看在线观看www | 国产免费黄视频| 91看片淫黄大片91| 加勒比av中文字幕| 无限资源日本好片| www.四虎成人| 国产中文字幕免费观看| 日韩一级特黄毛片| 国产日韩欧美大片| 一级黄色大片儿| 日日夜夜精品视频免费观看 | wwwwwxxxx日本| 五月婷婷六月合| 亚洲这里只有精品| 香蕉视频999| 在线观看国产一级片| 婷婷免费在线观看| 国产三级生活片| 日本一二三四区视频| 欧洲在线免费视频| 男女h黄动漫啪啪无遮挡软件| 日本美女视频一区| 手机精品视频在线| 中国女人做爰视频| 日本天堂免费a| 国产成人艳妇aa视频在线 | 亚洲77777| 激情黄色小视频| 欧美与动交zoz0z| 亚洲中文字幕无码一区二区三区| 亚洲熟妇无码av在线播放| 777av视频| 天天干天天爽天天射| 伊人五月天婷婷| 国产夫妻自拍一区| 国产男女无遮挡| 午夜免费看毛片| 欧美国产综合在线| 日韩精品一区二区三区久久| 成人精品视频一区二区| 天天干天天色天天干| 男人j进女人j| 777米奇影视第四色| 国产精品久久久毛片| 99久久99久久精品| 日韩久久一级片| 国产大片一区二区三区| 国产一二三在线视频| 玩弄japan白嫩少妇hd| 最新视频 - x88av| 日韩在线xxx| 男人日女人的bb| 无码内射中文字幕岛国片| 在线视频一二三区| 国产裸体舞一区二区三区| 欧美性受xxxx黒人xyx性爽| 日韩小视频网站| www.亚洲自拍| 欧美日韩激情视频在线观看| 中文 日韩 欧美| 欧美国产日韩在线播放| 欧美日韩dvd| 国产色视频在线播放| 日日摸日日碰夜夜爽无码| 看看黄色一级片| 免费黄色福利视频| 黄色一级片av| 国产女同无遮挡互慰高潮91| 北条麻妃在线视频观看| 欧洲美女和动交zoz0z| 三级a在线观看| 日韩av黄色网址| 波多野结衣av一区二区全免费观看| 欧美男女交配视频| 亚洲午夜精品久久久久久人妖| 爱爱爱视频网站| www.99r| 手机视频在线观看| 久久久久久久久久福利| 美脚丝袜脚交一区二区| 欧美精品久久96人妻无码| 91丨九色丨蝌蚪| 亚洲一级片免费| 网站一区二区三区| 中文字幕一区二区三区四区在线视频| 国产av不卡一区二区| 亚洲欧美天堂在线| 久久婷五月综合|