天使と悪魔選手権

下記のトレイトの例では、PrintNameで宣言された$nameに、$thiis->nameで
'apple'が入る様ですが、これはFruitのコンストラクタの$this->nameに
'apple'が設定された$nameとはどのような関係になるのでしょうか?
Fruitの$nameがPrintNameの$nameにコピーされる?あるいは、
Fruitのコンストラクタ呼び出し時に両方の$nameに'apple'が設定される?
トレイトには継承関係はないのでどういった扱いになるのか知りたいのです。

<?php

trait PrintName
{
 private string $name;
 public function printName()
 {
  echo $this->name . '<br>';
 }
}

trait PrintPrice
{
 private int $price;
 public function printPrice()
 {
  echo $this->price . '<br>';
 }
}

class Fruit
{
 use PrintName;
 use PrintPrice;

 public function __construct(
  private string $name,
  private int $price,
 ) {}
}

$apple = new Fruit('apple', 200);
$apple->printName();
$apple->printPrice();

A 回答 (1件)

クラス Fruit のコンストラクタ引数 $name は、


プロモーション機能によりクラス内のプロパティとして定義されます。
https://www.php.net/manual/ja/language.oop5.deco …

トレイト PrintName のプロパティ定義 $name と、
クラス Fruit のプロパティ定義 $name は、
優先順位によりクラス側が優先され定義されます。
https://www.php.net/manual/ja/language.oop5.trai …

プロパティ $name はインスタンス内で唯一の存在となるので、
クラス側メソッドもトレイト側メソッドも参照先は同じです。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!