1

PHP でのフラグ検出に問題があります。

<?php
class event
{
    const click = 0x1;
    const mouseover = 0x2;
    const mouseenter = 0x4;
    const mouseout = 0x8;
    const mouseleave = 0x16;
    const doubleclick = 0x32;

    public static function resolve($flags)
    {
        $_flags = array();

        if ($flags & self::click) $_flags[] = 'click';
        if ($flags & self::mouseover) $_flags[] = 'mouseover';
        if ($flags & self::mouseenter) $_flags[] = 'mouseenter';
        if ($flags & self::mouseout) $_flags[] = 'mouseout';
        if ($flags & self::mouseleave) $_flags[] = 'mouseleave';

        return $_flags;
    }
}

var_dump(event::resolve(event::click | event::mouseleave));

var_dump(event::resolve(event::mouseleave));

しかし、次のように返されます。

array (size=4)
  0 => string 'click' (length=5)
  1 => string 'mouseover' (length=9)
  2 => string 'mouseenter' (length=10)
  3 => string 'mouseleave' (length=10)


array (size=3)
  0 => string 'mouseover' (length=9)
  1 => string 'mouseenter' (length=10)
  2 => string 'mouseleave' (length=10)

私はビットごとの演算子が初めてなので、その定義に問題がある可能性があります。

これを修正するにはどうすればよいですか?

4

1 に答える 1

5

フラグの値が間違っています。これらは 16 進数の整数リテラルなので、

const click       = 0x01;
const mouseover   = 0x02;
const mouseenter  = 0x04;
const mouseout    = 0x08;
const mouseleave  = 0x10;
const doubleclick = 0x20;
// next values: 0x40, 0x80, 0x100, 0x200, 0x400, 0x800, 0x1000, etc.

0xコードを読む人に誤解を与える可能性がありますが、10 進数 (プレフィックスなし) で指定することもできます。

const click       = 1;
const mouseover   = 2;
const mouseenter  = 4;
const mouseout    = 8;
const mouseleave  = 16;
const doubleclick = 32;
于 2012-11-16T13:55:16.213 に答える