コンストラクタ

 今まで作成したCarクラスは、オブジェクトを生成後に初期化して使用してもらいました。もし、初期化せずに使用するとどうなるのでしょうか?ガソリンが0リッターなので、加速しても走りません。Carクラスには初期化メソッドが用意されており、Carクラスを利用する側が呼び出しの記述をしないと初期化されません。そこで、オブジェクトを生成した時に初期化をするように調整しましょう。そのようなときに利用できる仕組みが「コンストラクタ」です。

 コンストラクタは、クラスからインスタンス生成をする際にプロパティに値を設定するなどの初期設定を行う機能です。インスタンス生成を行う際に呼び出される特別なメソッドを記述します。

コンストラクタ定義の書式
アクセス権 function __construct(仮引数リスト){
 プロパティの初期化処理など
}

○ ファイル

 Carクラスにコンストラクタの記述を追加しましょう。

ファイルの種類 PHPファイル
ファイル名 Car.php

サンプルダウンロード

○ プログラム

 次のようにプログラムを入力してください。

Car.php

  1. class Car
  2. {
  3.  //プロパティ==========
  4.  //public $speed = 0; //スピード情報
  5.  private $speed = 0; //スピード情報(修正)
  6.  //public $gas = 0.0; //ガソリン情報
  7.  private $gas = 0.0; //ガソリン情報(修正)
  8.  //コンストラクタ==========
  9.  public function __construct($gas){
  10.   $this -> speed = 0;
  11.   $this -> gas = $gas;
  12.  }
  13.  //メソッド
  14.  //加速させるメソッド
  15.  public function speedUp($sp){
  1.  //減速させるメソッド
  2.  public function speedDown($sp){
  3.   //スピードを減らす
  4.   $this -> speed -= $sp;
  5.   if($this -> speed < 0){ //スピードがマイナスになる場合
  6.    //スピードを0に補正する
  7.    $this -> speed = 0;
  8.   }
  9.  }
  10.  //初期化を行うメソッド
  11.  //public function init($gas){
  12.   //$this -> speed = 0;
  13.   //$this -> gas = $gas;
  14.  //}

○ クラス図

○ 解説

 12~15行目でコンストラクタを定義しています。このコンストラクタは引数として設定するガソリン量を受け取り、スピード情報に「0」をセットし、ガソリン量を引数で受け取ったデータでセットします。

 42~45行目では、コンストラクタを定義することにより初期化を行うメソッドが不要になりましたので、コメントアウト(削除)しています。

○ ファイル

 コンストラクタが用意されたので、インスタンスを生成する記述も変更しましょう。「CapsuleTest.php」ファイルをコピーして、「ConstructTest.php」を作成してください。

ファイルの種類 PHPファイル
ファイル名 ConstructTest.php

○ プログラム

  次のように修正してください。

ConstructTest.php

  1. //車の状態を表示する関数
  2. function showData($car){
  3. //print('スピード:' . $car -> speed . 'km<br>');
  4. print('スピード:' . $car -> getSpeed() . 'km<br>');
  5. //print('ガソリン:' . $car -> gas . 'L<br>');
  6. print('ガソリン:' . $car -> getGas() . 'L<br>');
  7. }
  8. //インスタンスを生成する
  9. $car = new Car(40);
  10. //プロパティを初期化する
  11. //$car -> speed = 0;
  12. //$car -> gas = 20.0;
  13. //$car -> init(20);

○ 実行結果

実行結果
実行結果

○ 解説

 28行目で、プロパティを初期化するメソッドの呼び出しは廃止されたため、コメントアウトして実行させないようにしました。その代わりに用意されたコンストラクタで初期化をするために23行目では、インスタンス生成時の引数にガソリン量のデータを渡しています。

 このように、Carクラスのインスタンス生成の記述をするだけで初期化されるようになります。

前へ   次へ