PHP类常量似乎总是被解释为字符串
类常量似乎总是被解释为字符串,尽管它被定义为整数。为什么PHP会做这种类型的杂耍,我如何防止它 请参阅以下代码:PHP类常量似乎总是被解释为字符串,php,type-conversion,class-constants,Php,Type Conversion,Class Constants,类常量似乎总是被解释为字符串,尽管它被定义为整数。为什么PHP会做这种类型的杂耍,我如何防止它 请参阅以下代码: 类位集{ const NONE=0; 常数FOO=1; 常数棒=2; 常数ALL=3; 公共函数构造($flags=self::NONE){ 如果($flags&self::ALL!==$flags) 抛出新的\OutOfRangeException(“$flags=”。$flags.“超出范围”); $this->value=$flags; } 受保护的$value=self::无
类位集{
const NONE=0;
常数FOO=1;
常数棒=2;
常数ALL=3;
公共函数构造($flags=self::NONE){
如果($flags&self::ALL!==$flags)
抛出新的\OutOfRangeException(“$flags=”。$flags.“超出范围”);
$this->value=$flags;
}
受保护的$value=self::无;
}
$bs=新位集(位集::FOO);
最后一行(构造函数的调用)抛出OutOfRangeException
:
PHP致命错误:未捕获异常“OutOfRangeException”,测试用例中的消息“$flags=1超出范围”。PHP:12
堆栈跟踪:
#0/srv/www/matthiasn/class constant debug.php(19):位集->构造('1')
#1{main}
在第12行的/srv/www/matthiasn/class-constant-debug.php中抛出
从回溯条目#0可以清楚地看到,常量BitSet::FOO
作为字符而不是整数传递。因此,位掩码操作$flags&self::ALL!==$标志
不在整数上执行,而是在按位ASCII表示上执行,因此失败
搞什么鬼?!有没有比执行显式的
(int)
-cast-everywhere更好的方法呢?我不太确定您期望的是什么,但请注意==
的值高于&
,因此您要在1
和true
之间进行位AND运算
你的意思可能是:
if( ($flags & self::ALL) !== $flags )
我不完全确定您的期望,但请注意
==
的值高于&
,因此您要在1
和true
之间进行位AND运算
你的意思可能是:
if( ($flags & self::ALL) !== $flags )
对不起,是我的错,我走错了方向。解决办法是
if( ( $flags & self::ALL ) !== $flags )
添加括号。==代码>运算符的优先级似乎高于&
没有这些偏执,首先是片段self::ALL!==$标志
计算为FALSE
,然后计算$flags&FALSE
PHP是…:-(对不起,是我的错,我走错了方向。解决办法是
if( ( $flags & self::ALL ) !== $flags )
添加括号。!=
运算符的优先级似乎高于&
如果没有这些偏执,首先将代码段self::ALL!=$flags
计算为FALSE
,然后计算$flags&FALSE
PHP是…:-(你不认为如果($flags&
@Uchiha不,这是一个按位AND运算。它的意思是“如果两个操作数中的位都是1,则生成一个位设置为1的值,否则为0”。我不确定堆栈跟踪为什么看起来像这样,但var\u dump将其显示为int:你不认为如果($flags&
@Uchiha否,这是一种按位AND运算。它的意思是“如果两个操作数中的位都是1,则生成一个位设置为1的值,否则为0”。我不知道为什么堆栈跟踪看起来像这样,但var_dump将其显示为int:是的,这是。查看我自己的解决方案。我发现,在发布此问题的半分钟后。PHP是…@user2690527是的,我想这就是问题所在,所以我用答案替换了我的注释。代码的意图对我来说似乎非常清楚。我猜如果你熟记运算符的优先级,代码显然是错的,但很容易出错。是的,就是这样。看看我自己的解决方案。我发现了,在发布了这个问题的半分钟后。PHP是…@user2690527是的,我想这就是问题所在,所以我用答案替换了我的注释。代码的意图似乎是p我很清楚。我想如果你已经记住了操作符的优先级,代码显然是错的,但很容易犯错误。PHP正在…做着与其他语言完全相同的事情。真是太好了,这是语言的错,而不是椅子上的人。因为这显然是它的工作方式。PHP正在…做着与其他语言完全相同的事情就像这里的其他语言一样,这是语言的错,而不是椅子上的那个人的错。因为这显然是它的工作原理。