为什么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