2017-02-15 11 views
0

Drupalのテーマを購入しましたが、サポートが欠けています。だから私は自分自身でそれに取り組むと思った。私はPHPプログラミングには比較的新しいので、簡単に教えてください:)PHPで文字列と整数を正しく比較するには?

私が入手したエラーは: Notice:Drupal \ Core \ Field \ FieldItemListクラスのオブジェクトをtheme_css_alterのintに変換できませんでしたif文)

はエラーに掘り、それはこの中で、コードの最初の行から来た:

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

私は私の研究を行なったし、そのPHPのエラーがあるため、おそらく==演算子を使用している場合ことがわかりました$ node-> nidは文字列としてフェッチされ、90は整数で、nidをオンザフライで変換することはできません。

可能な解決策Google検索で見つかった解決策では、===演算子を使ってnidを整数(必要以上に複雑に聞こえる)として取得する「ゲッター」を作成していました。私は90を文字列に変換するとそれも機能するだろうと私自身は推測しています。

今、試運転を行うと===エラーが表示されなくなりますが、私の研究では、値と型が等しい場合にのみ動作し、文字列と整数、私はそれが常にちょうど偽であると仮定します。

そう...

  1. は、私が(文字列として)PHP 90に(整数として)90を==ていないことを言って、正しいですか?
  2. 私は、==の代わりに===を使用すると、文字列と整数を比較する正しい方法ではないことを訂正していますか?
  3. $ node-> nid ==(string)90 {このif文を比較する正しい方法ですか?この比較を行う最も正しい方法は何ですか?
+0

文字列を数字と比較すると、一般的に期待通りの結果が得られます。エラーメッセージは '$ node-> nid'が文字列ではなく' FieldItemList'であることを示しています。 – Barmar

+0

Barmarさんに感謝します。私はnidは文字列であると仮定していました。なぜなら、通常はどこかにあり、FieldItemListはDrupal 8のPHPクラスだけだったからです。 –

+0

文字列に変換するメソッドがあるかもしれないので、文字列が必要な場所で使用できますが、実際には文字列ではありません。 – Barmar

答えて

0

数字を他のものと比較すると、もう1つは最初に数字に変換され、次にこれら2つの数字が比較されます。したがって、"90" == 90のような比較は、あなたが期待することを行います。これは90 == 90に相当します。

問題は、$node->nidが文字列でないこと、クラスDrupal\Core\Field\FieldItemListのオブジェクトだということです。クラスはこの型を数値に変換するメソッドを提供しないため、比較を実行できません。

ただし、この型には文字列に変換するメソッドがあるようです。しかし、PHPは比較を実行する際に二重変換を行いません。ですから、オブジェクト - >文字列変換を明示的に実行する必要があります。そうすれば、PHPは文字列を整数に変換します。

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

そうだね。ありがとう。私はそれがPHPのものよりもDrupalのものになると思う。私はここで新しいです、私は質問を変更し、drupal.stackexchange.comで新しいものを開く必要がありますか? –

+0

私はちょうど解決策を追加しました。 – Barmar

+0

私はこの質問に技術的に正しいので、これを解決策としてマークしました。残念ながら、FieldItemListも文字列に変換することはできませんが、なぜこの行が失敗しているのか分かりました。 (私は、私の混乱の理由はDrupal 7と8の間の変更だと思う;私はあなたが提案した解決策でそれを呼び出すことができると思う...) –

0

文字列は整数ではありません。あなたもタイプをチェックする必要があります。だから私たちは三重等号===を使用しています。

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

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

ページで独自の変数をテストすることができます。

+0

あなたのコードはあなたが答えに書いたものと矛盾する。最初の文字は '=='を使うと文字列が整数に等しいことを示す真を表示します。 – Barmar

0

このif文が失敗している理由はBarmarが正しいです。比較は機能していますが、$ 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として値を取得する別の方法はリンクにあります。

関連する問題