連載
» 2015年06月25日 05時00分 UPDATE

PHPオブジェクト指向プログラミング入門(2):大規模PHP開発で欠かせないアクセス修飾子とカプセル化、アクセサー、コンストラクター/デストラクター (1/3)

「PHPで、どのようにオブジェクト指向プログラミングをしていくか」を解説する連載。今回は、アクセス修飾子、カプセル化と隠蔽(いんぺい)、アクセサー、コンストラクター/デストラクターについて解説し、最後に「再代入の是非」について触れます。

[古庄道明,株式会社格子組]

プログラミングの腕前が上がって、より良いコードが書けるように

「PHPオブジェクト指向プログラミング入門」のインデックス

連載目次

 「PHPで、どのようにオブジェクト指向プログラミングをしていくか」を解説する本連載。初回となる前回の「PHPにおけるクラスの書き方と呼び出し方――インスタンス、メソッド、プロパティ」では、「クラス」の書き方と簡単な使い方、メソッド/クラス定義内関数、プロパティ/クラス定義内変数、マルチプルインスタンスを紹介しました。

 今回は、アクセス修飾子、カプセル化と隠蔽(いんぺい)、アクセサー、コンストラクター/デストラクターについて解説し、最後に「再代入の是非」について触れます。

本連載について(編集部より)

本連載は、おおむねPHPの基本文法は理解した人を読者に想定しています。基礎文法について知りたい方は下記連載を参照してください。


アクセス修飾子(アクセス権)――public、protected、private

 まずは、前回「関数(メソッド)はpublicで、変数(プロパティ)はprivate」と固定で書いていた「アクセス修飾子(アクセス権)」について、もう少し詳しく解説していきます。

 アクセス修飾子はメソッドやプロパティを「どれくらい外側から触ってもよいか」を指定するためのキーワードで、public(外からOK)、protected(クラス内、あるいは継承先のクラス内ならOK)、private(クラス内のみ)の3種類です。

 実際にコードを書いて、「できること」と「できないこと」をコードで確認していきましょう。

<?php
 
class hoge {
  public function pub_func() {
    echo "call pub_func\n";
  }
  protected function pro_func() {
    echo "call p_func\n";
  }
  private function pri_func() {
    echo "call pri_func\n";
  }
}
//
$obj = new hoge();
$obj->pub_func();
//$obj->pro_func(); // コメントを外すとエラーになる
//$obj->pri_func(); // コメントを外すとエラーになる

 public以外のアクセス修飾子(protectedやprivate)を指定すると、クラスの外からはそのメソッドが呼び出せなくなります。

 「そのメソッドを定義しているクラスの中からの呼び出しならprotectedやprivateなメソッドが呼び出せる」ことは、以下のコードから確認できます。

<?php
 
class hoge {
  public function pub_func() {
    echo "call pub_func\n";
    $this->pro_func();
    $this->pri_func();
  }
  protected function pro_func() {
    echo "call p_func\n";
  }
  private function pri_func() {
    echo "call pri_func\n";
  }
}
//
$obj = new hoge();
$obj->pub_func();

 privateとprotectedの違いは「継承」と深い関係があるので、次回、継承を解説するタイミングで合わせて説明します。今はいったん「同じようなものである」と考えておいてよいでしょう。

 上述はメソッド(関数)ですが、プロパティ(変数)も同じアクセス修飾子を持ち、同じ状況になります。

<?php
 
class hoge {
public $_pub_val;
protected $_pro_val;
private $_pri_val;
}
//
$obj = new hoge();
$obj->_pub_val = 10;
//$obj->_pro_val = 20; // コメントを外すとエラーになる
//$obj->_pri_val = 30; // コメントを外すとエラーになる
var_dump($obj);

 protectedやprivateなプロパティ(変数)は、メソッド(関数)の中からであれば、触ることができます。

<?php
 
class hoge {
  //
  public function f() {
    $this->_pro_val = 20;
    $this->_pri_val = 30;
  }
//
public $_pub_val;
protected $_pro_val;
private $_pri_val;
}
//
$obj = new hoge();
$obj->_pub_val = 10;
$obj->f();
var_dump($obj);

 ここでは「アクセス修飾子によって、こんなことができる、またはできない」という実際の動きを理解してください。

       1|2|3 次のページへ

Copyright© 2017 ITmedia, Inc. All Rights Reserved.

@IT Special

- PR -

TechTargetジャパン

この記事に関連するホワイトペーパー

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。