diff --git a/src/pages/tips/object-oriented.mdx b/src/pages/tips/object-oriented.mdx index 3697907..560153c 100644 --- a/src/pages/tips/object-oriented.mdx +++ b/src/pages/tips/object-oriented.mdx @@ -83,27 +83,42 @@ } ``` +この`FormField`クラスでは、この構造の中に、`name`、`gender`、`message`というデータが入ってくることを定義しています。 + +なお、これらクラスの中にあるデータは、以下のような様々な呼び方があります。 + +- プロパティ +- メンバー変数 +- フィールド +- 属性 + +このページの中では、クラスの中で定義される変数を、**プロパティ**と呼ぶことにします。 + 次の章では、クラスの使い方について説明していきます。 ## クラスの使い方 ### 構造を定義する (メンバー変数) -[データのまとまり](#データのまとまり) で示したように、そのまとまりに対して具体的にどのようなデータが入ってくるのかを定義することができます。 +[データのまとまり](#データのまとまり) で示したように、そのまとまりに対して具体的にどのようなデータが入ってくるのかを定義することができます。 +これはデータ構造を表すための設計図のようなものです。 +このクラスは通常の型と同じように、変数の型として使うことができます。 + +ところで通常の型は代入した時点で、その型の値が入ってきます。 ```php -ただしクラスは通常の型と違い、`new` というキーワードを使って変数に代入する必要があります。 +一方でクラスは、データ構造を定義するための型で、設計図のようなものだと説明しました。 +これを具体的なデータとして使うためには、`new` というキーワードを使って変数に代入する必要があります。 ```php collapse={2-8} -```php - // NULL @@ -174,16 +178,209 @@ // } ``` +
+ +これで、クラスを使うための最低限の準備ができました。 + ### 振る舞いを定義する (メソッド / 関数) +クラスでは、インスタンスが持っているデータを活用して、なにかしらの振る舞いを定義することができます。 +これを **メソッド (method)** と呼びます。 + +例として、`gender` に値を設定するメソッドを定義してみましょう。 + +```php {7-9} +gender = $gender; + } +} + +$formField = new FormField(); +$formField->setGender("man"); +echo $formField->gender . PHP_EOL; +// => man + +$formField->setGender("woman"); +echo $formField->gender . PHP_EOL; +// => woman +``` + +
+ +`$this` という変数が出てきました。 + +通常クラスのインスタンスは、`$formField = new FormField();` のように、変数に代入されます。 +しかしこの `$formField` という変数はクラスの外で定義されている変数で、クラスの中からはどのような変数名で代入されるのかわかりません。 + +とはいえクラスの中から、自分自身が持っているデータにアクセスしたいことはよくあります。 +このときに、クラスのメソッド内でのみ使える特別な変数 `$this` を使うことで、クラスの中から自分自身のインスタンスを指すことができます。 + +この`$this`を経由して、自身が持っている `gender` というプロパティにアクセス、値を代入するということができます。 + +
+
+ +値を設定するメソッドを定義したので、次は値を活用するメソッドも定義してみましょう。 + +```php {11-36} +gender = $gender; + } + + public function reply_template() { + $gender_display = null; + if ($this->gender === "man") { + $gender_display = "男性"; + } else if ($this->gender === "woman") { + $gender_display = "女性"; + } else { + $gender_display = "不明"; + } + + $body = "この度はお問い合わせいただきまして、誠にありがとうございます。 + いただいた内容を確認の上、改めてご連絡いたします。 + + ご入力内容 + + お名前: {$this->name} + 性別: {$gender_display} + + お問い合わせ内容 + --- + {$this->message} + --- + "; + + return $body; + } +} +``` + ### 特別なメソッド +TODO: constructor + ### 敢えてアクセス制限をかける (アクセス修飾子) +### データに依存しない振る舞いを定義する (static) + ### 派生を作る (継承) ## よく見るコード例 +### 初期化のための静的メソッド + +```php +name = $values["name"]; + $instance->email = $values["email"]; + $instance->gender = $values["gender"]; + $instance->message = $values["message"]; + + return $instance; + } +} + +// $_POSTの中身をもとに、FormFieldクラスのインスタンスを作る +$formField = FormField::fromValues($_POST); +``` + +### 別の型に変換するためのメソッド + +```php +name = $values["name"]; + $instance->gender = $values["gender"]; + $instance->message = $values["message"]; + + return $instance; + } + + public function toUser() { + + $values = [ + "name" => $this->name, + "gender" => $this->gender, + "email" => $this->email, + ]; + + $user = new User(); + $user->fromValues($values); + + return $user; + } +} + +// $_POSTの中身をもとに、FormFieldクラスのインスタンスを作る +$formField = FormField::fromValues($_POST); + +// FormFieldクラスが持つ情報で、Userクラスのインスタンスを作る +$user = $formField->toUser(); +$user->save(); +``` + --- ```c