Pictnotes メインイメージ

お仕事メモ

CakePHPの変数の命名規則はDBとの関係で考えると非常に悩ましい

個人的に、変数はスネークケース(アンダースコアつなぎ)で書くことが多いのだけどCakePHPのコーディング規則をみると命名規約で変数はキャメルバック(先頭小文字のキャメルケース)で書くようにと書いてある

 



http://book.cakephp.org/2.0/ja/contributing/cakephp-coding-conventions.html
変 数名はできる限り説明的に、しかしできる限り短くもしてください。 通常の変数は小文字で始まり、複数の単語の場合はキャメルバックで書く必要があります。 オブジェクトを参照する変数は大文字で始まり、何らかの方法で変数がオブジェクトとなっているクラスに関連したものになるべきです。

基本的に長いものに巻かれるタイプですのでこれ自体を受け入れられないという事はないのですが、プロジェクトで扱う変数は最初から最後までできるだけ同じ命 名規則で書きたいという欲望もあり(その方がミスが少なくなりますよね)その場合、PHPの変数がキャメルケースだとデータベースとの関係ではあまり好ましくないと思う。

CakePHPに限らずPHPのフレームワークを使う上でDBの操作がラクという事は大きなメリットなのですが、その一環として、
$this->save($this->request->data);
などで、関連づけられているテーブルにinsert等の処理が簡単にできることだと思う。 これが出来る条件として、PHPの配列のkey名とdatabaseのカラム名が同じである必要があるのですが、変数名にキャメルケースを採用するとここが上手く行かない時がでてきます。
たとえば、PostgreSQLで

	cake=# create table test ( id serial primary key, last_name text, firstName text);
といったテーブルを作ると
cake=# \d test
                           Table "public.test"
  Column   |  Type   |                     Modifiers                     
-----------+---------+---------------------------------------------------
 id        | integer | not null default nextval('test_id_seq'::regclass)
 last_name | text    |
 firstname | text    |

といったテーブルができます。

cake=# drop table test;
DROP TABLE
cake=# create table test ( id serial primary key, last_name text, "firstName" text);
CREATE TABLE
cake=# \d test
                           Table "public.test"
  Column   |  Type   |                     Modifiers                     
-----------+---------+---------------------------------------------------
 id        | integer | not null default nextval('test_id_seq'::regclass)
 last_name | text    |
 firstName | text    |

上記の2つの違いがわかりますでしょうか? firstNameを、ダブルコーテーションで囲んでいるかどうかです。 http://www.postgresql.jp/document/9.3/html/sql-syntax-lexical.html

4.1.1. 識別子とキーワード
で、
引用符が付かない名前は常に小文字に解釈されますが、識別子を引用符で囲むことによって大文字と小文字が区別されるようになります。 例えば、識別子FOO、foo、"foo"はPostgreSQLによれば同じものとして解釈されますが、"Foo"と"FOO"は、これら3つとも、またお互いに違ったものとして解釈されます (PostgreSQLが引用符の付かない名前を小文字として解釈することは標準SQLと互換性がありません。標準SQLでは引用符の付かない名前は大文字に解釈されるべきだとされています。 したがって標準SQLによれば、fooは"FOO"と同じであるべきで、"foo"とは異なるはずなのです。 もし移植可能なアプリケーションを書きたいならば、特定の名前は常に引用符で囲むか、あるいはまったく囲まないかのいずれかに統一することをお勧めします)。

とあります、MySQLの方は省きますが、こちらも基本的には区別しないみたいです。(オプション等で区別できるみたいですが)

なぜ、区別しないんだ!と言われても僕にはわかりませんが(たぶんファイルシステムとの兼ね合いかなぁという気はしますが)現状そうなので、DBのカラム名はスネークケースを採用する方がなにかと問題がないと思います。

で、最初の話題にもどると、CakePHP上で、連想配列のkeyが、firstNameとして扱っている変数をDBに入れたい場合、keyをfirst_name代入してsaveする必要とかがでてくるかと思います。

なんか、一手間かかってメリット消してる気がするのは僕だけなのですかね。

世の中のみんなはどうしてるのかなぁ。
個人的には、apiやhtmlのフォームタグ名から、dbのカラム名まで、変数に関してはスネークケースで行きたい所です。(上記の問題があるので)
 

CakePHP   2014/10/28   admin