カテゴリー : 2013年 8月9日

メソッド

クラスで管理される値を処理するための関数です。 メンバ関数とも言います。

Personクラスに表示用メソッド(下記コード)を追加していきます。

$thisは特別な変数で現在のインスタンスオオブジェクトをさしています。アロー演算子でプロパティを指定することによって参照が可能になります。
ではこのクラスを実行してみましょう。各プロパティに値を代入後

でメソッドを実行させます。
(Personクラスのインスタンス$pの中のshow()メソッドを実行してください)といった訳になるでしょうか。

コンストラクタ

インスタンス化のタイミングで実行されるメソッドがあります。 それがコンストラクタと呼ばれるものです。コンストラクタの名前は__constractに固定されていて自分で勝手に変更することはできません。
プロパティの初期化 クラスの内部で利用をする外部ソースの初期化などが主な役割となります。
では、コードをみてみましょう。
Personクラスに下記コードを追加

実行方法は、

コンストラクタを設定すると、インスタンス化のタイミングで引数を渡しプロパティに値を渡すことができることができますね。

コンストラクタの反対で、オブジェクトの破棄のタイミングで実行されるデストラクタというのもありますが、あまり使わないので述べません。

静的メソッド

インスタンスを生成しなくてもクラスから直接呼び出すことができるメソッドは静的メソッドといいます。
今回はAreaクラスを作成します。(もちろん、Area.phpを作成することを忘れずに)

このクラスは、円の面積を求める、circleという静的メソッドのみのクラスです。これを実行させて見ましょう。

このように::演算子でクラス名とメソッドをつないで使用することができます。

注意点
静的メソッドの中ではthisキーワードは使えない。
::演算子はインスタンスメソッドも呼び出せるがしないほうがいい

静的プロパティ

クラスから直接呼び出せるプロパティを静的プロパティといいます。
静的メソッドと同じくstaticキーワードを使用します。

Areaクラスを下記のように変更してください

静的メソッド内で呼び出す際にselfキーワードと::演算子でつなぎます。

実行コードに下記を追加してください。

::演算子でプロパティを参照できますね。

もっと使いやすいものが次に紹介する、クラス定数です。

クラス定数

constキーワードを使用します。 クラス内定数のconstはPHP5.2系でも正常動作します。
Areaクラスの静的プロパティの部分を下記のように書き換えましょう。

実行時は、クラス名::静的プロパティ名ではなく、クラス名::クラス定数名 で実行してください。

こちらのほうが、クラスに関する定数を管理できるので可読性保守性がたかまりますね。

クラスのちょっと練習問題1

与えられた引数$width,$heightから四角形の面積を求めるsquareメソッドを定義してください。なおsquareメソッドは静的メソッド、クラス名はMyClassとします。

カプセル化 アクセス修飾子

簡単に説明するとクラス外からの利用を制限し、修正を最低限に抑えるという事です。
処理を中に閉じ込めるという感じでしょうか。
クラス内のフィールド(メンバ変数)や処理(メソッド)は修飾子でアクセス制限をできます。
これによって、各クラスを作成する場合に管理性が高まります。

アクセス修飾子を使うことによって実現できます。

アクセス修飾子 概要
public どこからでもアクセス可能(デフォルト)
protected 現在のクラスとサブクラスからのみアクセスできる。
private 現在のクラスからのみアクセス可能

では、ちょっと実験。

先ほど作ったPersonクラスのshowメソッドのアクセス修飾子をprivateに変更して実行してください。

エラーが出たはずです。これは、非公開のメソッドを外部からアクセスしようとしたためです。

 

アクセサメソッド

カプセル化の典型として、プロパティの隠蔽と、アクセサメソッドに触れてみます。

まずは、三角形の面積を求めるTriangleFigureクラスを作ってください。(ファイルも忘れずに)

次にこれを実行するときに、下記のように負の数や文字列を与えて見ましょう。

実際に使うためにはこのような結果を出されるとこまってしまいますね。
このように必要とする値がわたったときにチェックする場合、いろいろな方法が考えられると思いますが、カプセル化を行い、アクセス制限をうまく利用する方法がクラス~オブジェクト指向では定番となります。 では実際に行ってみましょう。
まずは、プロパティをprvate権限に変更します。

コンストラクタとメソッドの間に下記のように、各プロパティのゲッタ、セッタメソッドを準備します。

各セッタメソッドで数字で且つ正の数であることのチェックをしています。

  • ゲッタメソッド(get****(){}) プロパティ値を取得するメソッド
  • セッタメソッド(set****(){}) プロパティ値に設定するメソッド

メソッド内の処理を下記のように書き換えてください。

実行時のコードを下記のように書き換えてください。

こうすることによって、プロパティを外部からは隠蔽化しておき、一旦セッタメソッドでチェックし、プロパティ値を設定。ゲッタメソッドで値を取得し、期待する値をしっかりと計算することができましたね。

クラスの練習問題2

下記の問題を練習サイトに記述をしてください。
 
その1 
 アクセス修飾子の簡単な説明
その2
 アクセサメソッドを介してメンバ変数(プロパティ)にアクセスするメリットは何でしょうか?

継承

継承とは簡単にいうと継承とは、既に存在するあるクラスを元に、それを更に拡張したクラスを作る仕組みです。
継承元となるクラスはスーパークラス。継承の結果できたクラスをサブクラスと言います。

具体例として先ほど作成したPersonクラスと似たようなクラスBusinessPersonを作ってみます。

*require_once dirname(__FILE__).’/Person.php’のdirname(__FILE__)でファイルの絶対パスを通して、インクルードの動作を確実にしています。

実行コードで

このようにして見ましょう。
インスタンスを行っているのは、BusinessPersonクラスのみです。しかし、Pesonクラスのメソッドshow()にもアクセスが可能ですね。サブクラスからはスーパークラスのあれやこれやが参照できるのです。
順番としては、インスタンス化されたクラスの参照先を探し、なければ継承元(スーパークラス)に参照を求めるという動きです。

ちなみに、PHPでは多重継承はみとめていません。