为什么 1234 == '1234 test' 的计算结果为 true?

2022-08-30 08:20:06

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

对于我确信的人来说,这是一个简单的答案。有人可以解释为什么这个表达式的计算结果为true吗?

(1234 == '1234 test')

答案 1

因为您正在使用 ==(相似性)运算符,而 PHP 正在将字符串强制转换为 int。

要解决此问题,请使用 ===(相等)运算符,该运算符不仅检查值是否相同,还检查数据类型是否相同,因此“123”字符串和 123 int 不会被视为相等。


答案 2

在PHP(和JavaScript - 其行为略有不同)中,比较运算符的工作方式与在C或Java等强类型语言中的工作方式不同。操作员具有您最有可能期望的行为。以下是两个比较运算符的细分,因为它们适用于 PHP。=====

==

这个运算符被正式称为“平等”运算符,尽管这并不真正符合“平等”一词的正常定义。它执行所谓的类型杂耍比较。如果两个操作数的类型不匹配(在您的示例中,是一个整数并且是一个字符串),PHP 会将操作数隐式转换为彼此的类型,并测试新类型值的相等性,如下所示:12341234 test

<?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();

您可能希望输出 。它实际上会返回 false。当用于对象时,运算符实际上会检查两个操作数是否是对同一对象的引用。在此实例中,运算符通过检查对象的属性来工作,因此 .var_dump($a === $b);bool(true)==$a == $b

PHP 手册链接


推荐