PHP の開発では、ある構造体の中で別の構造体のフィールドを使用する状況によく遭遇します。ただし、キーとして直接参照すると、コードが乱雑で保守不能になる可能性があります。では、別の構造体で構造体フィールドを使用するにはどうすればよいでしょうか? PHP エディター Baicao は、コードをより明確で読みやすくするための簡潔で明確なソリューションを提供します。以下を見てみましょう!
構造体名を使用せずに構造体フィールドを別の構造体に挿入したい。
私はこれができることを知っています:
リーリーしかし、次の構造が生成されます:
リーリーこのようなことをするにはどうすればよいですか:
リーリー次のように使用します
リーリー ######出来ますか?解決策
リテラルを初期化するときは、明示的に行う必要があります (つまり、
literal![原文ママ])。 user には person
が含まれるため、次のように、リテラルの user
にはリテラルの person
が含まれている必要があります。
リーリー
ただし、
user
変数を取得したら、匿名フィールドを活用して、
user 経由で匿名の person# を設定 (または取得) できます。 ##name
:
リーリー
なぜ go は私にこのような仕事をさせるのですか?
内部の
次に、後で user
構造を変更し、
name フィールドを
追加することをさらに想像してみましょう。
リーリー
これで、新しい name
フィールドを
リーリー
これは、以前に user.person.name を初期化したコードと同じですが、現在は
user.name
###さらに質問を###
このようなコードにはさらに多くの罠が隠されています。
まず、
user
すでにあります。
同様に、name の user
変数を「破棄」します。への参照 ###: ###
リーリー
さらに、匿名の
person フィールドのみを使用すると、user.person.name フィールドは、デフォルトで「name」フィールドとして json にマーシャリングされます。
リーリー
name
フィールドが追加された場合、
は "name"
および user.person.name
としてマーシャリングされるフィールドです。フィールドがまったくグループ化されていません
>.
json タグを user.person.name
に追加できると思うかもしれません (例: )
リーリー
しかし、now
は、name
フィールドを持つ object
にマーシャリングされます:
これは、user に
name## がない場合でも、匿名の person
のマーシャリングされたフィールドの名前を変更しようとすると発生する可能性があります。 # 分野### 。
つまり、構造体内に「フィールドを追加する」方法として匿名構造体を使用することは問題が発生し、脆弱になる可能性があるため、避けるべきです。
以上がキーとして参照せずに別の構造体の構造体フィールドを使用する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。