可能重复:
php == vs === 运算符
对于我确定的人来说,这是一个简单的答案。有人可以解释为什么这个表达式的计算结果为真吗?
(1234 == '1234 test')
因为您使用的是 == (相似性)运算符,而 PHP 将字符串强制转换为 int。
要解决它,请使用 ===(相等)运算符,它不仅检查值是否相同,还检查数据类型是否相同,因此“123”字符串和 123 int 将不被视为相等。
在 PHP(和 JavaScript——行为略有不同)中,比较运算符的==
工作方式与在 C 或 Java 等强类型语言中的工作方式不同。===
运算符具有您最可能期望的行为。下面是应用于 PHP 的两个比较运算符的细分。
该运算符被正式称为“平等”运算符,尽管这并不真正符合“平等”一词的正常定义。它执行所谓的类型杂耍比较。如果两个操作数的类型不匹配(在您的示例中,1234
是整数和1234 test
字符串),PHP 将隐式地将操作数转换为彼此的类型并测试新类型值的相等性,如下所示:
<?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)
它有一个对应的(类型杂耍)不等式运算符,!=
.
该===
运算符称为“相同”运算符,对两个操作数的值和类型进行严格检查,并且不执行任何隐式强制转换。因此,"0"
不=== 0
和"1234 test"
不=== 1234
。
<?php
var_dump( '1234 test' === 1234 ); // bool(false)
它有一个对应的(严格的)不等式运算符,!==
。
请注意,===
操作员对某些人认为奇怪的对象有行为。假设我们有class A
和 变量$a
,$b
定义如下:
<?php
class A {
public $property = 'default value';
}
$a = new A();
$b = new A();
您可能期望var_dump($a === $b);
输出bool(true)
. 它实际上会返回 false。在对象上使用时,运算符实际上检查两个操作数是否是对同一对象的引用。在这种==
情况下,运算符通过检查对象的属性来工作,因此$a == $b
.
将字符串转换为整数时,直到第一个非数字字符的任何数字字符都将成为数字。这样'1234 test'
就变成1234
了,因为空格不是数字字符。
因此1234 == '1234 test'
如果要强制进行字符串比较,则应强制转换为字符串:
''.(1234) == '1234 test' // implicit
(string) 1234 == '1234 test' // explicit
strval(1234) == '1234 test' // procedural
您正在松散地比较两种不同类型的数据(整数和字符串)。PHP 有一个非常详细的图表,说明了在使用松散比较二元运算符 (==) 时比较在其系统中的工作方式:
http://php.net/manual/en/types.comparisons.php
如果要确保类型也同步,即它们都是整数或字符串,请使用强类型比较运算符 (===)。
请注意,当使用此运算符时,这也将返回 false:
1234 === '1234'
如果在比较时不确定自己的类型,可以将强类型比较与 PHP 类型转换结合使用:
$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 从字符串中解析一个 int。该字符串将计算为整数 1234。使用三等号“===”进行精确比较。
如果将数字与字符串进行比较或比较涉及数字字符串,则每个字符串都将转换为数字并以数字方式执行比较
var_dump(0 == "a"); // 0 == 0 -> true