zoukankan      html  css  js  c++  java
  • PHP 位运算(&, |, ^, ~, <<, >>)及 PHP错误级别报告设置(error_reporting) 详解

    位运算符允许对整型数中指定的位进行求值和操作。

    位运算符
    例子名称结果
    $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”)。

    位移在 PHP 中是数学运算。向任何方向移出去的位都被丢弃。左移时右侧以零填充,符号位被移走意味着正负号不被保留。右移时左侧以符号位填充,意味着正负号被保留。

    要用括号确保想要的优先级。例如 $a & $b == true 先进行比较再进行按位与;而 ($a & $b) == true 则先进行按位与再进行比较。

    PHP 的 ini 设定 error_reporting 使用了按位的值,提供了关闭某个位的真实例子。要显示 除了“提示级别”之外 的所有错误,php.ini 中是这样用的:

    E_ALL & ~E_NOTICE   

    具体运作方式是先取得 E_ALL 的值:

    00000000000000000111011111111111

    再取得 E_NOTICE 的值:

    00000000000000000000000000001000

    然后通过 ~ 将其取反:

    11111111111111111111111111110111

    最后再用按位与 AND(&)得到两个值中都设定了(为 1)的位:

    00000000000000000111011111110111

    另外一个方法是用按位异或 XOR(^)来取得只在其中一个值中设定了的位:

    E_ALL ^ E_NOTICE     

    error_reporting 也可用来演示怎样置位。只显示错误和可恢复错误的方法是:

    E_ERROR | E_RECOVERABLE_ERROR     

    也就是将 E_ERROR

    00000000000000000000000000000001

    和 E_RECOVERABLE_ERROR

    00000000000000000001000000000000

    用按位或 OR(|)运算符来取得在任何一个值中被置位的结果:

    00000000000000000001000000000001

    通过 error_reporting() 函数设置不同的错误级别报告:

    <?php
    // 关闭错误报告
    error_reporting(0);
    
    // 报告 runtime 错误
    error_reporting(E_ERROR | E_WARNING | E_PARSE);
    
    // 报告所有错误
    error_reporting(E_ALL);
    
    // 等同 error_reporting(E_ALL);
    ini_set("error_reporting", E_ALL);
    
    // 报告 E_NOTICE 之外的所有错误
    error_reporting(E_ALL & ~E_NOTICE);

    权限模块方面的一个应用举例:

    <?php
    // 权限值:
    $writePost = 1;
    $readPost = 2;
    $deletePost = 4;
    $addUser = 8;
    $deleteUser = 16;
    
    // 用户组
    $administrator = $writePost | $readPosts | $deletePosts | $addUser | $deleteUser;
    $moderator = $readPost | $deletePost | $deleteUser;
    $writer = $writePost | $readPost;
    $guest = $readPost;
    
    // 检查权限函数
    function checkPermission($user, $permission) {
    	if ($user & $permission) {
    		return true;
    	} else {
    		return false;
    	}
    }
    
    // 调用方式
    if (checkPermission($administrator, $deleteUser)) {
    	deleteUser("Some User"); // 这个能执行,因为 $administrator 有 $deleteUser 权限
    }
    

    参考:

    http://php.net/manual/zh/language.operators.bitwise.php

    http://www.w3school.com.cn/php/func_error_reporting.asp

  • 相关阅读:
    边工作边刷题:70天一遍leetcode: day 17-1
    边工作边刷题:70天一遍leetcode: day 17
    边工作边刷题:70天一遍leetcode: day 106
    test
    边工作边刷题:70天一遍leetcode: day 18-2
    边工作边刷题:70天一遍leetcode: day 18-1
    边工作边刷题:70天一遍leetcode: day 18
    边工作边刷题:70天一遍leetcode: day 96
    边工作边刷题:70天一遍leetcode: day 19-2
    边工作边刷题:70天一遍leetcode: day 19-1
  • 原文地址:https://www.cnblogs.com/52php/p/6201686.html
Copyright © 2011-2022 走看看