クラスについて

クラスは今やPHPではメジャーのプログラミング技法なので是非覚えてほしいです。

クラス(class)は、簡単に言うと変数、と関数を一つにまとめるグループ定義です。
グループ定義された変数、関数をメンバ変数メンバ関数と呼びます。簡単なクラス定義は下記の通りです。

class SampleA {
public $date;
public function methodA(){
return $this->$date;
}
}

classの文字のあとにSampleAとありますが、コレがクラス名です。例では、”SampleA”というクラスを定義しています。

クラスが変数と違うのは、変数は宣言であって、クラスは定義という点です。
宣言は、宣言をするだけで使用可能な状態になります。
定義は、使用するにはnewを使いインスタンス化しないと使用することが出来ないのです。
(静的な宣言を行えばインスタンス化無しでも使用する事は可能ですが、ここでは触れません)

インスタンス化とは、ここまではおまじないとして触れていませんでしたが既に行っています。

$smarty = new MySmarty();

これです。
これはMySmartyクラスをnewしてインスタンス化しています。Smarty,MySmartyクラスはnewを行わないと、メンバ変数、メンバ関数を使用することは出来ません。

インスタンス化とは、定義されているクラスをメモリ上に展開し、使用可能にする事を言います。変数の宣言と同じ動作になります。

クラス定義をもう一度見てください。メンバ変数、メンバ関数にはコレまでとは違いpublicという文字が前についています。
これは、アクセス権です。アクセス権には3つがあります。

  1. pubilc(公開)
    アクセス制限がない
  2. protected(保護)
    定義のクラス、及び継承先(派生及び子クラス)のクラスのみアクセス出来る。
  3. private(非公開)
    定義のクラスしかアクセス出来無い。

アクセス権に関しては、下記のソースを見て下さい。

class SampleB {
public $numA;
protedted $numB;
private $numC;

public function getA(){ return $this->$numA; }
protected function getB(){ return $this->$numB; }
private function getC(){ return $this->$numC; }
}

$sample = new SampleB();
var_dump( $sample->$numA );
var_dump( $sample->$numB );
var_dump( $sample->$numC );

var_dump( $sample->getA() );
var_dump( $sample->getB() );
var_dump( $sample->getC() );

上記のソースを実行しようとしてもPHPエラーとなってしまうはずです。アクセス権がprotected, privateで定義されているnumB, numC, getB, getC に、アクセスしてしまっているからです。
numA, getAはpublicですのでエラーとなりません。
このようにクラスにはアクセス権があることを覚えておいてください。上記のSampleBも下記のようにすればエラーは解消されます。

class SampleB {
public $numA;
protedted $numB;
private $numC;

public function getA(){ return $this->$numA; }
public function getB(){ return $this->$numB; }
public function getC(){ return $this->$numC; }
}

$sample = new SampleB();
var_dump( $sample->$numA );

var_dump( $sample->getA() );
var_dump( $sample->getB() );
var_dump( $sample->getC() );

$sample->$numB, $sample->$numCは削除しました。
getB, getC関数はpublicにしました。こうすることで、メンバ変数自体にはアクセス権がなかったとしても関数によって値だけを取得することが出来ます。
このようにアクセス権を使えばread onlyの変数を作ることが出来るのです。

クラスにはまだ、継承関係の話があるのですが、ちょっと長くなるのでまたお話ししょうと思います。