为什么1234 =='1234 test'评估为真?

Cju*_*den 80 php equality equals

可能重复:
php == vs === operator

对我确定的人来说,这是一个简单的答案.有人可以解释为什么这个表达式评估为真?

(1234 == '1234 test')
Run Code Online (Sandbox Code Playgroud)

Luc*_*een 95

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

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

  • @Cjueden http://php.net/manual/en/language.types.type-juggling.php (6认同)
  • 所以php删除了字符串部分. (2认同)

Lus*_*ian 77

在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)
Run Code Online (Sandbox Code Playgroud)

它有一个对应的(类型 - 杂耍)不等式运算符,!=.

===

===操作者,被称为"相同的"运算符,执行值的严格检查两个操作数的类型和不执行任何隐式转换.因此,"0"=== 0"1234 test"=== 1234.

<?php
var_dump( '1234 test' === 1234 ); // bool(false)
Run Code Online (Sandbox Code Playgroud)

它有一个对应的(严格的)不等式运算符!==.

怪癖

请注意,===操作符对某些对象感到奇怪的对象有行为.假设我们有class A变量$a,$b定义如下:

<?php
class A { 
  public $property = 'default value';
}
$a = new A();
$b = new A();
Run Code Online (Sandbox Code Playgroud)

您可能希望var_dump($a === $b);输出bool(true).它实际上会返回false.当在对象上使用时,操作符实际检查两个操作数是否都是对同一对象的引用.该==运营商,在这种情况下,作品被检查对象的属性,所以$a == $b.

PHP手册链接

  • 注意:`var_dump(0 =='abc');`给出`true`但是`var_dump(0 =='1abc');`计算为`false` (5认同)
  • 请注意,这与JavaScript中的行为不同.`123 =="123 asd"`返回false,而`123 =="0123"`返回true. (3认同)

Nie*_*sol 28

将字符串转换为整数时,任何直到第一个非数字字符的数字字符都将成为数字.因此'1234 test'变得1234因为空间不是数字字符.

从而 1234 == '1234 test'

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

''.(1234) == '1234 test' // implicit
(string) 1234 == '1234 test' // explicit
strval(1234) == '1234 test' // procedural
Run Code Online (Sandbox Code Playgroud)

  • 要点答案:) (3认同)

And*_*han 8

您正在松散地比较两种不同类型的数据(整数和字符串).PHP有一个非常详细的图表,说明当使用松散比较二元运算符(==)时,比较在他们的系统中如何工作:

http://php.net/manual/en/types.comparisons.php

如果要确保类型也同步,即它们都是整数或两个字符串,请使用强类型比较运算符(===).

请注意,使用此运算符时,这也将返回false:

1234 === '1234'
Run Code Online (Sandbox Code Playgroud)

如果您在比较时不确定类型,可以将强类型比较与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
Run Code Online (Sandbox Code Playgroud)