カテゴリー : クラス

クラスの基本1

みなさんの練習サイトに、「クラス」というページを作って置いてください。 ファイル名はなんでもいいです。あと、classesフォルダも作っておいてください。

クラスを学習する上で、一般的な記法また、ルールを最初に覚えてください。

  • クラス名は、頭大文字にする。 →class Namae{ }
  • 作成したクラスはクラス名と同じ名前のPHPファイルを作成してそこで管理をする。 →上記のクラスを作成する場合はNamae.phpファイルを作成し記述をしていく。

では早速ひとつクラスを作ってみます。

これで終わりです。記述する場所は? 上記のルールに照らし合わせて作ってくださいね。
そして、サイトのクラスページからこのクラスを呼び出していくのです。

このままだとPersonクラスはなにもおきませんが、これから記述していきますので心配なさらずに。
$p = new Person();の部分はインスタンス化といいます。
インスタンス用の変数 = new演算子 クラス名()  でクラスを使えるようにするのです。

プロパティ

先ほどのPerosn クラスに上記のような追加を行ってください。
これをプロパティと呼びます。
publicと書かれているのはアクセス修飾子と呼びます。 これはプロパティへのアクセス域をコントロールするものです。今回はどこからでもアクセスをしたいので publicというアクセス修飾子を使っていきます。

では、プロパティを初期化して見ましょう。それぞれのプロパティに自分の名前を代入してみてください。やり方は練習サイトのクラスページでインスタンスをおこなったたので、そこからやってみましょう!

プロパティの初期化は、クラス内でも行うことはできます。

その後

メソッド

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

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****(){}) プロパティ値に設定するメソッド

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

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

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