前回の記事に続きまして、Symfonyのコードリーディングを続けていきます。
以下は前回の記事です。
Requestクラスについて
本記事で主に進めていく箇所は、以下のパスです。
./src/Symfony/Component/HttpFoundation/Request.php
クロージャについて
このクラスのコードを読んでいくと、おそらくcreateRequestFromFacoryという関数が重要であることが分かります。
複数の関数において返されるインスタンスはこの静的関数を用いて作成されているようです。
この関数は以下のコードです。
private static function createRequestFromFactory(array $query = [], array $request = [], array $attributes = [], array $cookies = [], array $files = [], array $server = [], $content = null): static
{
if (self::$requestFactory) {
$request = (self::$requestFactory)($query, $request, $attributes, $cookies, $files, $server, $content);
if (!$request instanceof self) {
throw new \LogicException('The Request factory must return an instance of Symfony\Component\HttpFoundation\Request.');
}
return $request;
}
return new static($query, $request, $attributes, $cookies, $files, $server, $content);
}
簡単にご説明すると、まず初めに以下の要素が引数として渡されてきます。
- クエリ
- HTTPメソッド
- attributes 何これ?
- クッキー
- ファイル
- サーバ
- リクエスト内容
これらを元にインスタンスを作成し、返すわけですがこの関数の中で一点、不思議な点があります。
self::$requestFactory
こちらです。
静的に宣言されたrequestFactoryプロパティを呼び出しているのは分かるのですが、その宣言部分はこちらです。
protected static ?\Closure $requestFactory = null;
いやいや、何もしてへんやん。
クソ雑魚のワイもこのように思うわけです。
こちらの意味は、「$requestFactoryの型はクロージャ型、もしくはnullでもいいよ。でも初期値はnullね」という意味です。
よって、クラス内でクロージャを設定することができる箇所が考えられます。
探してみると、以下のようなコードがありました。
public static function setFactory(?callable $callable): void
{
self::$requestFactory = null === $callable ? null : $callable(...);
}
こちらでクロージャを設定する時もあるというわけですね。
callable型というのはコールバック関数に型づけるというわけです。
処理の内容としては、「コールバック関数が引数に渡されていないならrequestFactoryプロパティはnullで、あるなら引数のコールバック関数をrequestFactoryプロパティに定義しようね」という意味です。
このクラス内にはsetFactoryを呼び出している箇所はありませんでした。
外部から呼び出し、クロージャを設定、Requestインスタンスを作る際にそのクロージャを使用する、といったイメージでしょうか。難しいって。
このクロージャやコールバック関数について正しく理解することは、ワイのようなクソ雑魚にとっては1つの壁であるような気がします。
他にも関数がたくさんあるのですが、うーん、何から読めばいいのやら。
この記事自体は短くなりましたが、次にある程度読むべき場所を精査してから記事を執筆します。