为什么1234==';1234测试';评估为true


Why does 1234 == '1234 test' evaluate to true?

可能重复:
php===vs===操作员

我相信这对某人来说是个简单的答案。有人能解释一下为什么这个表达式的结果是真的吗?

(1234 == '1234 test')

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

要解决此问题,请使用===(equality)运算符,该运算符不仅检查值是否相同,还检查数据类型是否相同,因此"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)

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

Quirks

请注意,===运算符对某些人认为奇怪的对象具有行为。假设我们有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手册链接

  • 比较运算符
  • 类型杂耍

将字符串强制转换为整数时,第一个非数字字符之前的任何数字字符都将成为数字。因此CCD_ 20变为CCD_ 21,因为空格不是数字字符。

因此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

double equals将告诉php解析字符串中的int。该字符串将计算为整数1234。使用三重等于'==='来获得精确的比较。

如果将数字与字符串进行比较,或者比较涉及数字字符串,则每个字符串都会转换为数字,并以数字进行比较

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