为什么1234 ==“1234测试”评估为真? [重复](Why does 1234 == &#

2019-06-17 21:39发布

可能重复:
PHP == VS ===运营商

一个简单的答案的人我敢肯定。 有人可以解释为什么这个表达式的值为true?

(1234 == '1234 test')

Answer 1:

由于您使用的是==(相似)运营商和PHP被强迫字符串为int。

要解决它使用===(equality)运算符,检查不仅如果该值是相同的,而且如果数据类型是相同的,所以“123”的字符串和123 INT将不被认为是相等的。



Answer 2:

在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

PHP手册链接

  • 比较运算符
  • 类型戏法


Answer 3:

当铸造字符串的整数,任何数字字符直至第一个非数字字符变的数目。 因此, '1234 test'变为1234 ,因为空间不是数字字符。

因此1234 == '1234 test'

如果要强制字符串比较,你应该转换为字符串:

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


Answer 4:

您是松散比较两个不同的数据类型(整数,字符串)。 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


Answer 5:

双等于将告诉PHP解析从字符串一个int。 该字符串将计算为整数使用1234三重等号“===”来获得精确比较。



Answer 6:

如果比较的数与一个字符串或比较涉及数字串,则每一个字符串被转换为数字和比较数值进行

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


文章来源: Why does 1234 == '1234 test' evaluate to true? [duplicate]