Php 为什么1234==';1234测试';评估为真?

Php 为什么1234==';1234测试';评估为真?,php,equals,equality,Php,Equals,Equality,可能重复: 我相信这对某人来说是一个简单的答案。有人能解释为什么这个表达式的计算结果是真的吗 (1234 == '1234 test') 因为您使用的是==(相似性)运算符,而PHP将字符串强制为int 要解决此问题,请使用===(相等)运算符,该运算符不仅检查值是否相同,还检查数据类型是否相同,因此“123”字符串和123 int不会被视为相等。将字符串强制转换为整数时,直到第一个非数字字符的任何数字字符都将成为数字。因此,'1234 test'变为1234,因为空格不是数字字符 因此12

可能重复:

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

(1234 == '1234 test')

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


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

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

因此
1234==“1234测试”

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

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

双等于将告诉php解析字符串中的int。该字符串将计算为整数1234。使用三重相等“==”进行精确比较。

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

var_dump(0 == "a"); // 0 == 0 -> true
在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)
它有一个对应的(严格的)不等式运算符,
==

怪癖 请注意,
==
操作符在某些人认为奇怪的对象上有行为。假设我们有
A类
和变量
$A
$b
,定义如下:

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

您正在松散地比较两种不同类型的数据(整数和字符串)。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

因为PHP就是这样滚动的:就像一个方轮。@alfasin:是的,我可以。这个问题中的比较完全是荒谬的,没有理由不认为它是错误的,即使是为了程序员。@Lusitanian:“……这种比较可能有一些合法的用例。”我敢说,找一个吧。@alfasin但这不是问题中的
1234==“1234”
(这在某种程度上是可以理解的,没有复杂的原因);这里的问题是关于
1234==“1234 test”
(这在JavaScript中是错误的,乍一看就不那么“预期”)是的,当程序员开枪打自己的脚时,总是会出错,即使php把字符串部分掉了。@Cjueden小心:
var_dump(0=='abc');
gives
true
但是
var_dump(0=='1abc'))
的计算结果为
false
请注意,C也进行类型转换,唯一的区别是它有一组较小的隐式强制转换。将
int
float
进行比较将导致精度损失,如果de>int
为负值。请注意,这与JavaScript中的行为不同。
123==“123 asd”
返回false,而
123==“0123”
返回true。@rabudde因为
(int)“1abc”
==1。这与
1234=='1234 test'
@Lusitanian的情况类似。你是对的。我只想给你一个提示,如果你不注意并快速编写代码,会发生什么。你的示例结果最后是一样的,当然,但你强制(!)整数转换。我想展示0的松散比较的一些特殊意义。
$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