【PHP】スネークケースやキャメルケースの変換(変数名から関数名を作成)
-
カテゴリ:
- PHP
今回はスネークケースとキャメルケースの変換方法に触れつつ、個人的に必要になった「変数を取得して、関数名を自動で作成する」サンプルをご紹介します。
【超概要】
- スネークケースとはキーワードをアンダーバーで繋ぐ命名方法
- キャメルケースとはキーワードを大文字にして繋ぐ命名方法
- スネークケースからキャメルケースへ変換するサンプルを紹介
- キャメルケースからスネークケースへ変換するサンプルを紹介
- 変数名から関数名を作成するサンプルを紹介
スネークケースとキャメルケースについて
まずはじめにスネークケースとキャメルケースの概要について説明します。
自分もこの方法を調べるまで両者の知らなかったので、プログラミングをやったことある人だったら、名前は知らないけど見たことある人は結構知るんじゃないでしょうか。
スネークケースとは
スネークケースとは、変数名や連想配列のキー値によく使われる命名方法のことをいいます。
具体的は方法として、変数に必要なキーワードを「_(アンダーバー)」で繋げて変数名を作成します。
例えばユーザ情報の「名前(カナ)」を変数作成する際は
名前(カナ)
⇒ First Name Kana
⇒ first name kana
⇒ first_name_kana
という感じで、「$first_name_kana」という変数名が出来上がります。
キャメルケースとは
キャメルケースは、クラス名や関数名(メソッド名)によく使われる命名方法のことです。
作成には、キーワードをつなげる際に接頭辞を大文字にして繋げて名前を作成します。
例えば「名前(カナ)」を取得するような関数名を作成する場合、
名前(カナ)を取得
⇒ get first name kana
⇒ get First Name Kana
⇒ getFirstNameKana
という形で、「getFirstNameKana()」という関数名が出来上がります。
これらはPHPにおいて、必ず上記の命名規則に乗らなければならないというものはありませんが、プログラミングの作成規約として設定してソースに統一性を持たせるときによく使うので、知らなかった人は意識してみるようにしてください。
スネークケースとキャメルケースの変換
変換処理のサンプルを作成する際、いろいろ調べていたら、自分と同じことをしようとしている人がいて、それを参考にさせていただきました。
// スネークケースからキャメルケースへの変換
$key = 'first_name_kana';
$method= lcfirst(strtr(ucwords(strtr($key, ['_' => ' '])), [' ' => '']));
// キャメルケースからスネークケースへの変換
$method = 'FirstNameKana';
$key = ltrim(strtolower(preg_replace('/[A-Z]/', '_\0', ltrim($method, 'get'))), '_');
変数名から関数名を作成するサンプル
つらつら書いてきましたが、ここからは本来やりたかった本題です。
やりたいことは「変数名から関数名を作成する」プログラムを作ること。
もう少し詳しく話すと、よくJavaなどで使われるMVCモデルのModel(JavaBeans)、そのオブジェクトに含まれるsetter(セッター)やgetter(ゲッター)を自動で読み出すサンプルをPHPで作りたっかんです。
Modelの詳しい説明は今回省きますが、簡単にいうと特定の情報をオブジェクト内に保持するための入れ物のように使ったり、データにアクセスするためコンポーネントだったりと、処理の中核を担う部分のことです。
modelのサンプルとして以下のようにユーザの個人情報を保持しているとします。
<?php
class User {
private $id;
private $first_name;
private $last_name;
private $first_name_kana;
private $last_name_kana;
private $age;
private $address;
public function setId($id){
$this->id = $id;
}
public function getId(){
return $this->id;
}
public function setFirstName($first_name){
$this->first_name = $first_name;
}
public function getFirstName(){
return $this->first_name;
}
public function setLastName($last_name){
$this->last_name = $last_name;
}
public function getLastName(){
return $this->last_name;
}
public function setFirstNameKana($first_name_kana){
$this->first_name = $first_name;
}
public function getFirstNameKana(){
return $this->first_name_kana;
}
public function setLastNameKana($last_name_kana){
$this->last_name = $last_name_kana;
}
public function getLastNameKana(){
return $this->last_name_kana;
}
public function setAge($age){
$this->age = $age;
}
public function getAge(){
return $this->age;
}
public function setAddress($address){
$this->address = $address;
}
public function getAddress(){
return $this->address;
}
}
さらに、Webのリクエストパラメータとして個人情報を以下のように受け取ったとします。
$_POST['id']
$_POST['first_name']
$_POST['last_name']
$_POST['first_name_kana']
$_POST['last_name_kana']
$_POST['age']
$_POST['address']
リクエストパラメータ―で受け取った連想配列の中のキーからmodelのsetterやgetterを実行したいです。
検索条件を持つ連想配列のキー(スネークケース)を使って、対応するメソッド(キャメルケース)を読みだすサンプルを作成しました。
<?php
/**
* 検索APIに必要なモデルに検索条件を設定する
*
* @param Array $object ※リファレンス渡し
* @param Array $conditions
*/
public function arrayToObjectMapper(&$object, $conditions) {
if (empty($object) || empty($conditions) || !is_array($conditions)) return false;
foreach($conditions as $key => $value) {
// スネークケースからキャメルケースへ変換
$ckey = lcfirst(strtr(ucwords(strtr($key, ['_' => ' '])), [' ' => '']));
$method = "set{$ckey}";
// クラスメソッドの存在チェック
if (!method_exists($object, $method)) continue;
// 検索条件をセッターに追加
$object->$method($value);
}
// 使い方
$model = new User();
// 検索条件
$searchCondition = {"id"=>1, "first_name"='sato',"age"=>20}
arrayToObjectMapper($model, $searchCondition);
逆にモデルから連想配列に変換するサンプルも作ってみました。
<?php
/**
* 検索条件をモデルから配列に変換する
*
* @param Array $object
* @return Array $conditions
*/
public function objectToArrayMapper($object) {
if (empty($object)) return false
// クラスのメソッド名一覧を取得
$methodList = get_class_methods($object);
if(empty($methodList)) return false;
$conditions = array();
foreach($methodList as $method) {
// ゲッターではない場合は次へ
if (strstr($method, 'get') === false) continue;
// スネークケースからキャメルケースへ変換
$key = ltrim(strtolower(preg_replace('/[A-Z]/', '_\0', ltrim($method, 'get'))), '_');
// ゲッターから取得したデータを配列に格納
$conditions[$key] = $object->$method();
}
return $conditions;
}
以上です。