PHP Switch 细节:Loose Comparison

tags: 工作後才知道的後端30件小事

可以先思考一下以下的输出的什麽?

<?php

$arr = [
  null,
  0,
  1,
  2,
  3,
  '',
  [],
  [1, 2, 3]
];

foreach ($arr as $value) {
  switch ($value) {
    case null:
      dump('this is null');
      break;
    case 0:
      dump('this is 0');
      break;
    case 1:
      dump('this is 1');
      break;
    case 2:
      dump('this is 2');
      break;
    case 3:
      dump('this is 3');
      break;
    case '':
      dump('this is empty string');
      break;
    case []:
      dump('this is []');
      break;
    case [1, 2, 3]:
      dump('this is [1, 2, 3]');
      break;
  }
}

输出:

"this is null"
"this is null"
"this is 1"
"this is 2"
"this is 3"
"this is null"
"this is null"
"this is [1, 2, 3]"

可以发现居然有 4 个 null!原因是什麽呢?

因为 switch 是 loose comparison,也就是==,而非===
所以到第一个 case 时,$value == null为真时就会进去;而在 PHP,null0''[]null都为真,跟empty()有点像。

loose comparison 的相反是 strict comparsion

能不能让 switch 做 strict comparsion?

答案是不行,但有一些 tricky 的做法

其他 loose comparsion

in_array()预设也是 loose comparsion,但可以透过输入参数去让他做 strict comparsion!

// loose comparsion
in_array($value, $arr);

// strict comparsion
in_array($value, $arr, true);

Reference


<<:  30天零负担轻松学会制作APP介面及设计【DAY 03】

>>:  Day 12:vim 配色方案

[Day 6] -『 GO语言学习笔记』- 值 vs. 指标(pointers)

以下笔记摘录自『 The Go Workshop 』。 值的储存 Go语言采用了一个简单的记忆体管理...

DAY 29 制作表格-为表格上色

为了方便检视这边我挑了6种颜色帮表格上色 cursor = conn.cursor() cursor...

Day25-Kaggle Titanic迈进前5% part(2)

延续昨天的介绍 我们已经处理、介绍过的栏位有:PassengerId、Survived、Name、P...

[Day19] - Django-REST-Framework Viewsets 介绍

在第一个 API 中我们编写的 View,不知道大家有没有觉得非常简洁呢,好像没有写什麽代码,但是就...

Day 3 : Git 回推版本

reset 回推 使用Git的一大好处就是,当我的程序在改动的过程中发生了难以修复的错误,我们可以透...