戻る

クラスを使う(PHP4)

オブジェクトとは?

クラスを使うときには必ず「オブジェクト指向」という言葉を耳にします。オブジェクト指向って、聞くだけで難しそうですね。

「オブジェクト」というのは「もの」のことです。「もの」といっても物体である「人」も「動物」も「植物」も、それから「物」も、空から目に見えない仕組みや存在、お父さんやお母さんのような抽象的なものなども、すべてオブジェクトです。

プログラムでは、ある機能をひとつのオブジェクトとして作り、他の機能のオブジェクトとのやりとりでまた別の機能を作り上げていく方法がオブジェクト指向と呼ばれます。

クラスとは?

ゼリーをオブジェクトとして考えてみましょう。

一口にゼリーと言ってもさまざまです。ゼリーには「オレンジ」「珈琲」「ワイン」などいろいろな種類があり、甘さが言もさまざまで、甘くないゼリーかもしれません。それからプルプル度合いも違います。

もしかしたら上にトッピングがしてあるかもしれません。そして出来上がったゼリーは食べたり、他のお料理に使ったり、と用途は様々です。

「ゼリーを作る」という製造の工程(雛形)、これが「クラス」です。

インスタンスとは?

このゼリークラスによって誰かが作る「生クリームがのった珈琲ゼリー」や「果肉入りオレンジゼリー」がインスタンスと呼ばれます。

ゼリーを作るときに、作る人の意思により、「珈琲ゼリー」や「オレンジゼリー」という風に、そのゼリーの特徴・個性を与えることができるのです。

そのために、クラスは誰かがゼリーの「属性」やゼリーの味を変える「命令」を用意しておきます。

クラスの作成

関数や変数の使い方は通常のものと同様ですが、クラス変数の頭には「var」を付けます。この変数はクラス内でも、また呼び出し側でも、参照することができる変数となります。

varはPHP4、PHP5でもどちらでも有効です。(2011年10月時点)。PHP5でのvarはpublicとと同様の意味となります。

クラスの構文

class クラス名{
	
	var $クラス内変数名;
	
	function クラス内関数([,引数1][,引数2][,引数3]){
		
		(メンバ関数)
		
	}
}

インスタンスの作成

クラスからインスタンスを作成するには、下の構文を使用します。

ゼリーオブジェクトのクラスを例に実際にコードを記述してみましょう。

クラス内でのインスタンス作成の構文

インスタンスオブジェクト = new クラス名;

ゼリーオブジェクトのクラス

class jelly{
	//$m_ajiというクラス内の変数(味属性)
	var $m_aji = "味なし";
	
	//$m_amasaというクラス内の変数(甘さ属性)
	var $m_amasa = "甘くない";
	
	//jelly関数(クラス名と同一名なのでコンストラクタとなる)
	function jelly($aji){
		$this->m_aji = $aji;
	}
	
	//関数dekiagari(ゼリーを完成させる命令)
	function dekiagari(){
		return $this->m_amasa . $this->m_aji . "ゼリー";
	}
}

ゼリーオブジェクトクラスのインスタンスを作成

$m_jelly = new jelly("オレンジ");

①まず、varでクラス内変数$m_aji(味)と$m_amasa(甘さ)が宣言され、2つの変数が使えるようになります。

②次にjellyクラスの「コンストラクタ」であるfunction jellyが実行されます。
コンストラクタには引数を渡すことができます。このインスタンスでは「オレンジ」を引数に渡しています。コンストラクタのjelly関数内で「$this->m_aji = $aji;」とクラス内関数の「$this->m_aji;」に引数を渡します。

コンストラクタとは

コンストラクタとは、インスタンスを作成するときに、自動的に呼び出されるクラス内の特殊な関数のことです。
クラスメイト同じ名前の関数は自動的にコンストラクタとなり、「new」された時点で実行されます。

クラス内関数でクラス内変数へのアクセス方法

クラスの中の関数で、クラス内変数にアクセスする際は、「$this->クラス内変数」と記述します。

クラス内関数の呼び出し

インスタンス名->関数名();

では、どんなゼリーができているかdekiagari関数で取り出してみましょう。

dekiagari()関数で結果を出力

echo $m_jelly->dekiagari();

甘くないオレンジゼリー

もう1つ、珈琲を引数にインスタンスを作成してみましょう。

dekiagari()関数で結果を出力

$m_jelly2 = new jelly("珈琲");
echo $m_jelly2->dekiagari();

甘くない珈琲ゼリー

もう少し機能を付けてみましょう。

関数の追加

class jelly{
	
	var $m_aji = "味なし";
	var $m_amasa = "甘くない";
	var $m_topping = "";
	var $m_kaniku = "";
	
	function jelly($aji){
		$this->m_aji = $aji;
	}
	
	function toudo($amasa){
		if($amasa == "1"){
			$this->m_amasa = "ちょっぴり甘い!";
		}
		else{
			$this->m_amasa = "とっても甘い♪";
		}
	}
	
	function ue($topping){
		if($topping == "1"){
			$this->m_topping = "生クリームトッピング";
		}
		else{
			$this->m_topping = "フルーツソーストッピング";
		}
	}
	
	function naka($kaniku){
		if($kaniku == "1"){
			$this->m_kaniku = "つぶつぶ果肉入り";
		}
		else{
			$this->m_kaniku = "まるごと果肉入り";
		}
	}
	
	function dekiagari(){
		return $this->m_amasa . $this->m_topping . $this->m_kaniku . $this->m_aji . "ゼリー";
	}
}

インスタンスを作成

$my_jelly1 = new jelly("オレンジ");
$my_jelly1->toudo("2");
$my_jelly1->ue("1");
$my_jelly1->naka("2");
echo $my_jelly1->dekiagari();

とっても甘い♪生クリームトッピングまるごと果肉入りオレンジゼリー

クラス内変数の参照

$my_jelly3 = new jelly("ワイン");
$my_jelly3->topping("1");
echo $my_jelly3->m_topping;

生クリームトッピング

クラスの継承

クラス継承の構文

class 作成するクラス extends 継承元クラス{
	(処理)
}

ゼリーを親クラスとした派生クラスの「プリンクラス」

class pudding extends jelly{
	function pudding($aji){
		$this->m_aji = $aji;
	}
	
	function dekiagari(){
		return $this->m_amasa . $this->m_topping . $this->m_kaniku . $this->m_aji . "プリン";
	}
}

マンゴープリンを作るコード

$my_pudding = new pudding("マンゴー");
$my_pudding->toudo("2");
$my_pudding->ue("1");
$my_pudding->naka("2");
echo $my_pudding->dekiagari();

とっても甘い♪生クリームトッピングまるごと果肉入りマンゴープリン

inserted by FC2 system