2017-02-15 45 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作爲值提取的替代方法。