可能的复制品: Php = = vs = = = 操作符
这个答案对某人来说很简单,谁能解释一下为什么这个表达式的结果是 true?
(1234 == '1234 test')
因为您使用的是 = = (相似性)运算符,而 PHP 将字符串强制转换为 int。
要解析它,使用 = = = (相等)运算符,它不仅检查值是否相同,还检查数据类型是否相同,因此“123”字符串和123 int 不会被认为是相等的。
当将字符串强制转换为整数时,直到第一个非数字字符为止的任何数字字符都将成为该数字。因此 '1234 test'变成 1234,因为空格不是数字字符。
'1234 test'
1234
这就是 1234 == '1234 test'
1234 == '1234 test'
如果要强制进行字符串比较,则应强制转换为字符串:
''.(1234) == '1234 test' // implicit (string) 1234 == '1234 test' // explicit strval(1234) == '1234 test' // procedural
Double equals 将告诉 php 从字符串中解析 int。该字符串的计算结果为整数1234。使用三重等于’= =’可以得到精确的比较。
如果您将数字与字符串进行比较,或者比较涉及到数字字符串,那么每个字符串都将转换为一个数字,并执行数字比较
var_dump(0 == "a"); // 0 == 0 -> true
在 PHP 中(以及 JavaScript ——其行为略有不同) ,比较运算符 ==的工作方式与在 C 或 Java 等强类型语言中的工作方式不同。===操作符具有您最可能期望的行为。下面是应用于 PHP 的两个比较运算符的分类。< Br > < Br >
==
===
这个操作符的正式名称是“相等”操作符,尽管它并不真正符合“相等”这个词的正常定义。它所做的就是所谓的 杂耍类型比较杂耍类型比较。如果两个操作数的类型不匹配(在您的示例中,1234是一个整数,1234 test是一个字符串) ,PHP 将 毫无疑问将操作数转换为对方的类型,并测试新类型值的相等性,如下所示:
1234 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。
"0"
=== 0
"1234 test"
=== 1234
<?php var_dump( '1234 test' === 1234 ); // bool(false)
它有一个对应的(严格的)不等式算子 !==。
!==
请注意,===操作符对某些人认为奇怪的对象有行为。假设我们有如下定义的 class A和变量 $a和 $b:
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)来工作。
var_dump($a === $b);
bool(true)
$a == $b
您大致比较了两种不同类型的数据(一个整数和一个字符串)。当使用松散的比较二进制运算符(= =)时,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