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

时间:2017-02-15 23:15:31

标签: php string drupal integer drupal-8

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

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

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

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

我做了我的研究,发现使用==运算符时出现PHP错误,因为$ node-> nid被提取为字符串,而90是一个整数,并且它无法转换为nid在飞行中。

我在Googling找到的可能的解决方案是使用===运算符,使用'getter'来获取nid作为整数(听起来比必要的更复杂);而且我在猜测,如果我将90转换为字符串它也可以工作吗?

现在,进行测试运行,===会阻止错误显示,但我的研究表明===仅在值和类型相等时才有效,并且给定我正在比较字符串和整数,我认为那时总是假的。

因此...

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

3 个答案:

答案 0 :(得分:0)

当您将数字与其他数字进行比较时,首先将另一个数字转换为数字,然后比较这两个数字。因此,像"90" == 90这样的比较符合您的预期 - 它等同于90 == 90

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

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

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

答案 1 :(得分:0)

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

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

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

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

答案 2 :(得分:0)

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作为值获取的其他方法在链接中。