はじめに
SLスタジオでPHP・WEB開発を独学中のアラフィフ主婦の忘備録です。
クラス-コンストラクタ
PHPでは、__construct
(コンストラクタ) というメソッドを実装することで、インスタンス生成時に処理を実行することができます。
自由に名前が付けられないので、決まった呪文みたいなものだと覚えておきましょう。
注意点
-
__construct
以外の命名はできない(アンダーバーは2つ) - 呼び出されるタイミングはインスタンス生成時(クラスの外で
new
をした時) -
return
文の使用はできない
サンプルソース
変数名など一部変更しています。
class Person
{
public $name;
public $age;
// コンストラクタの定義
public function __construct($name, $age)
{
echo "インスタンスが生成されました。\n";
//渡された引数をプロパティへ代入
$this->name = $name;
$this->age = $age;
}
public function showName()
{
echo "名前: " . $this->name;
}
}
$person = new Person("きらり", 28);
$person->showName();
出力結果
インスタンスが生成されました。
名前: きらり
疑問点
インスタンス生成時のPerson("きらり", 28)
2つの引数はクラスの中の__construct($name, $age)
に引き渡されているのだから
// ▼これって宣言する必要ないのでは?
public $name;
public $age;
実際なくても出力結果は同じ
じゃあなぜわざわざ宣言しているの?
以下のような利点があるからです。
-
コードの可読性とメンテナンス性:
プロパティを宣言しておくと、クラスがどのようなデータを持っているのかが明確になり、後でコードを読む際にわかりやすくなります。 -
静的解析ツールやIDEのサポート:
IDE(統合開発環境)や静的解析ツールは、明示的に宣言されたプロパティを元にコード補完やエラーチェックを行うことができます。プロパティを宣言しないと、コード補完が機能しなかったり、ミスを検知しづらくなることがあります。 -
厳密なプロパティの管理:
プロパティを明示的に宣言しておくことで、クラスに存在しないプロパティに誤ってアクセスした場合にエラーが発生するなど、バグを防ぎやすくなります。動的にプロパティを追加できると、誤ったプロパティ名で値を設定した場合に気づきにくくなる可能性があります。
他の書き方
__construct
の中にまとめて書けば、インスタンス生成時に名前がすぐに表示されるため、動作が一箇所にまとまっており、コードがコンパクトです。これは、非常にシンプルな処理をする場合や、インスタンス生成と同時に何かを必ず出力したい場面では有利です。
class Person
{
public $name;
public $age;
public function __construct($name, $age)
{
echo "インスタンスが生成されました。\n";
$this->name = $name;
$this->age = $age;
// showName() の中身をここに書いてしまっても出力結果は同じになる
echo "名前: " . $this->name;
}
}
$person = new Person("きらり", 28);
出力結果
インスタンスが生成されました。
名前: きらり
メソッド(関数)を分けて書くメリットは?
以下のような利点があるからです。
-
関心の分離:
上のコードでは、コンストラクタ__construct()
の役割はインスタンスの生成とプロパティの初期化に限定されています。名前を表示する処理はhowName()
メソッドで行われています。これにより、インスタンスの生成と表示ロジックが明確に分離されています。
分離することで、インスタンス生成時の動作と表示の動作が別々に管理でき、コードがシンプルでわかりやすくなります。 -
再利用性:
上のコードでは、showName()
メソッドを呼び出すことでいつでも名前を表示できます。一方、下のコードでは、名前はインスタンス生成時にしか表示されません。つまり、任意のタイミングで名前を表示できるという再利用性が上のコードの利点です。
例えば、将来的に「名前を表示するタイミングが変更される」や「別の箇所で名前を表示したい」というケースが発生した場合、上のコードではshowName()
を呼ぶだけで済むので、柔軟性が高いです。 -
コードの保守性:
上のコードは、個別の責務に応じてメソッドを分割しているため、変更や拡張がしやすくなります。例えば、将来的に名前を表示するフォーマットを変更したい場合、showName()
メソッドだけを修正すれば良いので、コードの保守が簡単です。
まとめ
- プロパティを明示的に宣言することが推奨される(PHP 8.2以降では警告が出る)。
- シンプルな処理の場合には
__construct
の中にまとめることでコンパクトになる。 - 再利用性やコードの保守性が必要になりそうならメソッド(関数)を分離させる方が分かりやすくなる。