概要
私が遭遇して驚いたPHPのコードを集めたものです.
他にも見つかり次第,追加するつもりです.
変数を変数名に使う
文字列を${}
で囲むことで,その文字列名の変数を扱うことができます.
$varName = 'hoge';
${$varName} = 'YES';
echo $hoge; // YES
echo ${$varName}; // YES
echo ${'hoge'}; // YES
変数名以外にも,プロパティや関数も呼び出すことができます.
$var = (object) [
'hoge' => 'YES',
];
$prName = 'hoge';
echo $var->{$prName}; // YES
$methodName = 'count';
$box = [1, 2, 3, 4, 5];
echo $methodName($box); // 5
使用例
Laravelでの使用例です.
$tables = [
'books' => ['title', 'author_id', 'page'],
'users' => ['first_name', 'last_name', 'age'],
];
$data = [
'books' => [
'title' => 'タイトル',
'author_id' => 1,
'page' => 123,
],
'users' => [
'first_name' => 'なまえ',
'last_name' => 'みょうじ',
'age' => 28,
],
];
foreach ($tables as $tableName => $columns) {
$className = 'App\\' . studly_case(str_singular($tableName));
if(class_exists($className)) {
${$tableName} = new $className; // インスタンスの作成
foreach ($columns as $columnName) {
${$tableName}->{$columnName} = $data[$tableName][$columnName];
}
}
}
データを追加する際に,テーブル名やカラム名を変数に格納することで
$books->title = $data['books']['title'];
$books->author_id = $data['books']['author_id'];
...
のように一つずつ式を書かなくて済みます.ちなみに
$className = 'App\\' . studly_case(str_singular($tableName));
if(class_exists($className)) {
${$tableName} = new $className;
}
この部分もかなり衝撃的なコードです.単語をstr_singular
で単数形にしてからstudly_case
でアッパーキャメルケースに変換して,モデル名を生成しています.
論理演算子
論理演算子を用いることで,if
文や三項演算子を省略することができます.
$hoge = 'OK';
False || $hoge = 'hoge';
echo $hoge; // hoge
$hoge = 'OK';
True || $hoge = 'hoge';
echo $hoge; // OK
$hoge = 'OK';
False && $hoge = 'hoge';
echo $hoge; // OK
$hoge = 'OK';
True && $hoge = 'hoge';
echo $hoge; // hoge
.||
の場合は,式がTrue
と評価される場所まで実行されて,それ以降は実行されません.
一方&&
の場合は,式がFalse
と評価される場所まで実行され,それ以降は実行されません.
この手法はPHPだけでなく,javascriptなどでも使えます.
使用例
変数が有効かどうかを調べて,有効ならメソッドを呼び出すとき,
if (is_valid($var)) $var->method();
のような文を
is_valid($var) && $var->method();
と書くことができます.
list
.list
を用いるとPythonにおけるタプルのリターンのようなものを実装できます.
$testFunction = function() {
return ['hoge', 'mage'];
};
list($hoge, $mage) = $testFunction();
echo $hoge; // hoge
echo $mage; // mage
複数の値を返したいときに便利です.さらに次のような使い方もできます:
$data = [
'key1' => ['hoge', 'mage'],
'key2' => ['hogehoge', 'magemage'],
];
foreach ($data as $key => list($hoge, $mage)) {
echo $key; // key1, key2
echo $hoge; // hoge, hogehoge
echo $mage; // mage, magemage
}
まさかforeach
文でも使えるとは思いもしませんでした.片方がいらない場合は
list(, $var2);
のようにすると,片方だけの値を取得できます.
感想
個人的にはlist
がforeach
でも使えたことが一番の衝撃でした.
他人の書いたプログラムを読んでいると思いもよらない書き方に出会え,ワクワクしますね.