Friction River Software

  • お問い合わせ

CakePHP5入門【コラム⑫】アローとダブルコロン

A子

そういえばさぁ
->アロー」ってめっちゃ使うじゃん

あれって、オブジェクトのメソッドやフィールドにアクセスするための演算子だよね?

B美

そうよ

オブジェクト指向においては必須の知識ね

A子

でもさ
たまにコロン二つの「::」というのも出てくるじゃん

あれって何?

C菜

あ~
前回も現在時刻を知るために

DateTime::now()

って出てきましたね~

B美

ふむ
::ダブルコロン」はオブジェクトではなく、クラスにアクセスするための演算子なのよ

正確には「スコープ解決演算子スコープ・レゾリューション・オペレーター」ね

A子

んん?

オブジェクト指向って、「クラス」という設計図をもとに「インスタンス(オブジェクト)」という実体をメモリ内に作らないといけないんじゃなかったっけ?
(【CakePHP5基礎編②】を参照)

B美

おぉ、よく覚えてたわね(感心、感心)

でもね
インスタンス化せずに利用できる(クラスそのものにひもづいている)メソッドもあるのよ
それを「静的せいてき」メソッドと呼びます

んで、::ダブルコロン」というのは、その「静的な」メソッドにアクセスするための演算子ってわけ
(例えば、DateTimeクラスはインスタンス化しなくても、nowメソッドを呼び出すことができる等)

C菜

なるほどですねぇ~
あっ、ついでに一つ質問です~

クラス名や変数名など、名前の付け方って決まりごとがあるのでしょうか~?
(前回、メソッド名は「キャメルケース」で…って話がありましたよね~?)

B美

なかなか良い質問ね
CakePHPにおける「命名規則」はこうよ

項目ケース備考
クラス名パスカルケース
クラス内のフィールド名キャメルケースデータベーステーブルを割り当てるフェッチする場合はパスカルケースにすることも…
クラス内のメソッド名キャメルケースprivateメソッドならスネークケースでもOK
変数名キャメルケース個人的にはスネークケースを多用している
定数名スネークケース基本的には全て大文字
データベースのテーブル名スネークケースCakePHPでは(基本的には)複数形にすること
データベーステーブルの項目名スネークケースSQLでは大文字と小文字を区別しないため

個人的な話だけど、「フィールド名」「メソッド名」「変数名」についても「スネークケース」で書くことが多いわね
(C言語というプログラム言語を学んだ人間は、そうなりがち(笑))

まぁ、できるだけ「キャメルケース」を心がけるようにしなさいね
(特に「メソッド名」は!)

A子

ああ、前回りたからね(苦笑)

あ、そうだ
もう一つ質問!

parent」とか「this」って何なのさ

C菜

結構、頻繁に出てきますよね~

気にしたことなかったですけど~(苦笑)

A子

initialize」メソッドの一行目に必ずこう書いてるよね?

parent::initialize();

あと、「beforeFilter」メソッドにも出てきたね

parent::beforeFilter($event);

それに「$this->○○」はめっちゃ出てくるし…

C菜

this」には「$」が付いているのに、「parent」には付いていないのも謎です~

B美

parent」って、直訳すると何?

this」は日本語だとどうなる?

C菜

「parent」は「」で、「this」は「これ」ですね~

あっ!
「親」というのは「親クラス(スーパークラス)」のことじゃないですか~?

A子

ん?

だとすると、「$this」は自分自身、つまりこのオブジェクト自体なんじゃないの?
(インスタンスだから変数で指し示している → だから先頭に「$」が付いている)

C菜

「parent」はクラス自体を意味していて、オブジェクトじゃないからこそ「::ダブルコロン」を使ってるんですね~?

B美

いや、すごいな君ら
それが正解よ

ちなみに「initialize」メソッドや「beforeFilter」メソッドの中で、親クラスの「initialize」や「beforeFilter」を呼び出している理由だけど…
「子クラス」では「親クラス」の同名メソッドを上書きすることができるのよ
(これを「オーバーライド」と呼びます)

もしも「子クラス」側で下記の一文を記述しない場合

parent::initialize();

「親クラス」の「initialize」メソッドが実行されないことになるってわけ

A子

うーん、なるほどね

てか、今頃になってそれらを教わるのって、ちょっと遅くない?(苦笑)

C菜

たしかに~(笑)