php5.6 新增的运算符 **

$a = 3;
$b = 4;
var_dump($a ** $b);

int(81)  # 输出,3的4次方

位运算符

例子 名称 结果
$a & $b And(按位与) 将把 $a 和 $b 中都为 1 的位设为 1。
$a | $b Or(按位或) 将把 $a 和 $b 中任何一个为 1 的位设为 1。
$a ^ $b Xor(按位异或) 将把 $a 和 $b 中一个为 1 另一个为 0 的位设为 1。
~ $a Not(按位取反) 将 $a 中为 0 的位设为 1,反之亦然。
$a << $b Shift left(左移) 将 $a 中的位向左移动 $b 次(每一次移动都表示“乘以 2”)
$a >> $b Shift right(右移) 将 $a 中的位向右移动 $b 次(每一次移动都表示“除以 2”)。

异或:相同为0,不同为1
左移:小数点不动,二进制按位左移(变大)
右移:小数点不动,二进制按位右移(变小)

优先级,布尔值

$a = 3;
$b = 4;

if ($a = 3 || $b = 6){
    $a++;
    ++$b;
}
echo $a, $b;
var_dump($a, $b);

# 输出
1 5 # true 等于1
bool(true) int(5) # 布尔值,不管是++,还是--运算,结果不变

解释:
if语句里面 || 优先级比 = 高,所以先执行 3 || $b = 6,3相当于true,所以不执行 || 右边的内容。
最后把true 赋值给$a, $b 不变。

作用域,静态变量,++先后问题

$count = 5;
function get_count(){
    static $count = 0;
    return $count++;
}
++$count;
get_count();
echo get_count(); # 输出 1

解释:

  1. 函数内部的$count与外部的变量没关系, 第二次调用get_count 的时候,因为函数$count 是静态变量,第二次执行不会初始化为0。
  2. 注意函数内部return $count++,++是在后面,其实返回的还是上次$count的值,所以等于1

count 考擦

$sum = count('123') + count(null) + count(false);

var_dump($sum); # int(1) + int(0) + int(1)

数组key和value的限制条件

key 可以是integer 或者 string
value 可以是任意值

$arr = [
        1 => 'a',
        "1" => 'b',
        1.5 => 'c',
        true => 'd',
        null => 'e',
];
var_dump($arr);

上面除了null转为“”,其它的key都会转成int 1,所以最后覆盖了前面的key
输出

array(2) {
  [1] =>
  string(1) "d"
  '' =>
  string(1) "e"
}

key有如下几个的强制转换

  • 包含合法整型值的字符串会转为整型
  • 浮点数和布尔值也会被转换为整型
  • 键名null实际会别存储为“”
  • 数组和对象不能作为键名
  • 相同键名,之前会被覆盖

类型转换

$arr = array(0=>1, "aa"=>2, 3, 4);
foreach($arr as $key=>$val){
    print($key == "aa" ? 5:$val);
}
# 输出 5534

$key == "aa" ==号运算的时候,如果数据类型不同,会以左边的为主,所以把“aa”转成int类型,等于0