大規模PHP開発で欠かせないアクセス修飾子とカプセル化、アクセサー、コンストラクター/デストラクター:PHPオブジェクト指向プログラミング入門(2)(2/3 ページ)
「PHPで、どのようにオブジェクト指向プログラミングをしていくか」を解説する連載。今回は、アクセス修飾子、カプセル化と隠蔽(いんぺい)、アクセサー、コンストラクター/デストラクターについて解説し、最後に「再代入の是非」について触れます。
大規模なプログラミングに重要な「モジュール化」「情報隠蔽」「カプセル化」
プログラムだけではなく、工学などにも出てくる概念に「モジュール」というモノがあります。モジュールは「まとまりのある機能を持った部品」「交換可能な構成要素」といった意味合いのものです。
モジュールの本来の意味は「基準になる基本寸法」のことで、建築の世界の「モジュール」はまさにその意味合いで使われています(インチモジュール/メーターモジュール/尺モジュール)。
ただ、それ以外の多くのところでは「基本寸法が同じである→同じ基本寸法のものであれば別のものに交換ができる→その基準によって交換可能となった構成要素」というような流れから「交換可能な構成要素」をモジュールと呼称するケースが多々あります。
例えば「部屋のドアの鍵が壊れた」ときに、ドアごと交換をするのではなく「鍵だけを交換できる」のは、鍵が「一つのモジュールとして適切に設計されているから」になります。
クラスは、この「モジュール」という概念を踏まえておくと理解がしやすいでしょう。クラスは「まとまりのある機能を持った部品」です。また、クラスは「機能を拡張したい」や「問題があったから修正したい、書き直したい→交換したい」という状況があり得るために、それが可能なように設計と実装をする必要があります。
こういった「交換が容易」な設計や実装を、プログラムの世界だと「疎結合」といった言われ方をされることも多いです。
また、大規模のプログラムを書くときにも、このモジュール化はとても重要になります。
人間が理解できる複雑さには、個人差はもちろんありますが、いずれにしても「限界」があります。モジュール化によって「ある程度大きいサイズの部品」を、その全てを把握するのではなくて「こんな機能があるまとまりなんだ」という部分的な理解で「使える」ようにします。これにより、「取りあえず理解しなくても使える」部分の複雑さを、いったん、思考から「隠蔽する」ことができます。
そうすると「全てを理解していなければ書けない」状況と比較して、モジュール化した場合には「より複雑なプログラムを、複雑さをある程度隠蔽した状態で」書くことができるために、結果として「全体としてはより複雑度の高いプログラム」を書くことができるようになります。
これは「大規模なプログラミング」をするときに、とても重要なアプローチになります。
このように「モジュール化」することは、とても重要です。オブジェクト指向プログラミングでは、これを「情報隠蔽」「カプセル化」などと呼称します。
「モジュール化」「情報隠蔽」「カプセル化」は、厳密には少し意味合いが異なる部分もあるのですが、今は「同じようなものである」と理解してください。
カプセル化の実装方法、アクセサー(accessor)
カプセル化の一部として「データ隠蔽」という考え方があり、その実装方法として「アクセサー」というものがあります。「常に必ず使われる」ものではないですし、今なお「アクセサーの是非」は議論されているものではありますが、それでも比較的多くのところで「実際に使われている」概念であり実装なので、把握しておくとよいでしょう。
アクセサーを実装する場合、以下のようなルールで実装されることが多いです。
- プロパティ(変数)はprivate
- プロパティに値を入れるためのメソッドを「setter」、プロパティから値を取り出すためのメソッドを「getter」と呼ぶ(併せて「アクセサー(accessor)」と呼ぶ)
- setterは「'set' + プロパティ名(先頭1文字目を大文字)」、getterは「'get' + プロパティ名(先頭1文字目を大文字)」にする
- setter/getterは、publicまたはprotectedにする
- setterには、簡単なバリデート(validate)処理を入れることがある
- アクセサー以外の全てのメソッドは、自クラスのプロパティであっても「アクセサー経由で」プロパティを触る
前回の連載でもsetterは実装していたのですが、実際にアクセサーの付いたクラスの実例を書いてみましょう。
<?php class hoge { public function setVal($v) { $this->_val = $v; } public function getVal() { return $this->_val; } // private $_val; } // $obj = new hoge(); $obj->setVal('test'); var_dump( $obj->getVal() );
PHPでは、アクセサーを実装するもう一つ「とても大きな理由」があるのですが、それについては後の連載で説明します。ここでは、アクセサーの存在と書き方を覚えておいてください。
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人の技術者の回答をみていく。