PHPなオブジェクト指向入門 vol.1

PHPなオブジェクト指向 vol.0に引き続き、今回はコーディング上の素朴な疑問。なお、PHP5ユーザはオブジェクト指向派が大多数で入門レベルのことは意味がないと思われるので、プロシージャ指向の方も多いと思われるPHP4ユーザを対象としています。


・var とか this って何だ?


シンプルな構文が嬉しいPHPですが、クラスになると見慣れない var $hennsu;とか $this->hennsu といった見慣れない構文が出てきます。

肥満度を求めるプログラムを例にとってこれらをみていきたいと思います。(肥満度については肥満度の計算を参照)。

// CheckBMIクラス
class CheckBMI{

var $tall;
var $weight;

function CheckBMI($tall, $weight){ //コンストラク
//引数を上で宣言したメンバ変数(プロパティ)にセット
$this->tall = $tall;
$this->weight = $weight;
}

function CalculateBMI(){
$BMI = $this->weight / ($this->tall * $this->tall);
return $BMI;
}
}

// CheckBMIクラスの使用例
$obj_BMI = new CheckBMI(1.70, 60); //インスタンス化。身長1.7m, 体重60kg
$BMI = $obj_BMI->CalculateBMI();
echo "身長" . $obj_BMI->tall . "メートル、体重" . $obj_BMI->weight . "キログラム。";
echo "そんなあなたの肥満度(BMI)は " . $BMI . " です。";

実行結果:
身長1.7メートル、体重60キログラム。そんなあなたの肥満度(BMI)は 20.7612456747 です。


まず、var でメンバ変数(プロパティとも呼ばれる)を宣言します。上の例では

var $tall;
var $weight;

のふたつの変数を宣言しています(ここで変数の初期化などもできますが、とりあえず宣言だけをするのが基本です)。


ここで宣言した変数はクラス内のどこからでも $his-> という形($this->tall や $this->weight)で取り出したり、値を変えたりすることができるようになります。


$this->〜 とは「このクラスで定義した〜」という意味[※1]ですが、プロシージャ指向の方には以下のように書くとわかりやすいかもしれません。

[※1]$thisはオブジェクト自身と言うのが適切な表現だと思います。


クラス内の function 〜 は実際にはメソッドと呼ばれるものですが、(構文上も function なので)定義関数と見なすと、var 〜 とはグローバル宣言のようなものです。$this-> のついた変数はいずれの関数でも値を変更・参照することができますが、$this->のない変数はローカル変数のため、その関数内でしか変更・参照できません。


ただし、クラスでは $this->CalculateBMI(); のように変数だけでなくメソッドも $this-> 〜、すなわち、このクラスの〜
という使い方ができることを頭の片隅に入れておく必要があります。



いまいちピンと来ない方のためにもう一例。

// CheckBMIクラス
class CheckBMI{

var $tall;
var $weight;

function CheckBMI($tall, $weight){ //コンストラク
//引数を上で定義したメンバ変数(プロパティ)にセット
$this->tall = $tall;
$this->weight = $weight;
$tall = $tall * 200; // $tallを単独で変更しても意味をなさない。
/**
* 以下のようにするとメンバ変数 $this->tall の値も変わるので意味をなします。
* $tall = $tall * 200;
* $this->tall = $tall;
*/
}

function CalculateBMI(){
$BMI = $this->weight / ($this->tall * $this->tall);
$this->tall = $this->tall * 100;// こ の 部 分 を 追 加!!
return $BMI;
}
}

// CheckBMIクラスの使用例
$obj_BMI = new CheckBMI(1.70, 60); //身長1.7m, 体重60kg
$BMI = $obj_BMI->CalculateBMI();
echo "身長" . $obj_BMI->tall . "センチメートル、体重" . $obj_BMI->weight . "キログラム。";
echo "そんなあなたの肥満度(BMI)は " . $BMI . " です。";


実行結果:
身長170センチメートル、体重60キログラム。そんなあなたの肥満度(BMI)は 20.7612456747 です。


CalculateBMIメソッドの途中に $this->tall * 100; という記述を追加しました。これによりCalculateBMIメソッドを実行した時点で、 $this->tall は1.7 から 170 という値に変化することがわかります。その結果、$obj_BMI->tall(クラスのメンバ変数 $this->tall に相当)は 170 という値になります。


今回は this をテーマにしましたが、(あるかはわかりませんが)次回は上記の例をとって、アクセサメソッドについて書いてみようと思っています。


※ちなみに JAVA では $this->hennsu を this.hennsu と書きます。ただ、JAVAでは this. を明示する必要がないため、一般的には省略されます。