php位运算错误,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() 函数设置不同的错误级别报告:

// 关闭错误报告

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);

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

// 权限值:

$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 权限

}

参考:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值