コンストラクタは、
クラスがインスタンス化されたときに、自動で実行される特殊なメソッドです。
しかし、よく考えたら
自動で起動すると何か良いことあるの?
と、なりませんか?
今回は、コンストラクタの便利な使い方の例も見ていこうと思います。
コンストラクタについて
まず、押さえておくポイントは3つです。
- コンストラクタの書き方は「function __construct() {}」
- 起動させる条件は、インスタンス化すること
- 起動条件以外は通常の関数と同じように扱える
①コンストラクタの書き方
<?php
class sampleClass {
function __construct() {
echo 'おはよう';
}
}
?>
②起動条件は「インスタンス化」すること
コンストラクタの起動条件はインスタンス化をする事です。
つまり「new クラス名();」をした瞬間ですね。
では、本当にインスタンス化するだけで、コンストラクタが起動するか確認してみましょう。
<?php
class sampleClass {
function __construct() {
echo 'おはよう';
}
}
// sampleClassをインスタンス化
new sampleClass();
?>
sampleClassをインスタンス化するので「new sampleClass();」
これだけで良いはずです。
画面を更新して「おはよう」が出力されれば、コンストラクタの処理が動いていることになります。
(表示されることを確認してみてください。)
③基本的には通常のメソッドと同じような考えで扱える
コンストラクタは、起動条件以外はほとんど通常のメソッドと同じように扱うことができます。
具体的には、引数や仮引数の扱い方などは同じになります。
コンストラクタの何が便利なのか?
では、今回の本題です。
クラスをインスタンス化すると自動で起動するコンストラクタですが、
何がそんなに便利なのでしょうか?
【2-5】理解して書ける!クラスとインスタンスで登場したUserクラスを使います。
(形はちょっと削って変えてます)
<?php
// Userクラス
class User {
// プロパティ
public $name;
public $password;
// あいさつメソッド
function hello() {
echo 'おはようございます!';
}
}
// Userクラスをインスタンス化
$taro = new User();
$taro->hello();
?>
Userクラスは、その名の通りユーザを作るためのクラスです。
それをインスタンス化したということは、
いつかどこかのタイミングで名前やパスワードを決定しますよね。
そこでコンストラクタを使うと、
あ、ユーザを作りたいな
と思って、インスタンス化をしたと同時にこれらの情報をセットすることができます。
え、どうやって?
それをこれからやってみます。
引数を使って値を渡してみる
コンストラクタは通常のメソッドのように、実引数と仮引数をセットできます。
(引数の使い方についてはこちらをご覧ください)
<?php
// Userクラス
class User {
// プロパティ
public $name;
public $password;
// コンストラクタ
function __construct($name, $password) {
}
// あいさつメソッド
function hello() {
echo 'おはようございます!';
}
}
// Userクラスをインスタンス化
$taro = new User("太郎", "taro001");
$taro->hello();
?>
この時点では、値を受け取れる状態になっているだけで変数にセットされていません。
ここで渡した値は「プロパティ」として指定した変数の中に入れるようにします。
ここですね↓
// プロパティ
public $name;
public $password;
どのようにセットするのかという話ですが、ここで登場するのが「this」です。
thisを使ってプロパティにセットされる流れ
「this」はとりあえず「このクラスの」と読み替えてみてください。
先に完成形を載せておきます。
<?php
// Userクラス
class User {
// プロパティ
public $name;
public $password;
// コンストラクタ
function __construct($name, $password) {
$this->name = $name;
$this->password = $password;
}
// あいさつメソッド
function hello() {
echo $this->name . 'さん、おはようございます!';
}
}
// Userクラスをインスタンス化
$taro = new User("太郎", "taro001");
$taro->hello();
?>
thisを「このクラスの」と読み替えると、
$this->nameは「このクラスのname」とります。
つまり、それはプロパティに指定してある「$name」のことです。
次のようなイメージです。
値は①〜④の順番に動いていきます。
①(“太郎”, “taro001”) と($name, $password)について
- (“太郎”, “taro001”):インスタンス化時に渡す実引数
- ($name, $password):インスタンス化時に渡される実引数を受け取るための引数、仮引数
②$this->name = name; について
この部分の考え方は、仮引数で受け取った変数に値を代入するときと同じです。
今、仮引数に「太郎」が入っているので、それを$this->nameに代入する感じです。
③$this->name と プロパティについて
$this->name は「このクラスのname、つまりプロパティに指定してあるname」なので、
$this->name に何かを代入するというのは、プロパティに値をセットしたことと同じになります。
④実際に使用するとき
これも普通の変数と同じです。
$this->name で代入することができたのであれば、
以下のように同じく$this->name の形で使用することができます。
echo $this->name . 'さん、おはようございmす!';
プロパティを使うと何が便利なのか
一言で言うと、プロパティに設定しておくと
クラス内からどこからでもアクセスできるようになります。
基本的に変数は「{ }」の中で定義した分は、その中でしか使うことができません。
いわゆるスコープというやつですね。
よくみると、プロパティはクラスの「{ }」全体で囲われていますね。
つまり、クラス全体がプロパティで指定した変数の有効範囲ということになります。
まとめ
- コンストラクタの起動条件は、インスタンス化すること
- 基本的には通常のメソッドと扱い方は同じ
- thisを使ってプロパティに値をセットできる
- プロパティにセットしておくと、クラス内のどこからでもアクセスすることができる