当前位置: 首页 > 面试题库 >

为什么要在PHP中使用按位/位掩码?

金烨华
2023-03-14
问题内容

我正在使用PHP的用户角色/权限系统来编写脚本。

下面是使用位掩码方法获得phpbuilder.com权限的代码。

在该部分下面是一个简单得多的版本,w3hich可以在几乎没有该部分的情况下完成相同的操作。

许多人建议使用位运算符,例如PHP中的设置和其他内容,但我从来不明白为什么。在下面的代码中,使用第一个代码而不是第二个代码有什么 好处

<?php
/**
 * Correct the variables stored in array.
 * @param    integer    $mask Integer of the bit
 * @return    array
 */
function bitMask($mask = 0) {
    $return = array();
    while ($mask > 0) {
        for($i = 0, $n = 0; $i <= $mask; $i = 1 * pow(2, $n), $n++) {
            $end = $i;
        }
        $return[] = $end;
        $mask = $mask - $end;
    }
    sort($return);
    return $return;
}


define('PERMISSION_DENIED', 0);
define('PERMISSION_READ', 1);
define('PERMISSION_ADD',  2);
define('PERMISSION_UPDATE', 4);
define('PERMISSION_DELETE', 8);

//run function
// this value would be pulled from a user's setting mysql table
$_ARR_permission = bitMask('5');

if(in_array(PERMISSION_READ, $_ARR_permission)) {
    echo 'Access granted.';
}else {
    echo 'Access denied.';
}
?>

非位版本

<?PHP
/*
   NON bitwise method
*/

// this value would be pulled from a user's setting mysql table
$user_permission_level = 4;

if($user_permission_level === 4) {
    echo 'Access granted.';
}else {
    echo 'Access denied.';
}

?>

问题答案:

为什么不这样做呢?

define('PERMISSION_DENIED', 0);
define('PERMISSION_READ', 1);
define('PERMISSION_ADD',  2);
define('PERMISSION_UPDATE', 4);
define('PERMISSION_DELETE', 8);

//run function
// this value would be pulled from a user's setting mysql table
$_ARR_permission = 5;

if($_ARR_permission & PERMISSION_READ) {
    echo 'Access granted.';
}else {
    echo 'Access denied.';
}

如果您使用位,还可以创建许多权限的任意组合…

$read_only = PERMISSION_READ;
$read_delete = PERMISSION_READ | PERMISSION_DELETE;
$full_rights = PERMISSION_DENIED | PERMISSION_READ | PERMISSION_ADD | PERMISSION_UPDATE | PERMISSION_DELETE;

//manipulating permissions is easy...
$myrights = PERMISSION_READ;
$myrights |= PERMISSION_UPDATE;    // add Update permission to my rights


 类似资料:
  • 问题内容: 位和位掩码是我一直在努力理解的东西,但是我想学习如何在PHP中使用它们进行设置和类似操作。 我终于找到了一个声称完全可以做到这一点的类,而且据我所知,它似乎可以工作,但是我不确定这是否是实现此目的的最佳方法。我将使用下面的示例代码发布类文件,以按工作顺序显示它。 如果您有经验,请告诉我是否可以改进,性能或其他方面。我真的很想学习这一点,而且我一直在阅读它,但是到目前为止,这对我来说很难

  • 问题内容: 我有传入的数据,这些数据存储在一个变量中: 变量采用JSON格式。然后我执行这个: 在大多数情况下,这是可行的。我时不时地收到以下错误消息: 然后,该错误消息指向该行 什么是八位位组? 为什么JSON文本必须至少包含两个八位字节? 如何防止我的代码每次没有两个八位位组时都被破坏? 谢谢! 问题答案: 一个八位位组是一组8位。今天,八位位组与字节同义,但是字节在历史上是指任何“本机”位组

  • 问题内容: 我很好奇,将框架与PHP一起使用有什么优缺点? 从版本3开始,我一直在使用PHP。无论如何,我从未使用过任何可用于PHP的框架,所以我错过了什么? 问题答案: 框架使您从低级详细信息中抽象出来,使您的工作效率更高,并保护您免受低级错误(例如防止SQL注入攻击)的侵害。 一个好的PHP框架会迫使您分离您的关注点并实现经过验证的体系结构,从而最终改善您的设计,并使您的代码更易于阅读和维护以

  • 我试图找到/创建一个位旋转算法,该算法在-bit-count位掩码中生成s的所有

  • 因此,该资源(http://www . IBM . com/developer works/Java/library/j-jtp 05236/index . html)建议,当线程本身不处理中断时,在线程中设置中断位,“以便调用堆栈中更高层的代码可以了解到中断,并在需要时做出响应。” 假设我正在使用执行器服务在不同的线程中运行某些内容。我构造了一个可调用的,并将这个可调用传递给执行器服务.subm

  • 问题内容: public int add(int a, int b){ while (b != 0){ int carry = (a & b) ; 这是使用按位运算来计算两个整数之和的代码。 如果我手动/编程计算,我会看到它适用于每个整数。但是我无法弄清楚和之间的中间值之间的任何关系。为什么将进位乘以2分配给? PS:我在Java中找到了一个按位乘法和 加法的答案,但这是乘法而不是加法。 问题答案