メモリ - php static::



クラス/関数内からPHPスクリプトからfalseを返すにはどうすればいいですか? (2)

それに対処するためにregister_shutdown_functionやauto_append_file設定で遊ぶことは不可能ですか? それほど素晴らしいことではありませんが、それでうまくいくことがあります。

メインのPHPスクリプトがクラスや関数の中からfalseを返すようにするにどうすればいいですか?

理由:内蔵Webサーバーが原因です。

Webサーバーの起動時にPHPファイルがコマンドラインで指定された場合、それは「ルーター」スクリプトとして扱われます。 スクリプトは各HTTP要求の開始時に実行されます。 このスクリプトがFALSEを返す場合、要求されたリソースはそのまま返されます。

PHPビルトインWebサーバーに関するドキュメントから

言い換えれば、組み込みのWebサーバが静的ファイルを処理できるように、ルータスクリプトにfalseを返します 。 ドキュメントからの例:

if (preg_match('/\.(?:png|jpg|jpeg|gif)$/', $_SERVER["REQUEST_URI"])) {
    return false;    // serve the requested resource as-is.
} else { 
    echo "<p>Welcome</p>";
}

重要なのは、その振る舞いをWebフレームワークに追加しようとしていることです。それをindex.phpに書きたくはありません。 php_sapi_name() == 'cli-server'と静的アセットが要求された場合にスクリプトの実行を停止させるクラス(ミドルウェア)にそのロジックをカプセル化したいと思いphp_sapi_name() == 'cli-server'

しかし、明らかreturn falseを返すのはメインファイルからではなく現在のメソッド/関数/ファイルからであるため、PHPスクリプト全体がクラスまたは関数からreturn falseを返すようにする方法はわかりません。

たとえばexit()で同じ動作を実現する方法はありますか? メインファイルでreturn falsereturn falseが実際にどのような意味を持つのかわからないと思います(特定の終了コードですか?)。


Answer #1

クラス内のメソッドがexitを使用して静的アセットを処理する場合、その解決策はexitreturn false置き換えてそのメソッドの呼び出し元にグローバルスコープ内のメソッドも返すようにするのと同じくらい簡単です。

あなたのクラスがこんな感じになっていたら…

class Router
{
    public function handleRequest($uri)
    {
        if (is_file($this->docRoot . $uri->path)) {
            exit; // static file found
        } else {
            // handle as normal route
        }
    }
}

exitreturn false置き換えるだけです。

            return false; // static file found

それであなたのindex.phpがこのようなもので働いていたら...

$router = new Router($docRoot);
$router->handleRequest($_SERVER['REQUEST_URI']);

そのようにhandleRequestメソッドのhandleRequestリターンを追加するだけです。

return $router->handleRequest($_SERVER['REQUEST_URI']);

これはあなたのフレームワークデザインへの最小限の副作用を持つべきであり、そしてあなたが見ることができるようにスクリプトのグローバルスコープから戻ることはPHPで単一の副作用のみを持つからです。代入の式としてinclude / requireを使用しました 。 あなたの場合index.phpが呼び出しスクリプトであれば、そのメソッドの直前にreturnを追加するだけで、ここで心配することは何もありません。

もちろん、一度スクリプトの残りの部分を返すと、続行できなくなるので、それがindex.phpの最後のステートメントであることを確認してください。 あなたは単に戻り値を一時的な値に代入し、あなたが論理のために必要ならば後で返すことさえできます。

$router = new Router($docRoot);
if ($router->handleRequest($_SERVER['REQUEST_URI'])) {
    /* if you need to do anything else here ... */
} else {
    return false; // otherwise you can return false for static here
}

一般に、関数/メソッドの内部からexitを呼び出すことはほとんど望ましくないと言うでしょう。 クラスをテストしたりデバッグしたりするのが難しくなり、例外をスローしたり、単にメソッドから戻ったりして、呼び出し元に失敗シナリオを適切に処理させるなど、他の方法の利点はありません。





php