【问题标题】:How to correctly compare a string and an integer in PHP?如何正确比较 PHP 中的字符串和整数?
【发布时间】:2017-02-15 23:15:31
【问题描述】:

我购买了一个 Drupal 主题,但缺乏支持。所以我想我会尝试自己解决它。我对 PHP 编程比较陌生,所以请放轻松:)

我得到的错误是: 注意:Drupal\Core\Field\FieldItemList 类的对象无法在 theme_css_alter() 中转换为 int

深入研究错误,它来自此 if 语句的第一行代码:

if(isset($node->nid) && $node->nid == 90){
    //do stuff
 }

我进行了研究,发现使用 == 运算符时出现 PHP 错误,可能是因为 $node->nid 是作为字符串获取的,而 90 是整数,它无法将 nid 转换为苍蝇。

我在谷歌搜索时发现的可能解决方案要么使用 === 运算符制作“getter”以将 nid 作为整数获取(这听起来比必要的更复杂);而且我自己猜测,如果我将 90 转换为字符串,它也会起作用吗?

现在,进行测试运行,=== 确实阻止了错误的显示,但我的研究表明 === 仅在值和类型相等时才有效,并且假设我正在比较字符串和整数,我假设它永远都是假的。

所以...

  1. 我是否正确地说在 PHP 90(作为字符串)中不 == 90(作为整数)?
  2. 我是否正确地说使用 === 而不是 == 不是比较字符串和整数的正确方法?
  3. $node->nid == (string)90{ 是比较这个 if 语句的正确方法吗?进行这种比较的最正确方法是什么?

【问题讨论】:

  • 将字符串与数字进行比较通常可以达到您的预期。错误消息表明$node->nidFieldItemList,而不是字符串。
  • 谢谢巴马尔。我假设 nid 将是一个字符串,因为这通常是其他地方的字符串,并且 FieldItemList 只是 Drupal 8 中的 PHP 类。这也不正确吗?
  • 它可能有转换为字符串的方法,所以你可以在需要字符串的地方使用它,但它实际上不是字符串。

标签: php string drupal integer drupal-8


【解决方案1】:

当你将一个数字与其他事物进行比较时,首先将其他事物转换为数字,然后将这两个数字进行比较。所以像"90" == 90 这样的比较符合你的预期——它相当于90 == 90

您遇到的问题是$node->nid 不是字符串,它是Drupal\Core\Field\FieldItemList 类的对象。该类不提供将此类型转换为数字的方法,因此无法执行比较。

但是,这种类型似乎有一种转换为字符串的方法。但是 PHP 在执行比较时不会进行双重转换。所以需要显式执行object->string转换,然后PHP会将string转换为整数。

if (isset($node->nid) && (string)$node->nid == 90)

【讨论】:

  • 听起来不错。谢谢。我想这使它更像是 Drupal 的东西而不是 PHP 的东西。我是新来的,我应该更改问题并在 drupal.stackexchange.com 上打开一个新问题吗?
  • 我刚刚添加了一个解决方案。
  • 我已将此标记为解决方案,因为它在技术上与我提出的问题是正确的。不幸的是 FieldItemList 也不能​​转换为字符串,但现在我知道为什么这条线失败了,我可以做更多的挖掘。 (仅供参考,我认为我感到困惑的原因是 Drupal 7 和 8 之间的变化;我认为 D7 你可以用你提出的解决方案来称呼它......)
【解决方案2】:

字符串不等于整数。您还需要检查类型。这就是我们使用三等号 === 的原因。考虑以下代码:

$integer = 90;
$string = "90";

echo($integer == $string); // prints 1 (true)
echo($integer === $string); // prints 0 (false)

您可以在this 页面中测试您自己的变量。

【讨论】:

  • 您的代码与您在答案中写的内容相矛盾。第一个打印true,表明当你使用==时,一个字符串可以等于一个整数。
【解决方案3】:

Barmar 关于这个 if 语句失败的原因是正确的;比较有效,但 $node->nid 不是字符串或整数。我将此答案添加为 Drupal 方面的附加参考。

作为参考:https://drupal.stackexchange.com/questions/145823/how-do-i-get-the-current-node-id

Drupal 8 改变了访问 nid 值的方式。归根结底,原因是当您尝试访问该参数时,该参数被向上转换为一个完整的节点对象,因此它既不是字符串也不是整数。

进行比较的正确方法是使用 $node->nid->value 或 $node->id()。将 id 作为值获取的替代方法在链接中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-03
    相关资源
    最近更新 更多