【问题标题】:Plus operator in PHP [duplicate]PHP中的加号运算符[重复]
【发布时间】:2021-05-16 18:37:32
【问题描述】:

我刚开始自学PHP。我无法理解以下问题:

 The Output for this
 $eur = "5euros";
 $e = 10;
 $e += $eur;
 echo ($e);

这是 15。为什么?

我想“5euros”是一个字符串,10 是一个整数。所以我写了105欧元这样的答案。那是错误的。如果$eur=5,那就很容易理解了。这 5 欧元加 10 怎么办?

【问题讨论】:

  • 对于 concat 使用 . 而不是 plus。这不是 javascript
  • 你检查过关于加号运算符的 PHP 文档吗?
  • 加号运算符不连接,它总是试图做一个数学运算,所以它是 int 解析字符串
  • 这是 StackOverflow 上所有 PHP operators 的优秀列表。我不建议您在刚接触 PHP 时通读它们,但它是一个很好的参考。 :)

标签: php


【解决方案1】:

+ 是 PHP 中的 arithmetic operator(基本上,当 两个 操作数都是数组时会出现异常,见下文)。这意味着,如果操作数不是数字,它会隐式将操作数转换为 numeric 类型。因此,您的字符串将是cast to numeric,结果中将得到5

再深入一点,你可以查看the implementation of +

if (!converted) {
   zendi_convert_scalar_to_number(op1, op1_copy, result);
   zendi_convert_scalar_to_number(op2, op2_copy, result);
   converted = 1;
} else {
   zend_error(E_ERROR, "Unsupported operand types");
   return FAILURE; /* unknown datatype */
}

这部分代码代表大小写。当操作数不是数字数据类型时,它们将被转换为数字。

旁注:+ 也可用 for arrays(这意味着哈希表合并):

case TYPE_PAIR(IS_ARRAY, IS_ARRAY): {
   zval *tmp;

   if ((result == op1) && (result == op2)) {
      /* $a += $a */
      return SUCCESS;
   }
   if (result != op1) {
      *result = *op1;
      zval_copy_ctor(result);
   }
   zend_hash_merge(Z_ARRVAL_P(result), Z_ARRVAL_P(op2), (void (*)(void *pData)) zval_add_ref, (void *) &tmp, sizeof(zval *), 0);
   return SUCCESS;
}

【讨论】:

  • 好了,总结一下这个问题的答案,变量$eur被强制转换为整数5,这就是原因。谢谢大家。我会稍微阅读一下转换为整数的部分。
【解决方案2】:

PHP 使用. 连接字符串。

 $e .= $eur;

如果你使用+"5euros" 被转换为整数5,所以结果是15

【讨论】:

  • 是的,我读过那部分。是的,在这种情况下不是串联,对吧?我的问题是一个字符串怎么能加上一个整数?
  • @daw + 永远不会连接,即使您尝试 'asd' + 'bla'
  • @daw PHP 尽最大努力去做你要求它做的事情。因此,如果您希望添加一个字符串和一个整数,PHP 会将字符串转换为一个整数。它将采用字符串开头的数字并忽略所有后续字符以将其转换为整数。然后它将添加这两个整数,就好像你在做一个简单的 int+int。这也与 JavaScript 的工作方式非常相似,有适合您的脚本语言。当然,在大多数其他非脚本语言中,添加一个字符串和一个整数是行不通的。
  • Re ""5euros" 被转换为整数 5":难道没有某种警告或错误检测可以捕捉到这一点吗?
【解决方案3】:

+ 运算符只是简单地添加并显示输出值。

如果你想要输出,你可以使用:

$e .= $eur;
echo ($e);

【讨论】:

    猜你喜欢
    • 2017-10-14
    • 1970-01-01
    • 2014-07-08
    • 1970-01-01
    • 2010-10-10
    • 2010-09-19
    • 1970-01-01
    • 2018-02-20
    相关资源
    最近更新 更多