2017-02-15 139 views
0

我购买了Drupal主题,支持...缺乏。所以我想我会尝试自己解决它。我对PHP编程比较陌生,所以请对我轻松:)如何正确比较PHP中的字符串和整数?

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

挖掘到的错误,它从第一行代码来到这个if语句:

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

我做我的研究,发现其使用PHP的错误时,==操作符,可能因为$ node-> nid被作为一个字符串获取,90是一个整数,并且它不能即时转换nid。

可能的解决方案我在Google搜索时发现使用===运算符创建'getter'来获取nid作为整数(听起来比所需的更复杂)我自己猜测如果我将90转换为一个字符串,它也可以工作?

现在,进行测试运行,===确实会阻止显示的错误,但是我的研究表明===只在值和类型相等的情况下才起作用,并且假设我比较了字符串和整数,我认为它总是会是假的。

所以......

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

比较字符串与数字通常会做你期望的。错误消息指出'$ node-> nid'是一个'FieldItemList',而不是一个字符串。 – Barmar

+0

谢谢巴尔玛。我认为nid将是一个字符串,因为那就是它通常在其他地方的那个字段,并且FieldItemList只是Drupal 8中的PHP类。那是不正确的吗? –

+0

它可能有一个方法转换为字符串,所以你可以在需要字符串的地方使用它,但它实际上并不是一个字符串。 – Barmar

回答

0

当您将某个数字与其他数字进行比较时,首先将其他数字转换为数字,然后对这两个数字进行比较。因此像"90" == 90这样的比较可以达到您的预期效果 - 相当于90 == 90

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

但是,看起来这种类型有一个方法可以转换为字符串。但是PHP在执行比较时不会执行双重转换。所以你需要明确地执行object-> string转换,然后PHP会将字符串转换为整数。

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

听起来不错。谢谢。我想这使得它更像是一个Drupal的东西,而不是PHP的东西。我是新来的,是否应该在drupal.stackexchange.com上更改问题并打开一个新问题? –

+0

我刚刚添加了一个解决方案。 – Barmar

+0

我已经将其标记为解决方案,因为它在技术上与我提出的问题一致。不幸的是,FieldItemList不能转换为字符串,但现在我知道为什么这条线是失败的,我可以做更多的挖掘。 (仅供参考,我认为造成混淆的原因是Drupal 7和8之间的变化;我认为D7可以用您提出的解决方案进行调用......) –

0

一个字符串不会等于一个整数。你也需要检查类型。这就是为什么我们使用三重等号===。考虑下面的代码:

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

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

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

+0

您的代码与您在答案中写下的内容矛盾。第一个打印真实,表明当你使用'=='时,一个字符串可以等于一个整数。 – Barmar

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作为值提取的替代方法。