Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP类常量似乎总是被解释为字符串_Php_Type Conversion_Class Constants - Fatal编程技术网

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::无

类常量似乎总是被解释为字符串,尽管它被定义为整数。为什么PHP会做这种类型的杂耍,我如何防止它

请参阅以下代码:

类位集{
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正在…做着与其他语言完全相同的事情就像这里的其他语言一样,这是语言的错,而不是椅子上的那个人的错。因为这显然是它的工作原理。