AIにPHPを書いてもらった。
コードを確認してみると、見慣れないものが登場しました。
$this->name
……誰?
さらに読み進めると、
$this->loadData();
また出てきた。
$this->db
今度はデータベースまで持っている。
この $this、一体何者なんでしょうか?
今回は、PHPでよく使われる $this の正体を調査します。
難しいオブジェクト指向の授業にはしません。
今日の目標は、AIが書いたコードに $this が登場しても、慌てずに意味を読み取れるようになることです。
1. 事件発生!AIが書いたコードが読めない
お問い合わせフォームを作っているとしましょう。
AIに「送信された名前を保存する処理を書いて」とお願いしたところ、こんなコードが返ってきました。
class Contact
{
public $name;
public function setName($name)
{
$this->name = $name;
}
}
$name は、なんとなく分かります。
名前が入っている変数でしょう。
しかし、
$this->name
こちらは何でしょうか?
$this という変数を作った覚えもありません。
検索してみると「オブジェクト指向」「インスタンス」「プロパティ」など、難しい言葉が次々に登場します。
……お問い合わせフォームを作りたかっただけなのに!
大丈夫です。
まずは必要な部分だけ理解しましょう。
2. AIと調査!$thisの正体
結論から説明します。
$this = 今、自分自身のオブジェクト
PHPでは、クラスから作られたオブジェクト自身を指すために $this を使います。
……これだけでは分かりにくいですね。
学校の名簿を想像してください。
名簿には、山田さん、田中さん、佐藤さんがいます。
それぞれ名前や年齢などの情報を持っています。
PHPでも、同じように人物の情報を管理できます。
例えば、人物を表す設計図を作ります。
class User
{
public $name;
}
この class User が設計図です。
ここから実際のユーザーを作ります。
$yamada = new User();
$tanaka = new User();
$yamada->name = '山田';
$tanaka->name = '田中';
同じ設計図から作りましたが、それぞれ違う名前を持っています。
クラスとオブジェクトの関係
Userクラス
人物を作るための設計図
山田さん
name = 山田
田中さん
name = 田中
同じ設計図から、別々のオブジェクトが作られる。
そして、ここが重要です。
$this は、その処理を実行しているオブジェクト自身を指します。
山田さんのオブジェクトで実行すれば山田さん自身、田中さんのオブジェクトで実行すれば田中さん自身です。
3. 実際に$thisを動かしてみよう
先ほどのコードを少し変更してみます。
class User
{
public $name;
public function setName($name)
{
$this->name = $name;
}
}
ここで登場する setName() は、名前を設定するための処理です。
実際に動かしてみましょう。
$yamada = new User();
$yamada->setName('山田');
echo $yamada->name;
実行結果は、
山田
です。
では、内部では何が起きているのでしょうか。
$this->name = $name;
この行を日本語に翻訳すると、
「今、この処理を実行しているオブジェクト自身の name に、受け取った名前を入れる」
となります。
$yamada->setName('山田') と呼び出したので、このときの $this は $yamada が参照しているオブジェクトです。
田中さんのオブジェクトで呼び出せば、田中さんの名前が変更されます。
4. 前回の授業とつながった!
ここで前回学んだ -> が登場します。
$this->name
分解してみましょう。
| コード | 意味 |
|---|---|
$this | 現在のオブジェクト自身 |
-> | オブジェクトのメンバーにアクセス |
name | 名前を保存するプロパティ |
つまり、前回の授業が理解できていれば、今回のコードもかなり読めるはずです。
ちなみに、プロパティとは、オブジェクトが持っているデータのことです。
今回であれば name がプロパティに当たります。
難しい用語を一度に覚える必要はありません。
5. $thisは変数を作らなくても使えるの?
ここで疑問が生まれます。
普通の変数なら、
$name = '山田';
のように値を入れてから使います。
しかし $this は、
$this = ...;
と書いていません。
実は、PHPが自動的に用意してくれています。
ただし、どこでも使えるわけではありません。
基本的には、オブジェクトの通常のメソッド内で使用します。
例えば、次のようなコードは間違いです。
$this->name = '山田';
これをクラスの外に単独で書いても、通常は動きません。
また、クラス内でも static メソッドでは $this を使用できません。
今は「クラスの中なら何でも使えるわけではない」と覚えておきましょう。
6. 実際のWeb制作ではどこに登場する?
例えば、CodeIgniterなどのPHPフレームワークを使用すると、次のようなコードを見かけます。
class Contact
{
private $message = '';
public function setMessage($message)
{
$this->message = $message;
}
public function getMessage()
{
return $this->message;
}
}
少し難しくなりましたね。
しかし、やっていることは単純です。
setMessage() でメッセージを保存し、getMessage() で保存したメッセージを取り出しています。
ここで $this が登場する理由は、同じオブジェクトが持つデータを別のメソッドからも利用するためです。
なお、フレームワークによっては、コントローラーやモデルなどで $this が頻繁に登場します。
その際も基本的な意味は同じです。
7. AIに質問するときのコツ
AIが生成したコードに、次のような処理が登場したとします。
$this->saveData($data);
意味が分からなければ、AIに質問してみましょう。
例えば、
このコードの
$thisは何を指していますか?saveData()はどこで定義されていますか? 初心者にも分かるように説明してください。
と聞いてみてください。
ただし、注意点があります。
この1行だけでは、saveData() が実際に何をするのかは分かりません。
メソッドの定義や関連するコードを確認する必要があります。
AIに質問するときは、前後のコードやクラス全体を渡すと、より正確な説明を得やすくなります。
今日の合格ライン
今日覚えて帰ること
$thisは現在のオブジェクト自身を指す->はオブジェクトのメンバーにアクセスする記号$this->nameは自身のnameプロパティを参照する$thisはどこでも使えるわけではない
0 / 4 項目を確認
全部を暗記する必要はありません。
AIが書いたコードに $this が出てきたら、「このオブジェクト自身のことだな」と理解できれば十分です。
ワンポイント答え合わせ
1. `$this` は何を指している?すべてのPHPファイル現在のオブジェクト自身現在アクセスしているURL
2. `$this->name` の意味は?現在のオブジェクトのnameにアクセスnameという新しいクラスを作成別のPHPファイルを読み込む
3. `$this` はクラスの外でも自由に使える?どこでも使える通常のオブジェクトメソッドなど、使用できる場所が決まっている
