こんにちは、CTOの奥田です。
いよいよこの時が来たかという感じではありますが、今回のPHP入門はついに「オブジェクト指向」についてです。
ギターで言うと「F」と私はよく言っているのですが、それぐらいオブジェクト指向は理解するのが難しく、挫折する人が多いのではないかと思います。
今回はできる限り難しくないようにクラスの概念だけをご説明できればと思います。
Table of contents
オブジェクト指向とは
今までの解説ブログでご説明してきたPHPの記法はいわゆる「手続き型」と呼ばれるもので、設計図無しでただコードを書いてくようなイメージでした。
それとは反対にオブジェクト指向とはクラスを用いて関連するデータとメソッドを組み合わせ、設計をしっかりして構成しましょうという考え方です。
オブジェクト指向の概念を理解するのは非常に難しいと思いますが、簡単に言うと構造化して使いまわしやすくしましょうということです。
クラスとは
PHPのクラスとは変数と関数の集合体だと思っていただければわかりやすいと思います。
クラスの中には、定数や変数、関数を含めることができます。
クラス内の定数や変数を「プロパティ(メンバ変数)」、関数を「メソッド(メンバ関数)」と呼びます。
下記がクラスの例です。メソッド内からプロパティを呼び出す場合は疑似変数$thisを使用します。
また、定数を参照するにはself::定数名を使用します。
<?php class SimpleClass { // プロパティの宣言 public $var = 'a default value'; const CONSTANT = 'constant value'; // メソッドの宣言 public function displayVar() { echo $this->var; echo self::CONSTANT; } }
インスタンスとは
先ほど定義したクラスはただ定義しただけでは使用できません。
以下のように「new」キーワードを使用することでオブジェクトを生成できます。これをインスタンスの生成といいます。
また、インスタンスのプロパティやメソッドにアクセスするにはアロー演算子(->)を使用します。
<?php $instance = new SimpleClass(); $instance->displayVar(); // a default value constant value
コンストラクタ
インスタンス生成時にオブジェクトを初期化したい場合にコンストラクタメソッドを使用できます。
コンストラクタメソッドは以下のように引数を指定する事もでき、インスタンス生成時に__construct()が自動的に実行されます。
<?php class User{ public $name; function __construct($name){ $this->name = $name; } } $user = new User("Mineo Okuda"); echo $user->name; // Mineo Okuda
クラスの継承
オブジェクトは継承することができます。
クラスを継承したい場合にextendsを使用します。extendsを使用すればサブクラスは親クラスからメソッドの内容を引き継ぎ、拡張することができます。
<?php class User{ public $name; function __construct($name){ $this->name = $name; } public function sayHi() { echo "Hi, $this->name from User class"; } } class AdminUser extends User { public function sayHi() { echo "Hi, $this->name from AdminUser class"; } } $user1 = new User("Aoba Suzukaze"); $user2 = new AdminUser("Nene Sakura"); $user1->sayHi(); // Hi, Aoba Suzukaze from User class $user2->sayHi(); // Hi, Nene Sakura from AdminUser class
アクセス修飾子
アクセス修飾子とはプロパティやメソッドにどこからアクセスできるかを指定するものです。
指定には「public」「private」「protected」の3つのどれかを指定します。
public | クラス内、クラス外のどこからでもアクセス可能 |
---|---|
private | 同じクラス内からのみアクセス可能 |
protected | 同じクラス、及び子クラスからアクセス可能 |
以下のようにprivateメソッドにインスタンスからアクセスしようとするとエラーとなります。
<?php class User{ private function privateMethod(){ echo "Private method."; } } $user = new User; $user->privateMethod(); // Fatal error: Uncaught Error: Call to private method User::onlyUserMethod() from context ''
静的メンバ
クラスのインスタンスを生成しなくても、クラスのメンバにアクセス可能なメンバのことを静的(static)メンバと呼びます。
以下のようにstaticキーワードを付けたプロパティやメソッドは「::」を使用し、インスタンスを生成することなくアクセスが可能です。
<?php class User{ public static function sayHi() { echo "Hi,"; } } User::sayHi();
さいごに
今回はオブジェクト指向に欠かせないクラスについてご説明いたしました。
オブジェクト指向プログラミングは本当に奥が深く、理解するのにとても時間がかかります。
まずはさわりだけでも良いのでクラスに触れてみてはいかがでしょうか。
少しでも皆様の参考になれば幸いです。