学習記録#10 250608

この続きから

WpOrg\Requests\Requestsのget()とかpost()は、同じクラスのrequest()っていうメソッドを呼んでる

request()の中では、最初にバリデーションチェックとかオプションのチェックをしてる
InputValidatorとかInvalidArgumentは何者?

InputValidatorはis_string_or_stringable()とかis_numeric_array_key()みたいな型チェックてきなメソッドが実装されてる

is_numeric_array_key()はHooks.phpで使われてる
なんでrequest()だとis_string_or_stringable()ではHooksのregister()はis_numeric_array_key()なんだ?

あ、よく見たらHooksの方は$priorityっていう変数で数値しか受け付けたくないからそうなってるだけか
で、requestがis_string_or_stringable()だけでいいのは、単純にresuqestで渡ってくるのは全部文字列になるからかな

InvalidArgumentはInvalidArgumentExceptionを継承してた。例外系のクラスか
debug_backtrace()ってなんだろう

$options['hooks']->dispatch()
のところ、個人的には
$options['hooks'] instanceof Hooks
とかを先に入れたくなっちゃう
$optionsって人が['hooks'=>'hogehoge']って書ける部分だから、、

あ、いや、self::set_defaultsで$optionsの中身が合ってるか判定してるんだっけ

いや、中身があってるかとかは見てないか
空だったらnew Hook()するだけだ

new $transport()
って書き方あんまり見ないな
何してるんだろう

if (!empty($options['transport'])) {
$transport = $options['transport'];
if (is_string($options['transport'])) {
$transport = new $transport();
}
} else {
$need_ssl = (stripos($url, 'https://') === 0);
$capabilities = [Capability::SSL => $need_ssl];
$transport = self::get_transport($capabilities);
}
ここが何やってるかピンとこない

ChatGPT曰く、
これは「HTTP通信に使う“トランスポート層(Transport)”を選ぶ処理」です。
とのこと。
何か指定されてたらそこを選んで、指定がなければSSLが必要か判定して、self::get_transport
で判定結果に基づく最適なトランスポート層を選択してる感じ
トランスポート層とは

new $transport()
は、$transportがWpOrg\Requests\Transport\Curl
みたいなクラス名の文字列だった場合にインスタンス化してる

request()はこんな感じか

debug_backtraceについてのスレ

debug_backtrace() は PHP バックトレースを生成します。

実際にどんなエラーが出るかやってみた
reinventing_the_wheel_model_php | PHP Learning Environment is running!
reinventing_the_wheel_model_php | Fatal error: Uncaught WpOrg\Requests\Exception\InvalidArgument: App\Sample\InvalidArgumentSample::test(): Argument #1 (email) must be of type string, integer given in /var/www/vendor/rmccue/requests/src/Exception/InvalidArgument.php:29
reinventing_the_wheel_model_php | Stack trace:
reinventing_the_wheel_model_php | #0 /var/www/src/Sample/InvalidArgumentSample.php(13): WpOrg\Requests\Exception\InvalidArgument::create(1, 'email', 'string', 'integer')
reinventing_the_wheel_model_php | #1 /var/www/public/index.php(47): App\Sample\InvalidArgumentSample->test()
reinventing_the_wheel_model_php | #2 {main}
reinventing_the_wheel_model_php | thrown in /var/www/vendor/rmccue/requests/src/Exception/InvalidArgument.php on line 29
reinventing_the_wheel_model_php exited with code 255
どのクラスのどの関数でどんなエラーになったかを返してくれてる

トランスポート層とは、コンピュータネットワークの通信モデル(OSI参照モデル)における第4層のこと
層 | 名称 | 役割の例 |
---|---|---|
7 | アプリケーション層 | HTTP, SMTP, FTPなど |
6 | プレゼンテーション層 | 文字コード変換、暗号化など |
5 | セッション層 | 通信セッションの開始・終了 |
4 | トランスポート層 | TCP/UDPによるデータの信頼性確保、順序制御、再送制御など |
3 | ネットワーク層 | IPアドレス、ルーティング(IP) |
2 | データリンク層 | MACアドレス、イーサネット |
1 | 物理層 | 電気信号、光信号などの物理的な転送手段 |

どういう手段で通信しますか〜の部分

ここから、Responseを見ていく

strposについて

文字列内の部分文字列が最初に現れる場所を見つける
"\r\n\r\n"
がヘッダーとボディのセパレータになってるのか〜

\rが行の頭に戻るで\nが改行なので、\r\n\r\nは2行分の改行をしてる

substrについて

文字列 string の、offset で指定された位置から length バイト分の文字列を返します。
$headers = substr($return->raw, 0, $pos);
$body = substr($return->raw, $pos + 4);
これだと、rawの中で0~$posまでがヘッダーでそれ以降がボディになることがわかってるから、そこで分割してる