請教一個小白問題:為什麼php常常用!==false表示真的,為啥不直接用===true?

來源:互聯網
上載者:User
比如下面的代碼:

$str4="php-class,mysql-class,div-css,0,dreamweaver";$s=strtok($str4,',');while($s!==false){    echo $s."
"; $s=strtok(',');}

while($s===true){}為啥就無法顯示呢?
true在什麼地方使用呢~~
初學者 請大家關愛 O(∩_∩)O~
新年開心~

我自己的理解是:!==false 就要滿足1.值不等於 2.類型不等於,當strtok分解結束時返回null(蒙的哈)出現$s=false 使迴圈語句不成立;但如果使用===true時,也要滿足:1.值等於 2.類型等於,那麼第一個被分解的字串都不是布爾值,所以迴圈直接停止,但如果使用'=='那麼遇到'0'時,(不等於true) !=ture,那麼此時迴圈也會停止。
使用!==false,就意味著值不等於,類型也不等於,只有返回false才停止
試了試,貌似對的,但是這麼複雜的邏輯光想就得5分鐘,腦子亂了。。。。。

回複內容:

比如下面的代碼:

$str4="php-class,mysql-class,div-css,0,dreamweaver";$s=strtok($str4,',');while($s!==false){    echo $s."
"; $s=strtok(',');}

while($s===true){}為啥就無法顯示呢?
true在什麼地方使用呢~~
初學者 請大家關愛 O(∩_∩)O~
新年開心~

我自己的理解是:!==false 就要滿足1.值不等於 2.類型不等於,當strtok分解結束時返回null(蒙的哈)出現$s=false 使迴圈語句不成立;但如果使用===true時,也要滿足:1.值等於 2.類型等於,那麼第一個被分解的字串都不是布爾值,所以迴圈直接停止,但如果使用'=='那麼遇到'0'時,(不等於true) !=ture,那麼此時迴圈也會停止。
使用!==false,就意味著值不等於,類型也不等於,只有返回false才停止
試了試,貌似對的,但是這麼複雜的邏輯光想就得5分鐘,腦子亂了。。。。。

PHP 是一門弱類型語言,弱類型語言最重要的原因:隱式類型轉換。

最主要的表現是賦值、計算和比較:
賦值:

$a = 1; // int$a = '1'; // string

上面例子中 $a 的類型是隨著賦值的類型改變而改變的,你肯定知道這在 C 語言中是不行的,因為 C 語言中變數類型都是聲明的時候確定的,確定下來之後就不能改變。

計算:

$a = 1;$b = '2';echo $a + $b; // 結果是 3

類似的代碼在 Python 中也是不行的,你會得到一個這樣的錯誤:

TypeError: unsupported operand type(s) for +: 'int' and 'str'

Python 也是強型別語言,不會對變數的類型進行推斷,所以就直接拋了錯誤給你。但是 PHP 是怎麼做的呢?
Python 中連接字串也是使用 +,但是 PHP 需要用 .。在 PHP 內部,當你使用 + 的時候,符號兩邊的變數都會先被轉換成數字類型(浮點、整型),同理,使用 . 的時候,符號兩邊實際上都會先被轉換成字串。因為 Python 不需要進行轉換,遇到數字計算,遇到字串串連就行了。

這個轉換過程也是很有意思的:

$a = 1;$b = '2';echo $a + $b; // 3$b = 'a2';echo $a + $b; // 1$b = '2a';echo $a + $b; // 3

看到上面你應該已經猜出來了:字串是從前往後搜尋直到遇到一個非數字字元為止。

下面我們來說這裡會遇到的情況:比較。

===== 包括 !=!== 的區別其實你已經猜到了,一個會比較類型,一個不會比較類型。在 PHP 內部的描述中用 equalidentical 這兩個單詞來描述。感受一下區別。

準確的順序是:===!== 是先判斷類型是否一樣,再比較具體的值。如果類型都不一樣,那也沒必要繼續比較了。這意味著即使是 1.0 === 1 得到的也會是 false,因為類型不同。

其實 == 也是要檢查類型的,不過動作卻是:它會先根據操作符兩邊變數類型的情況做出判斷對變數先做隱式的轉換然後再進行比較!這裡我不告訴你轉換的順序,但是基本的一些你應該知道:

0 == false; // true'1' == 1; // truenull == false; // truenull != 'null'; // true

還有你可能不知道的,比如:

123 == '123abc'; // true'0e123' == '0e456'; // true

到這裡這個問題基本上清楚了。因為 '0' == false 是成立的,這就是要用 !== 的原因。

話說回來 strtok 其實本身是個奇怪的函數,這是個內建迭代的函數。如果使用 != 來判斷, 就無法準確的取出 strtok('hello world 0', ' ') 這個分解的第三段 0

http://cn2.php.net/manual/zh/function.strtok.php

有些函數預設傳回值為intstring 類型,只有在失敗的時候才返回false。所以進行判斷的時候使用!==false。比如strtok來說,如果執行結果為期望結果,則返回string否則返回false。so~~

更新一下

再比如 strpos 之類的函數,返回在$str$find在哪個位置,比如 在123中尋找1的位置,那將返回int(0)。只有在未找到的時候,返回false

然而, if (0) 的結果是false,if中的邏輯將不會執行。所以判斷 if ($result !== false) 才是正確的方法。

關於 !==!= =====的判定區別,自己Google一下吧。

'something' !== false 'something' !== true

這兩個運算式都為真

我自己的理解是:!==false 就要滿足1.值不等於 2.類型不等於,當strtok分解結束時返回null(蒙的哈)出現$s=false 使迴圈語句不成立;但如果使用===true時,也要滿足:1.值等於 2.類型等於,那麼第一個被分解的字串都不是布爾值,所以迴圈直接停止,但如果使用'=='那麼遇到'0'時,(不等於true) !=ture,那麼此時迴圈也會停止。
使用!==false,就意味著值不等於,類型也不等於,只有返回false才停止
試了試,貌似對的,但是這麼複雜的邏輯光想就得5分鐘,腦子亂了。。。。。

0 !== false  // true0 === true // false

因為大多數調用,失敗都返回false

成功時返回資源類型 不成功返回false

也許只有在失敗的時候返回false,成功並沒有傳回值。

假如某介面返回的resource類型,你用true怎麼比較?

這個和傳回值有關係啊,如果函數傳回值是true你就可以這麼做啊。。不過就PHP內建函數而言,一般是錯誤返回flase,所以用false來判斷是否出錯。

  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.