2.1 オブジェクト指向プログラミングの基本
■クラス
「クラス」は、オブジェクト指向プログラミングの基本です。クラスはあることがらに関連した変数と関数の集まりをひとまとまりにしたものです。クラス内で定義される変数のことを「メンバー変数」(パラメータともいう)といいます。クラス内で定義される関数のことを「メンバー関数」(メソッドともいう)といいます。
クラスの定義の例
class message { // クラスの定義
private $_value; // メンバー変数(プロパティ)
function hello() { // メンバー関数(メソッド)
echo 'hello<br />!';
}
}
クラスは、それを利用するためには呼び出す必要があります。クラスを呼び出す方法には、オブジェクト経由で呼び出す方法と直接呼び出す方法があります。
■オブジェクト
オブジェクト経由で呼び出すためには、まずnew演算子を使って、クラスからオブジェクト(インスタンスともいう)を生成し、そこからアロー演算子「->」を使って、メソッドやプロパティを呼び出します。
オブジェクト経由でクラスを呼び出す例
$obj = new message(); // new演算子でクラスからオブジェクト(インスタンス)を生成
$obj->_value; // アロー演算子で、プロパティを呼び出す方法
$obj->hello(); // アロー演算子で、メソッドを呼び出す方法
プロパティ「$変数名」を呼び出す場合は、「オブジェクト->変数名」と「$」を記述しないで呼び出します。
オブジェクト経由でなく、直接クラスを呼び出す場合は、スコープ演算子「::」を使います。
直接クラスを呼び出す例
message::$_value; // スコープ演算子で、プロパティを呼び出す方法
message::hello(); // スコープ演算子で、メソッドを呼び出す方法
■アクセス権
プロパティおよびメソッドには、それぞれアクセス権を設定する必要があります。アクセス権には、public、protected、privateの3種類があります。
アクセス権の種類
public :クラス外部、継承先(派生)クラス、そのクラス内のどこからでもアクセス可能
protected :継承先(派生)クラス、そのクラス内からアクセス可能
private :そのクラス内からのみアクセス可能
次のサンプルファイルaccess1.phpをここでは、「c:\apache2.2\htdocs\zf\object\」フォルダに保存し、アクセスしてみます。
c:\apache2.2\htdocs\zf\object\access1.php
<?php
// クラスの定義
class message {
// そのクラス内のみからアクセス可能なプロパティの定義
private $_morning = 'Good morning!';
// どこからでもアクセス可能なプロパティの定義
public $_afternoon = 'Good afternoon!';
// そのクラス内のみからアクセス可能なメソッドの定義
private function goodbye() {
echo 'Goodbye!';
}
// そのクラス内のみからアクセス可能なメソッドの定義
public function hello() {
echo 'Hello!';
}
}
// オブジェクト(インスタンス)の生成
$obj = new message();
echo $obj->_afternoon; // 'Good afternoon!'と表示されます
$obj->hello(); // 'Hello!'と表示されます
なお、PHPのソースファイル等は、ここではすべて「UTF-8」コードで記述することとします。また、改行コードも「Zend
Framework PHP 標準コーディング規約」に準じて、「LFコード」とします。たとえば、エディタ「秀丸」では、ファイルを保存するときに、「エンコードの種類」を「Unicode(UTF-8)」に設定し、「改行コード」を「自動(改行=LF」に設定します。

ここでは、Apacheのドキュメントルートディレクトリを「c:Apache2.2\htdocs\」に設定しているので、ブラウザで
http://localhost:8080/zf/object/access1.php
にアクセスします。結果は以下のようになります。

次のサンプルaccess2.phpでは、クラス内でprivateプロパティとして定義された$_morningプロパティにクラスの外からアクセス(参照)していますので、エラーになります。
c:\apache2.2\htdocs\zf\object\access2.php
<?php
// クラスの定義
class message {
// そのクラス内のみからアクセス可能なプロパティの定義
private $_morning = 'Good morning!';
// どこからでもアクセス可能なプロパティの定義
public $_afternoon = 'Good afternoon!';
// そのクラス内のみからアクセス可能なメソッドの定義
private function goodbye() {
echo 'Goodbye!';
}
// そのクラス内のみからアクセス可能なメソッドの定義
public function hello() {
echo 'Hello!';
}
}
// オブジェクト(インスタンス)の生成
$obj = new message();
// クラスの外から、privateプロパティにアクセス
echo $obj->_morning; // エラーになります

次のサンプルaccess3.phpでは、クラス内でprivateプロパティとして定義された$_morningプロパティにクラスの外からアクセス(参照)していますので、エラーになります。
c:\apache2.2\htdocs\zf\object\access3.php
<?php
// クラスの定義
class message {
// そのクラス内のみからアクセス可能なプロパティの定義
private $_morning = 'Good morning!';
// どこからでもアクセス可能なプロパティの定義
public $_afternoon = 'Good afternoon!';
// そのクラス内のみからアクセス可能なメソッドの定義
private function goodbye() {
echo 'Goodbye!';
}
// そのクラス内のみからアクセス可能なメソッドの定義
public function hello() {
echo 'Hello!';
}
}
// オブジェクト(インスタンス)の生成
$obj = new message();
// クラスの外から、privateメソッドにアクセス
$obj->goodbye(); // エラーになります

■$thisオブジェクト
クラス内で使用される「$this」というオブジェクトは、そのクラスのオブジェクト自身を示すPHPで定義済みの特別なオブジェクトです。プロパティ「$変数名」を呼び出す場合は、「$this->変数名」と「$」を記述しないで参照します。
c:\apache2.2\htdocs\zf\object\this.php
<?php
// クラスの定義
class message {
private $_greeting = 'Hello!<br />';
// そのクラス内のみからアクセス可能なメソッドの定義
public function hello() {
// 同一クラス内のプロパティの呼び出し
$msg = $this->_greeting;
// 同一クラス内のメソッドの呼び出し
$this->display($msg);
}
// そのクラス内のみからアクセス可能なメソッドの定義
private function display($msg) {
echo $msg;
}
}
// オブジェクト(インスタンス)の生成
$obj = new message();
// クラスの外から、publicメソッドにアクセス
$obj->hello();

■コンストラクタとデストラクタ
コンストラクタとは、オブジェクトが生成されるときに一度だけ実行される特殊なメソッドです。コンストラクタのメソッド名はPHPで「__construct()」とすることとなっています。冒頭の「__」はアンダーラインが2個です。
デストラクタとは、オブジェクトが削除されるときに一度だけ実行される特殊なメソッドです。デストラクタのメソッド名はPHPで「__destruct()」とすることとなっています。
コンストラクタの例を次に示します。
c:\apache2.2\htdocs\zf\object\construct1.php
<?php
// クラスの定義
class message {
private $_greeting;
// コンストラクタ(オブジェクト生成時に一度だけ実行される)
public function __construct() {
$this->_greeting = 'Hello!<br />';
}
public function hello() {
echo $this->_greeting;
}
}
// オブジェクト(インスタンス)の生成
$obj = new message();
// クラスの外から、publicメソッドにアクセス
$obj->hello();

■クラスの継承
すでに定義済みのクラスをコピーすることを「クラスを継承する」といいます。クラスの継承は、単にコピーするだけでなく、新たにメソッドやプロパティを追加したり、元のクラスのメソッドを上書きして別の機能に書き換えたりできます。継承して生成されたクラスを「派生クラス」といいます。継承元のクラスを「基底クラス」といいます。派生クラスを生成するには「extends」キーワードを使います。
class 派生クラス名 extends 基底クラス名 {
(独自のメソッドやプロパティの追加など)
}
派生クラスの例を次に示します。
c:\apache2.2\htdocs\zf\object\extends.php
<?php
// 基底クラスの定義
class message {
public function hello() {
echo 'Hello!<br />';
}
}
// 派生クラスの定義
class my_message extends message {
// 新たなメソッドの追加
public function goodbye() {
echo 'Goodbye!<br />';
}
}
// オブジェクト(インスタンス)の生成
$obj = new my_message();
// 基底クラスのpublicメソッドにアクセス
$obj->hello();
// 派生クラスのpublicメソッドにアクセス
$obj->goodbye();

■クラス定数
クラス内で定数を定義できます。この定数を「クラス定数」といいます。クラス定数は「const」キーワードで定義します。クラス定数名の冒頭にはプロパティ名のように「$」を付与してはいけません。
クラス定数の例を次に示します。
c:\apache2.2\htdocs\zf\object\const.php
<?php
// 基底クラスの定義
class message {
// クラス定数の定義
const GREETING = 'Hello!<br />';
}
// 派生クラスの定義
class my_message extends message {
// クラス定数の定義
const GREETING = 'Good afternoon!<br />';
// 新たなメソッドの追加
public function display() {
// 派生クラスの定数の表示
echo self::GREETING;
// 基底クラスの定数の表示
echo parent::GREETING;
}
}
// オブジェクト(インスタンス)の生成
$obj = new my_message();
// publicメソッドにアクセス
$obj->display();

【参考文献】
藤野真吾:「PHPフレームワーク Zend
Framework入門」、ソーテック社、2007/9/30、
Chapter3-01オブジェクト指向プログラミング、pp.42-49
|