我购买了一个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转换为字符串它也可以工作吗?
现在,进行测试运行,===会阻止错误显示,但我的研究表明===仅在值和类型相等时才有效,并且给定我正在比较字符串和整数,我认为那时总是假的。
因此...
答案 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作为值获取的其他方法在链接中。