クラスを使うときには必ず「オブジェクト指向」という言葉を耳にします。オブジェクト指向って、聞くだけで難しそうですね。
「オブジェクト」というのは「もの」のことです。「もの」といっても物体である「人」も「動物」も「植物」も、それから「物」も、空から目に見えない仕組みや存在、お父さんやお母さんのような抽象的なものなども、すべてオブジェクトです。
プログラムでは、ある機能をひとつのオブジェクトとして作り、他の機能のオブジェクトとのやりとりでまた別の機能を作り上げていく方法がオブジェクト指向と呼ばれます。
ゼリーをオブジェクトとして考えてみましょう。
一口にゼリーと言ってもさまざまです。ゼリーには「オレンジ」「珈琲」「ワイン」などいろいろな種類があり、甘さが言もさまざまで、甘くないゼリーかもしれません。それからプルプル度合いも違います。
もしかしたら上にトッピングがしてあるかもしれません。そして出来上がったゼリーは食べたり、他のお料理に使ったり、と用途は様々です。
「ゼリーを作る」という製造の工程(雛形)、これが「クラス」です。
このゼリークラスによって誰かが作る「生クリームがのった珈琲ゼリー」や「果肉入りオレンジゼリー」がインスタンスと呼ばれます。
ゼリーを作るときに、作る人の意思により、「珈琲ゼリー」や「オレンジゼリー」という風に、そのゼリーの特徴・個性を与えることができるのです。
そのために、クラスは誰かがゼリーの「属性」やゼリーの味を変える「命令」を用意しておきます。
関数や変数の使い方は通常のものと同様ですが、クラス変数の頭には「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関数で取り出してみましょう。
echo $m_jelly->dekiagari();
甘くないオレンジゼリー
もう1つ、珈琲を引数にインスタンスを作成してみましょう。
$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();
とっても甘い♪生クリームトッピングまるごと果肉入りマンゴープリン