コラム

オブジェクト指向とはなんぞや?クラスとは?

※この記事の注意事項
・できるだけ初心者の方が理解しやすいように、細かい説明は省略しております。
・最後まで読み進められるように、多少ユーモアを交えて表現していることがあります。

========================================

PHP初心者の方が、「オブジェクト指向ってなんだかよくわかんないんだよね」と思っているけども、業務の事情で覚えなきゃならないって人のために、できるだけわかりやすくオブジェクト指向プログラミングについて書いていきたいと思います。

オブジェクト指向とはなんぞや?

オブジェクト指向プログラミングを理解するにあたって、よく対比されるものに手続き型プログラミングというものがあります。

手続き型プログラミング、通称「手続き型」とは?
上から順に書かれたコードを実行することなんです。

↓プログラム
↓プログラム
↓プログラム
↓プログラム
↓プログラム

まあ、一見わかりやすいんですけど、色々デメリットがありまして、
何万行などのコードの量が増えた場合に、処理がわかりにくいってのがデメリットですね。
処理がわかりにくいってことは、作る時は作れたけれど、別の人が保守するって時に理解不能になるんですね。

そこで登場するのがオブジェクト指向プログラミングです。
私はしばらくの間オブジェクト思考だと思っていました、ハハハ。

オブジェクト指向は、「オブジェクト」つまり物体を定義して、
オブジェクトどうしの相互作用としてシステムがどう振る舞うかを決定させる手法のことです。

簡単に言うと、人間みたいにさせるってこと。
以下みたいに、箱の中にプログラムを書いていく感じです。

| ̄ ̄ ̄ ̄ ̄ ̄ ̄|   | ̄ ̄ ̄ ̄ ̄ ̄ ̄|
| プログラム | ⇔ | プログラム |
|_______|   |_______|

オブジェクトごとにまとまった処理を書いていくので、ソースコードが雑然とならずに済むんですね。

※基本的なこととして、関数とクラスの違いや、スコープなどもあるけど、それはここでは記述しません。
また別の機会に。

クラスの中身

で、クラスの中身なんですが、クラスの中身はメンバ変数メソッドがありますよ。

メンバ変数は、クラスの中にいるメンバーという意味で、メンバ変数と名付けられているのですが、つまりはクラスで使える変数ってことです。

メソッドですが、これは関数と似ているのですが、クラスの中にある場合はメソッドというので、関数とは別物だと思っておきましょう。

何が違うかというと、アクセス権を設定できるところが違います。

後に出てくるのですが継承とかいってクラスどうしを親子関係にすることができます。protectedにすると、その宣言したクラスと子クラスだけで使用できるようになります。

privateは、その宣言したクラス内でのみ使用できます。

public宣言したクラスからも使用できますし、クラスの外からも使用することができます。

/**
 * テストクラス
 */
class test_class
{
	private $test_menber_hensu1;

	protected $test_menber_hensu2;

	public function __construct()
	{
		# code...
	}

	private function test_method($test_hikisu)
	{
		# code...
	}
}

メソッドに__constructというのがありますが、これは特別なメソッドで、クラスからインスタンス化された時に呼び出されるものです。
__constructは初期化などの処理に使われることが多いです。

ん?インスタンス化?と思いましたか?

クラスというものは設計図ですので、記述しただけでは動作はしないんです。
newという演算子で新規作成すると使えるようになるんです。

//クラスのインスタンス化
$instance = new test_class();

紛らわしい用語にオブジェクトがありますが、オブジェクトは物体ですので、クラスがあってもなくても、なんでもかんでもオブジェクトです。
つまり総称ですね。

オブジェクトって言っている人がいたら、「あー、ざっくり言っているんだな」と考えておきましょう。
インスタンスと言われたら、「正式に言っている」と思っておきましょう。

クラスの使い方

例えば先ほどのサンプルに少しコードを書いてみましょう。
test_methodに文字を表示するエコー文を足してみます。
それと、アクセス権がprivateだとクラスの外から呼び出せないので、publicに変更しておきます。

/**
 * テストクラス
 */
class test_class
{
	private $test_menber_hensu1;

	protected $test_menber_hensu2;

	public function __construct()
	{
		# code...
	}

	public function test_method($test_hikisu)
	{
		echo htmlspecialchars($test_hikisu, ENT_QUOTES);
	}
}

これを使うには、先ほどのように、まずクラス化して、それからメソッドを呼び出します。

//クラスのインスタンス化
$instance = new test_class();

//テストメソッドの呼び出し
$instance->test_method('こんにちは');

これでクラスを使うことができました。
基本的にはこれだけです。

クラス内部から自クラスのメンバ変数やメソッドの呼び出し方

クラス内で設定したメンバ変数やメソッドを呼び出すにはthisという名前で呼び出せます。
自分のクラスだからthisってことです。

先ほどのコードをちょっと改良して、簡単な消費税計算のクラスにします。

こんな感じですね。

/**
 * 消費税計算クラス
 */
class test_class
{
  private $test_parsent = 1.08;
 
  public function __construct()
  {
    # code...
  }
 
  private function test_shohizei($test_hikisu)
  {
    //内部から呼び出されて計算結果を返す
    return $test_hikisu * $this->test_parsent;
  }

  public function test_method($test_sotokara)
  {
    //内部メソッドを呼び出す
    $result = $this->test_shohizei($test_sotokara);

    //表示する
    echo htmlspecialchars($result, ENT_QUOTES)."<br>\n";
  }
}

test_shohizeiは呼び出される側です。privateにするとクラスの外からは呼び出せなくなるので、セキュリティ効果を高めることができます。

それで呼び出し方は以下になります。

//クラスのインスタンス化
$instance = new test_class();
 
//テストメソッドの呼び出し
$instance->test_method(1000);

//テストメソッドの呼び出し
$instance->test_method(2000);

これで呼び出すことができました。

クラスのインスタンス化はメモリを喰うので動作が重くなってしまうことが多いです。(コストが高いと表現します。)
ですので、毎回新規にインスタンス化をするのではなく、一度作成したインスタンスを使って、複数の処理をさせたりします。

ここでは2回計算させてますね。

この後覚えるべきなのは、static、abstruct、interface、trait ですね。
それはまた次回の記事で。

========================================

▼オブジェクト指向とデザインパターン記事一覧

関連記事

コメント

  • トラックバックは利用できません。

  • コメント (0)

  1. この記事へのコメントはありません。