如何正确比较 PHP 中的字符串和整数?

How to correctly compare a string and an integer in PHP?

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

我得到的错误是: 注意:class 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 语句的正确方法吗?进行此比较的最正确方法是什么?

当你比较一个数字和其他东西时,其他东西先转换成数字,然后再比较这两个数字。所以像 "90" == 90 这样的比较符合你的预期——它等同于 90 == 90.

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

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

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

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

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

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

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

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 作为值的替代方法在 link.