phpに関する考察。クロージャを使って$_POSTを使いやすくする。

$_POST["test"] = "hello";

function p()
{
    return function() use (&$val){
        $data["test"] = isset($_POST["test"]) ? $_POST["test"] : "";
        return $data;
    };
}

echo p()()["test"];

// 実行結果
hello

何がしたいのか分からないコードでしょうが、javaScriptっぽい書き方も最近のPHPはできるようになってきていることの発見はできた。でも、それが本来の目的ではない。

やりたかったことはrequestの受け取りを短い記述で取得できるようにすること。

バリデーション後のデータをスッキリうけとりたいので、一連の前処理が動いてから、model内でスッキリしたrequestデータをどのメソッドからも受け取りたい。$_POSTの書き換えはしたくない。グローバル変数はglobalキーワードや$GROBALスーパーグローバル変数などがあるがダサい。フレームワークなどでは$request変数などを引数として受け渡したり、静的なクラスメソッドに押し込んだりするのだろうが、それすらも野暮ったいと思っている。

ローカル変数が見つからなかったらグローバル変数となるような非推奨の設定値もあるが、環境の値を気安く変更することは不可能だし、非推奨な設定は気が引けてしまう。ちなみに、バリデーション後にクラス内でdefineするとグローバルな変数が定義できるようなのだが(当然だが)2回defineすると重複となりバグって落ちてしまう。間違って2回モデルをインスタンス化してしまい同じ1実行あたりdefineを2回動かすと多重定義エラーで落ちてしまう可能背もある。というか実際にそういうコードではまったことがあるのでやりたくない。require_once的なもので変数の存在チェックを行ってから、定義対象を生成するかどうか決めるのは明らかに野暮ったいけど大切なことだ。

別の方法論…runkit_function_redefineを使ってユーザ定義関数をオーバーライドするとか、thisをextractして展開するとかPHPの冗長な記述を少しでも解消しようとする試みをしている人はいるのだけど。上手く言っていない。なんかもう一捻りすれば、スマートな記述方法があると思うんだけど…

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です