PHP研修 変数上書きスタイルの提案

 PHP研修中のyoshimotoです。
 
今回は、研修中に見つけたPHPのある素晴らしいコーディングの仕方を発表させていただきます。
その名も「変数上書きスタイル」です。

PHPは以下のように、一旦数字を代入したあとでも、同一の変数に文字列を再代入し直すことができます。
 
変数の上書き
function someFunc() {

    $variable = 7;
    $variable = “Hello”; // OK
}
 

本ブログは、この変数の上書きを使うことで一時的な変数を削除できるという画期的な発見のご紹介です。

PHPは一般のプログラミング言語と比べますと、
その機能の制約から一時的な変数を作ることを余儀なくされることが多々あります。

例えばPHPでは、文字列内で変数を解析する事はできますが、関数を呼び出したり、以下のように計算式を記述することはできません。

echo “1個100円のりんごが5個と、1個180円のバナナが3本で、合計 {100*5+180*3}円 です。” ;

/* 出力結果は計算されることなく、そのまま出力される。
1個100円のりんごが5個と、1個180円のバナナが3本で、合計 {100*5+180*3}円 です。
*/
 
上記の解決策として、一旦計算結果を変数に代入する必要があります。
 
$sum = 100 * 5 + 180 * 3;

echo “1個100円のりんごが5個と、1個180円のバナナが3本で、合計 {$sum
}円 です。” ;
/* 変数は解析してくれる。
1個100円のりんごが5個と、1個180円のバナナが3本で、合計 1040円 です。
*/

このように一時的な変数を何個も用意する場面が多くなってしまいます。

そこで変数上書きスタイルです。
 
私以外にも他にいるのではないかと思いググってみますと、1件プログラム御用達のstackovrflowに同様に考える人がいました。

//variable overload

$type
= explode('/',$route);
$type = $type[1];

こちらはPHP5.4以前までは、関数から返ってきた配列に対して直接その内部の値を取り出すことができなかったため、一時的な変数に値を代入したあとで、本来の値を取り出す必要がありました。その際に同一の名前を使う考えは悪いだろうかとの質問です。
(回答では悪くないけど、PHP5.4以降はもうできるようになったよとか、listの分割代入使うといいよといった提案がされております。)
 
私が「変数上書きスタイル」を思いついた場面は、以下の「特定の月の日数を返す関数」を作るときでした。
 

function get_month_days($year, $month) {

    // 指定された月の最初の日のDateTimeの作成
    $start = DateTime(“{$year}-{$month}”);

    // 次の月の最初の日のDateTimeの作成
    $ temp = $month + 1;
    $next_month = DateTime(“{$year}-{$temp}”);

    // 差分を計算
    $diff = $next_month->diff($start);

    // 一日引いて特定の月の日数を求める。
    return $diff->days – 1;

}

 
このとき$temp変数がとても大きな不満でした。
一時的な変数という意味はわかるのですが、例えば大きな関数内でこういった$tempのような変数が作られてしまうと一体どういうふうに使われているのか身構えてしまいまいます。(ましてや型もないPHPでは特に。)

そこで上記を変数上書きスタイルで書き直しますと、以下になります。

function get_month_days($year, $month) {

    // 指定された月の最初の日のDateTimeの作成
    $start = new DateTime(“{$year}-{$month}”);

    // 次の月の最初の日のDateTimeの作成
    $next_month = $month+1
    $next_month = new DateTime(“{$year}-{$next_month}”);

    // 差分を計算
    $diff = $next_month->diff($start);

    // 一日引いて特定の月の日数を求める。
    return $diff->days – 1;

}

 
お気づきでしょうか?
$tempではなく、$next_monthに月をインクリメントした値を代入し、その直後で$next_monthに、DateTimeインスタンスを代入しております。
 
これが変数上書きスタイルです。
 
これによって以下のメリットが生まれます。
  • *  $tempと比べて、どういった目的の変数なのかがはっきりする
  • * 即座に上書きすることで、その後、$tempのように、他で使用されていないか検証する必要がなくなる。
 
皆様はこの「変数上書きスタイル」をいかが思いますでしょうか?
 
 
木曜日担当 yoshimoto


アプリ関連ニュース

お問い合わせはこちら

お問い合わせ・ご相談はお電話、またはお問い合わせフォームよりお受け付けいたしております。

tel. 06-6454-8833(平日 10:00~17:00)

お問い合わせフォーム