10週間ウェブ開発講座

裏メニュー第三週

クラスとオブジェクト

PHPのクラスとオブジェクトについて解説します。

クラスとオブジェクトの概要

クラスとはオブジェクトの設計図です。
クラスが定義されていなければ、そのオブジェクトを作ることはできません。
オブジェクトは何れかのクラスから作られるので「xxクラスのオブジェクト」と表現することがあります。

オブジェクトの設計図であるクラスは次のような情報を持ちます。

  • クラス名
  • (コンストラクタ: 0~1個存在する)
  • (デストラクタ: 0~1個存在する)
  • (メンバ関数*1: 0個以上存在する)
  • (メンバ変数*2: 0個以上存在する)

各々の情報については後述します。
クラスをPHPのプログラムとして表現すると次のようになります。

  1. <?php
  2. class Sample {
  3.   // メンバ変数
  4.   var $member1;
  5.   var $member2;
  6.  
  7.   // コンストラクタ
  8.   function __construct() {
  9.       echo "Hi! I'm a constructor!\n";
  10.   }
  11.  
  12.   // メンバ関数
  13.   function method1() {
  14.       echo "Hi! I'm a method1!\n";
  15.   }
  16.  
  17.   // メンバ関数
  18.   function method2() {
  19.       echo "Hi! I'm a method2!\n";
  20.   }
  21.  
  22.   // デストラクタ
  23.   function __destruct() {
  24.     echo "Hi! I'm a destructor!\n";
  25.   }
  26. }
  27.  
  28. $sample = new Sample(); // オブジェクトを生成する(同時にコンストラクタが呼ばれる)
  29. $sample->method1(); // method1 が呼ばれる
  30. $sample->method2(); // method2 が呼ばれる
  31. ?>

"class ..." から始まる2行目から26行目の部分をクラス定義と呼びます。
28行目で「new Sample()」としています。
「new クラス名(コンストラクタへの引数)」の形式でオブジェクトを生成します。

コンストラクタとデストラクタ

コンストラクタはクラスからオブジェクトを生成するときに呼ばれる特別な関数です。
オブジェクトの初期化を行うプログラムなどを記述します。

デストラクタはオブジェクトを破棄するときに呼ばれる特別な関数です。
PHP5では「オブジェクトが誰からも参照されなくなった」ときにオブジェクトが破棄されます。

作成するクラスの目的次第でコンストラクタやデストラクタの定義を省略することもあります。

メンバ関数とメンバ変数

メンバ関数はオブジェクトに属する関数です。 先述の通り、メンバ関数は「$オブジェクト->メソッド名()」の形式で呼び出すことができます。

メンバ変数はオブジェクトに属する変数です。
またメンバ変数はオブジェクト同士で共有しません。
メンバ変数は「$オブジェクト->メンバ変数」の形式で参照することができます*3

<?php
class Sample {
  var $member1;
  var $member2;

  function __construct() {
    $this->member1 = 3.14;             // メンバ変数$member1に3.14を代入
    $this->member2 = 'Hello, World!!'; // メンバ変数$member2に'Hello, World!!'を代入
  }
}

$sample = new Sample(); // オブジェクトを生成する(同時にコンストラクタが呼ばれる)
echo $sample->member1; //=> 3.14
echo $sample->member2; //=> 'Hello, World!!'
?>

この例ではSampleクラスのコンストラクタでメンバ変数を初期化しています。
コンストラクタでメンバ変数を指定するときに$thisという変数を使用しています。
$thisは「メソッドが属するオブジェクト内でそのオブジェクト自身を示す」疑似変数です。

クラスの継承

あるクラスの定義を元にクラスを拡張したいことがあります。
拡張の内容としては次のようなものがあります。

  • コンストラクタを変更する
  • メンバ変数を追加する
  • メンバ関数を追加する
  • メンバ関数を書き換える*4
  • デストラクタを変更する

クラスの継承はextendsというキーワードを使用して行います。

<?php
class SampleA {
  var $a;
  function __construct() {
    $this->a = 'a';
  }
  function foo() {
    echo "I'm a function foo() defined at SampleA.\n";
  }
  function hoge() {
    echo "I'm a function hoge() defined at SampleA.\n";
  }
}

class SampleB extends SampleA {
  // メンバ変数の追加
  var $b;

  // コンストラクタの変更
  function __construct() {
    $this->b = 'b';
    parent::__construct(); // parent::__construct() で親クラスのコンストラクタを呼び出す
  }

  // メンバ関数の書き換え(オーバーライド)
  function foo() {
    echo "I'm a function foo() defined at SampleB.\n";
  }

  // メンバ関数の追加
  function bar() {
    echo "I'm a function bar() defined at SampleB.\n";
  }
}

$sample_a_obj = new SampleA();
$sample_b_obj = new SampleB();

$sample_a_obj->foo(); //=> I'm a function foo() defined at SampleA.
$sample_b_obj->foo(); //=> I'm a function foo() defined at SampleB.
$sample_b_obj->hoge(); //=> I'm a function hoge() defined at SampleA.
$sample_b_obj->bar(); //=> I'm a function bar() defined at SampleB.
echo $sample_b_obj->a . "\n"; //=> a
echo $sample_b_obj->b . "\n"; //=> b
?>

クラスの継承元を親クラスと呼びます*5
またクラスの継承先(extendsキーワードを付与する方)を子クラス*6と呼びます。

宿題

親クラスとして哺乳類クラス(Mammal)を定義し、それを継承した子クラスとして人間クラス(Human)も定義してください。

Mammalクラスは次のメンバ変数とメンバ関数を持ちます。

  • 【メンバ変数】年齢
  • 【メンバ変数】体重
  • 【メンバ関数】老化()

Humanクラスは次のメンバ変数とメンバ関数を持ちます。

  • 【メンバ変数】身長
  • 【メンバ関数】老化()

Humanクラスの老化は成長を伴います。成長とは例えば次のようなことです。

  • 身長の増減
  • 体重の増減

細かく指定していない部分については自由に記述してください。

参考資料


*1 クラス関数、クラスメソッドまたは単純にメソッドと呼ばれることもあります。
*2 クラス変数と呼ばれることもあります。
*3 ただし、このような形式でメンバ変数を参照することはオブジェクト指向の「カプセル化」の概念に背きます。
*4 メンバ関数を書き換えることを、関数の「オーバーライド」と呼びます。
*5 既定クラスまたはスーパークラスと呼ばれることもあります。
*6 派生クラスまたはサブクラスと呼ばれることもあります。

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2010-04-20 (火) 09:13:56 (138d)