採点されません。匿名です。 間違えることは学習の一部です。読むだけでもかまいません。

`$this` でプロパティを参照する

テクノロジ系 / class (class / new / プロパティ / メソッド / `$this` / コンストラクタ)

$this でプロパティを参照する

Lesson 8 / Chapter 5

メソッドから自分のプロパティを使いたい

<?php
class User {
    public string $name;

    public function greet(): void {
        // ここで $name を使いたいが、ただの $name では取れない
        echo "こんにちは、????です\n";
    }
}
  • メソッドの中で $name と書いても、それは メソッド内のローカル変数 扱い
  • 「いま動いているインスタンスのプロパティ」を使いたい → $this を使う

$this->プロパティ名 で自分のプロパティ

<?php
class User {
    public string $name;

    public function greet(): void {
        echo "こんにちは、" . $this->name . "です\n";
    }
}

$u = new User();
$u->name = "太郎";
$u->greet();   // → こんにちは、太郎です
  • $thisいま動いているインスタンス自身 を指す
  • $this->name で「このインスタンスの name プロパティ」が取れる
  • 外から見る時の $u->name と同じ感覚で、内側からは $this->name

インスタンスごとに動きが変わる

<?php
$a = new User();
$a->name = "太郎";

$b = new User();
$b->name = "花子";

$a->greet();   // → こんにちは、太郎です
$b->greet();   // → こんにちは、花子です
  • 同じ greet() メソッドを呼んでも、$this が指す相手 が違う
  • だから出力も変わる
  • これが「インスタンスごとに振る舞いを変える」基本の仕掛け

$this-> 経由でプロパティに書き込みもできる

<?php
class Counter {
    public int $count;

    public function up(): void {
        $this->count = $this->count + 1;
    }
}

$c = new Counter();
$c->count = 0;
$c->up();
$c->up();
echo $c->count . "\n";   // → 2
  • $this->count = ...自分の プロパティを書き換える
  • 「自分の状態を変えるメソッド」が書けるようになった

このチャプターでできるようになること

✅ メソッド内で $this->prop で自分のプロパティを読める

✅ メソッド内で $this->prop = 値; で自分のプロパティを書き換えられる

✅ 同じメソッドでも $this が違えば動きが変わると言える

✅ 「外から $obj->prop」と「内から $this->prop」が対応すると言える

→ ドリルへ

考えてみよう

既定では正解・不正解の判定はしません。自分のペースで「答えを見る」を。採点してほしい場合だけ「採点してほしい」を押してください。

ドリル 01 — $this->name を使った greet

問題

User クラスを定義してください。

  • public string $name;
  • public function greet(): void { ... }"こんにちは、{name}です" を出力 ({name}$this->name の値)

new User() でインスタンスを作り、name"太郎" を入れて、greet() を呼んで出力してください。

期待される出力:

こんにちは、太郎です

採点

php scripts/grade.php topics/class/ch05-this/drill/01-greet-with-name/

ヒント

  • メソッド内で $name ではなく $this->name と書く
  • echo "こんにちは、" . $this->name . "です\n"; の形で OK
  • もしくは echo "こんにちは、{$this->name}です\n"; でも同じ結果