LoginSignup
1
1

More than 3 years have passed since last update.

びっくりしたPHPコード

Posted at

概要

私が遭遇して驚いた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);

のようにすると,片方だけの値を取得できます.

感想

個人的にはlistforeachでも使えたことが一番の衝撃でした.
他人の書いたプログラムを読んでいると思いもよらない書き方に出会え,ワクワクしますね.

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1