为什么1234 =='1234testing'评估为真?

可能重复:
php == vs ===运算符

一个简单的答案,我确定的人。 有人能解释为什么这个expression式评估为真?

(1234 == '1234 test') 

因为您正在使用==(相似度)运算符,并且PHP将string强制为int。

为了解决这个问题,使用===(相等)运算符,它不仅检查值是否相同,而且如果数据types相同,所以“123”string和123 int不会被视为相等。

在PHP(和JavaScript–其行为稍有不同)中,比较运算符==工作方式与在C或Java等强types语言中的工作方式不同。 ===运算符具有您最可能期望的行为。 以下是适用于PHP的两个比较运算符的细目。

==

这个算子被正式称为“平等”算子,尽pipe这不符合“平等”一词的正常定义。 这就是所谓的打字比较 。 如果两个操作数的types不匹配(在你的例子中, 1234是一个整数, 1234 test是一个string),PHP将隐式地将操作数转换为彼此的types,并testing新types值的相等性下面:

 <?php var_dump( (int) 'hi' ); // int(0) var_dump( (string) 0 ); //string("0") var_dump( 'hi' == 0 ); // bool(true) var_dump( (int) '1hi' ); // int(1) var_dump( 1 == '1hi' ); // bool(true) 

它有一个对应的(types杂耍)不平等运算符, !=

===

===运算符(称为“相同”运算符)对两个操作数的值types执行严格检查,并不执行任何隐式转换。 因此, "0"=== 0"1234 test"=== 1234

 <?php var_dump( '1234 test' === 1234 ); // bool(false) 

它有一个对应的(严格)不等式操作符!==

怪癖

请注意, ===运算符对某些被认为是奇怪的对象具有行为。 说我们有class A和variables$a$b定义如下:

 <?php class A { public $property = 'default value'; } $a = new A(); $b = new A(); 

你可能会期望var_dump($a === $b); 输出bool(true) 。 它实际上会返回false。 当在对象上使用时,操作符实际上检查两个操作数是否是对同一个对象的引用。 在这种情况下, ==运算符通过检查对象的属性来工作,所以$a == $b

PHP手册链接

  • 比较运营商
  • types杂耍

将string强制转换为整数时,直到第一个非数字字符的任何数字字符都将成为该数字。 因此, '1234 test'变成1234因为空间不是数字字符。

因此1234 == '1234 test'

如果你想强制string比较,你应该强制转换为string:

 ''.(1234) == '1234 test' // implicit (string) 1234 == '1234 test' // explicit strval(1234) == '1234 test' // procedural 

你松散地比较两种不同types的数据(一个整数和一个string)。 PHP使用松散的比较二元运算符(==)时,有一个非常详细的比较图,说明在他们的系统中如何进行比较:

http://php.net/manual/en/types.comparisons.php

如果要确保types也是同步的,即它们都是整数或两个string,请使用强types比较运算符(===)。

请注意,使用此运算符时,这也将返回false:

 1234 === '1234' 

如果在比较时不确定types,可以将强types比较与PHPtypes转换相结合:

 $a = 1234; $b = '1234'; if ($a === $b) { } // Will not fire, as it is false if ((int)$a === (int)$b) { } // Will fire, as it is true 

双等于将告诉PHP从stringparsing一个int。 该string将计算为整数1234.使用三等于“===”以获得准确的比较。

如果您将数字与string进行比较,或者比较涉及数字string,则将每个string转换为数字,并以数字forms进行比较

 var_dump(0 == "a"); // 0 == 0 -> true