注意细节

语法

?? 判定变量是否定义

$a ?? 0; <=> isset($a) ? $a : 0; 

//  当需要对$a 做运算时
$array[$key] = 0;
if (isset($array[$key])) {
    $array[$key] = $array[$key] * $rate;
}

转义

Array key 会有如下的强制转换

Tip

key 可以是 integer 或者 string。value 可以是任意类型Array 和 object 不能 被用为键名。坚持这么做会导致警告:Illegal offset type。

  • String 中包含有效的十进制 int,除非数字前面有一个 + 号,否则将被转换为 int 类型。例如键名 "8" 实际会被储存为 8。另外, "08" 不会被强制转换,因为它不是一个有效的十进制整数。
  • Float 也会被转换为 int ,意味着其小数部分会被舍去。例如键名 8.7 实际会被储存为 8。
  • Bool 也会被转换成 int。即键名 true 实际会被储存为 1 而键名 false 会被储存为 0。
  • Null 会被转换为空字符串,即键名 null 实际会被储存为 ""。
//  如果在数组定义时多个元素都使用相同键名,那么只有最后一个会被使用,其它的元素都会被覆盖。
$array = array(
    1    => 'a',
    '1'  => 'b', // 值 "a" 会被 "b" 覆盖
    1.5  => 'c', // 值 "b" 会被 "c" 覆盖
    true => 'g', // 值 "c" 会被 "g" 覆盖
    '01'  => 'e', // 由于这不是整数字符串,因此不会覆盖键名 1
    '1.5' => 'f', // 由于这不是整数字符串,因此不会覆盖键名 1

    false => 'h',
    -1 => 'd',

    '' => 'i',
    null => 'j', // 值 "i" 会被 "j" 覆盖

    'k', // 值 "k" 的键名被分配为 2。这是因为之前最大的整数键是 1
    2 => 'l', // 值 "k" 会被 "l" 覆盖
);
print_r($array);
//  输出:
(
    [1] => g
    [01] => e
    [1.5] => f

    [0] => h
    [-1] => d

    [] => j
    
    [2] => l
)

数据类型

  • 数据库读取出来的小数是字符串格式 ‘0.000';

    empty(‘0.000') => false ;

    ‘0.000' > 0 => false;

    ‘0' => true;