大規模PHP開発で欠かせないアクセス修飾子とカプセル化、アクセサー、コンストラクター/デストラクター:PHPオブジェクト指向プログラミング入門(2)(1/3 ページ)
「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);
ここでは「アクセス修飾子によって、こんなことができる、またはできない」という実際の動きを理解してください。
Copyright © ITmedia, Inc. All Rights Reserved.
関連記事
- 初心者がPHPプログラミングを始めるための基礎知識とXAMPPのインストール
オープンソースのWeb開発向けスクリプト言語「PHP」の文法を一から学ぶための入門連載。初回は、PHPの概要や特徴を紹介し、環境構築や「Hello World!」までの手順などを解説します【PHP 7.1含め2017年の情報に合うように対応、XAMPP環境構築を追記】。 - PHP編に突入! まずはソースをダウンロード
今回からPHPのビルドとインストールに入ります。まずはPHPという言語の概要と、ソースコードの入手法を解説します(編集部) - 理論編:PHPについて知ろう
スクリプトを記述するだけの簡単なプログラミングで、Web対応の高速なデータベースアプリケーションを実現する手法としてPHPが急速に注目を集めている。しかもデータベースはオープンソースのPostgreSQLだけでなく、Oracleなどの商用データベースも扱える。ここでは、5月にバージョンアップしたばかりのPHP4によるWeb-DBシステム構築法を紹介しよう。 - Mac OS X+PHPでオールインワン環境(インストール編):Mac内にPHP4、5、6を同居させるコツ
PHP4の開発は終了したが、移行の問題は残されている。異なるバージョンのPHPをスムーズに切り替えるには? - @IT自分戦略研究所 資格辞典:PHP技術者認定試験
- 自分をプログラミング言語に例えると何?
2013年1月16日、エンジニアたちが集うトークライブイベント「TechLION vol.11」が開催された。今回のレポートでは、「自分をプログラミング言語に例える」というお題に答えた5人の技術者の回答をみていく。