はじめに
アドベントカレンダー12/15= 15記事目
PHPでクラスを書いていると、
「プロパティ(変数)を public にしているのに、コンストラクタって必要?」
という疑問を感じる瞬間があります。
そこで今回は、
- public と private の違い
- public にしているのにコンストラクタを使う意味
などをまとめて紹介したいと思います
🌱まずは、public と private の違い
◆ private
- クラスの外から直接アクセスできない
- 値を読み書きしたい場合は、メソッド(getter・setter)を作る必要がある
class Dog {
private $name;
public function __construct($name) {
$this->name = $name;
}
public function getName() {
return $this->name;
}
}
$dog = new Dog("ポチ");
echo $dog->getName(); // OK
echo $dog->name; // ❌ エラー(private のため直接アクセス不可)
ポイント :外部から勝手に書き換えられないので、安全性が高い。
◆ public
- 外から直接アクセスできる
- getter や setter を使わなくても良い
class Dog {
public $name;
}
$dog = new Dog();
$dog->name = "ポチ"; // OK(直接代入)
echo $dog->name; // OK(直接参照)
ポイント :手軽だが、どこからでも変更できてしまうため、管理がバラバラになりやすい。
ではpublic にしてるのに、コンストラクタは何のため?
publicプロパティは外から自由に触れるのに、
あえてコンストラクタを使うのはなぜなのか?
👇
「初期値セットの処理をまとめたいから」
class Dog {
public $name;
public function __construct($name) {
$this->name = $name;
}
}
$dog = new Dog("ポチ");
echo $dog->name; // "ポチ"
コンストラクタを使うことで、
- インスタンス生成と同時に値が必ずセットされる
-
$dog->name = "ポチ"と毎回手で書く必要がない - 「Dogは必ず名前を持つ」というルールを自然に守れる
というメリットがあります。
public + コンストラクタを使うメリット
✔ 初期化の抜け漏れ防止
$dog = new Dog();
$dog->name = "ポチ"; // ← 書き忘れると「名前なしの犬」ができる
✔ 可読性が上がる
new Dog("ポチ"); // 見ただけで「Dogの名前がポチと設定される」と分かる
✔ 複数の初期値をまとめてセットできる
class User {
public $name;
public $age;
public function __construct($name, $age) {
$this->name = $name;
$this->age = $age;
}
}
$user = new User("田中", 20);
さいごに
- public / private はアクセス制御の話
- コンストラクタは初期値セットの話
- この2つは別の役割であり、どちらも必要な場面がある
- public でもコンストラクタを使うのは
「初期化を確実にしたい」「処理をまとめたい」から
はじめのうちは「public なら全部外から触れるのに…?」と感じるかもしれませんが、
コードが増えるほどコンストラクタの便利さが分かってきました。
今後も不思議に感じた事をしらべてまとめてみた情報をかきしるしていきたいと思います