フリーランスのためのネットビジネス専門学校 ネットで独立開業を目指す人を応援
フリーランスのためのネットビジネス専門学校 ネットで独立開業を目指す人を応援

LaravelのFormRequestでValidationエラーメッセージを日本語化する

何が出力されるでしょうか1

PHP
$int = 1;
function foo(){
    $int = 2;

    $bar = function() use($int){
        return $int;
    };

    $int = 3;
    return $bar();
}

$int = 4;
echo foo(); // ???

JavaScriptであれば、答えは3です。

JavaScript
int = 1;
function foo(){
    int = 2;
    bar = function(){
        return int;
    }
    int = 3;
    return bar();
}

int = 4;
foo(); // 3

JavaScriptの場合、関数を呼び出したときの変数の値が使われます。
逆に言うと、関数定義時には変数が定義されている必要すらありません。

JavaScript
function foo(a){
    return a + b;
}

foo(1); // b is not defined

b = 2;
foo(1); // 3

letやconstを使わないかぎり、うっかり変数名が被っただけで死にます。

PHPの場合は、useしたときに変数が定義されていなければUndefined variableになります。
ということでPHPでの答えは2です。

マニュアルにもしっかり書かれています。

引き継がれた変数の値は、関数が定義された時点のものであり、関数が呼ばれた時点のものではありません

PHPには、JavaScriptのように使用時の変数を反映させる方法はありません。

PHP
$foo = function () use (&$bar) {
    return $bar;
};

$bar = 1;
echo $foo(); // 1

$bar = 2;
echo $foo(); // 2

ありません。

そもそもPHPでクロージャを使うメリットがわかりません。
というか、実はそれ以前に、冒頭のコードは関数ではなく実行結果を返しているのでクロージャですらありません。
何がしたかったんだこのコード。


  1. PHP技術者認定試験の問題集に出てきた。 

[紹介元] PHPタグが付けられた新着投稿 – Qiita LaravelのFormRequestでValidationエラーメッセージを日本語化する

コメント

記事に戻る

コメントを残す