CakePHP2.x系のメソッド名先頭に付加するアンダースコアについてまとめました。
確認バージョン CakePHP2.10.2
公式マニュアルはこちらのページです。
https://book.cakephp.org/2.0/ja/getting-started/cakephp-conventions.html
function _findPosts() なんていうメソッドがあったりします。このアンダースコアは何だろうという話です。
実はアクセス修飾子の省略形だったのです。(protected、private、public)
アクセス修飾子はその変数やクラスを誰が使用出来るかというスコープの範囲をつけられます。
- public・・・自クラス、子クラス、他クラス
- protected・・・自クラス、子クラス
- private・・・自クラス
というスコープになります。
それで、CakePHPでは変数・クラス名の先頭にアンダースコアを付けるとこれらだと認識出来ます。
- 先頭にアンダースコアが1つ付加・・・protected
- 先頭にアンダースコアが2つ付加・・・private
というルールです。
- function findPosts() はpublic
- function _findPosts() はprotected
- function __findPosts() はprivate
となります。
変数でも同じで
- $name = null; はpublic
- $_name = null; はprotected
- $__name = null; はprivate
となります。
また、明示的に付ける事も可能です。
- public function findPosts()
- protected function _findPosts()
- private function __findPosts()
フレームワークの中では↑のようにpublic とか protectedをつける、かつ、アンダースコアもつけています。
スコープ範囲はコードの影響範囲に関わるものなので、思わぬ動きになってしまう事があるかもしれないので重要な設定です。
また、コードを読んで解析する際にも、スコープが広いと無駄に解析しないといけなくなってしまいます。その為、適切なスコープをつけてあげるとメンテナンス性も向上し、将来的に発生するバグも抑えられるように実感しています。(特に変数)
今まで、自分はこれ↓をやっていたのですが、
- public function findPosts()
- protected function findPosts()
- private function findPosts()
アンダースコアを覚えたので↓これで書いていきたいと思います。
- public function findPosts()
- protected function _findPosts()
- private function __findPosts()
アンダースコア記法なら呼び出す・使用する側でも、アクセス修飾子がわかるから更に使いやすくなりそうです。
まとめ
CakePHP2.x系のメソッド名先頭に付加するアンダースコアはアクセス修飾子(スコープ)の省略記法。アンダースコアがあれば呼び出す側からもわかりやすい。
- function findPosts() はpublic
- function _findPosts() はprotected
- function __findPosts() はprivate
アンダースコアだけでなく明示的に書く方を推奨↓
- public function findPosts()
- protected function _findPosts()
- private function __findPosts()