Php 类型铸造和与松散操作器的比较==&引用;

Php 类型铸造和与松散操作器的比较==&引用;,php,casting,comparison,twig,type-conversion,Php,Casting,Comparison,Twig,Type Conversion,我有一个问题让我非常困惑。我以前注意到这一点,但直到今天才注意到。 我试图为整数字符串编写自己的检查。我知道是数值的(),但它并不足够,因为它不仅将浮点数计算为数值的整数和是整数(),这对字符串数字不起作用 我做了类似的事情 $var1 = 'string'; $var2 = '123'; var_dump( (int)$var1 == $var1);// boolean true var_dump((int)$var2 == $var2);// boolean true var_d

我有一个问题让我非常困惑。我以前注意到这一点,但直到今天才注意到。 我试图为整数字符串编写自己的检查。我知道
是数值的()
,但它并不足够,因为它不仅将
浮点数
计算为数值的
整数
是整数()
,这对字符串数字不起作用

我做了类似的事情


$var1 = 'string';
$var2 = '123'; 

var_dump( (int)$var1 == $var1);// boolean true 
var_dump((int)$var2 == $var2);// boolean true

 var_dump((int)$var1);//int 0
 var_dump($var1);//string 'string' (length=6)
正如预期的那样,第二个var dump输出true,因为我希望通过php的松散比较,字符串和整数版本是相等的

然而对于第一个,我不明白为什么会这样。我试过用
bool
来施法,结果还是一样的

我已经尝试过将cast变量分配给一个新的variablr,并对两者进行比较,结果仍然相同

这是我做错了还是php错误

***注 我不是在比较类型。我实际上是想利用
int0
不等于
string'string'
这一事实

我以不同的方式编写了整数检查,因此不需要其他方法

***编辑 我做了一些额外的检查,结果表明
0==“string”
也是正确的。这怎么可能

***编辑2
下面有多个问题的正确答案。感谢所有回答的人

如果您也想比较变量的类型,您应该使用
==

这不是错误,而是功能。任何字符串都可以强制转换为整数,但在比较整数和字符串时。由于该规则,几乎所有随机字符串都“等于”零。(要绕过此行为,您应该使用,因为它通过强制转换传递给字符串的任何内容来执行显式字符串比较。)

为了确保我处理的是一个整数,我将首先使用
is_numeric
,然后将字符串转换为
int
,并验证字符串化的int是否与输入值相对应

if (is_numeric($value) && strcmp((int)$value, $value) == 0)
{
    // $value is an integer value represented as a string
}
根据php.net:


因此,我认为它是在处理类型,实际上将两边都转换为int。然后比较ascii值的总和或字符串中每个索引的ascii值。

首先,在数学中,“=”被称为可传递的b/c(A=b和b=c=>A=c)是有效的

PHPs“=”的情况并非如此

在这种情况下,PHP将“string”强制转换为0-这是一种约定

然后==-运算符将隐式地将第二个操作数“string”也强制转换为整数->以及0


这是真的。

您的帖子出错,正确的输出如下:

bool(true)
bool(true)
int(0)
string(6) "string"
结果是:

  • 由于将变量强制转换为整数,并将其与具有松散比较的整数进行比较,PHP将首先将字符串隐式转换为整数,更显式但100%等效的形式是:
    if((int)$var1==(int)$var1)
  • 参见1),这里也适用同样的情况
  • 它应该打印
    int(0)
    ,因为它无法解析数字,它将返回
    0
  • 按预期打印
    字符串(6)“字符串”

  • 这是一个更严格地测试int或整数字符串的函数

    function isIntegerNumeric($val) {
      return (
        is_int($val)
          || (
            !is_float($val)
              && is_numeric($val)
              && strpos($val, ".") === false
          )
      );
    }
    
    它相对较快,如果不需要的话,可以避免进行任何字符串检查

    注意:此答案是对的响应,标记为重复,并在此处重定向

    由于上下文不同,本答案提供给SO社区的成员,这些成员可能受益于与独家相关的其他详细信息

    TL;DR:参见本帖

    问题 上下文
    • 细枝模板引擎(自2017-01-27T05:12:25起的最新版本)
    脚本
    • DeveloperYlohEnrohK在细枝表达式中使用比较运算符
    • DeveloperYlohEnrohK在使用相等比较运算符时注意到意外的结果
    问题
    • 为什么相等比较运算符(
      ==
      )会在细枝中产生意外的结果
    • 为什么下列情况会产生不同的结果

      {{ dump(0 == 'somekey') }} ==> true {{ dump(0|lower == 'somekey') }} ==> false {{dump(0=='somekey')}==>true {{dump(0 | lower=='somekey')}}==>false
    解决方案
    • 由于Twig是基于PHP的,PHP的语法、隐式和语义也适用于Twig模板
    • 除非DeveloperYlohEnrohK有意地、特别地利用PHP中的隐式类型转换行为,否则比较表达式几乎肯定会产生违反直觉和意外的结果
    • 这是一个详细描述的示例
    • 解决方案:与标准PHP的情况一样,除非考虑到错误,否则在Twig中使用
      ==
      产生意外结果的可能性要小得多
    陷阱
    • 在撰写本文时,细枝模板引擎不支持与标准PHP相同的
      =
    • Twig确实可以替代
      =
    • 因此,PHP和Twig对此的处理略有不同
    另见

    如果使用“==”,会发生什么?var_dump((int)$var1)会为我返回“int(0)”。@Jim,我知道我应该加上它。这显然是错误的。但我不是在比较我已经说过的类型。我试图利用==运算符的行为参见:我的理解是OP想要检查像
    “555”==555
    ,我没有。我用手机打字,这对我来说是一个很大的工作量。其次,这就是我的vardump输出的结果。可能是因为xdebug。对不起。上面不是给你的。我知道这种行为很奇怪,但我几乎忘记了它的这一方面,但当我试图依赖它时,我忘记了这一方面。现在我手上有很多正确的答案。谢谢,我没有。我在手机上打字,这太多了
    function isIntegerNumeric($val) {
      return (
        is_int($val)
          || (
            !is_float($val)
              && is_numeric($val)
              && strpos($val, ".") === false
          )
      );
    }
    
    {{ dump(0 == 'somekey') }} ==> true {{ dump(0|lower == 'somekey') }} ==> false