PHP フレームワーク Respons.php 作成

2018年5月8日

みなさんこんにちは!タカモリです。

今日からまた、新しいことを進めていきたいと思いますが、前回はルーティングでしたっけ??

結構自分も理解するのに苦労したんですよ!!笑

今回やる内容もまた、非常に理解に苦しんでいるものです。というか現在進行形です。

というわけで、今回はResponsクラスについて!ということで、以前いつだったかRequestクラスってのをやりましたよね。

それはユーザーからサーバへの要求という部分だったのですが、今回はその反対の部分ということになります。

つまり、サーバーから、ユーザーのブラウザに向かって要求された内容を返すということですね。

というわけで、まずはsrcを貼っていく。

このブログの内容はパーフェクトphpの内容の順番通りに進めているのだが、順番通りに進めるだけだとなかなか説明しずらい部分も多い。

正直今回のResponsクラスなんてのは、果たしてこんな最初の方で説明するクラスなのか??

と思ってしまうようなクラスで、かなり話がしにくいし、実際の挙動も見ることも難しいので、できる範囲でやっていきたいと思う。(というか自分自身も実際の挙動については自身なさげ)

このクラスを全体的に見渡したときに、メソッドが4つ用意されているのだが、この4つのうちほとんどが引数をもとにそれを、プロパティに代入するというものだ。

ということで、setContent()メソッドsetStatus()メソッドsetHttpHeader()メソッドについては、特に話すことはない!!

ただし、各プロパティについては、既に初期の値が設定されており、$status_codeには200、$status_textには’OK’、$http_headersには空の配列が値として入っている。

この3つについては、例えばリダイレクトなど、header()関数を利用したいときに、この初期値を変更するときに使用するものと俺は推測している!

$contentプロパティについては、初期値が設定されてはいないのだが、この$contentの中身には、setContent()メソッドにより実際にユーザーのブラウザに送られるhtmlのデータがそのまま入ることになっている。

とまぁ、ここまで話した上で、今回の肝であるsend()メソッドについて話していきたいと思う。

・send()メソッド

そもそもsendの意味がわからなかったので、調べてみたところ、これは「与える」という意味らしい。ユーザーに要求されたものを与えるみたいな意味合いでよいのかな?

このメソッドでの処理の中には、これまで俺が遠ざけていたheader()関数が用意されている。

header()関数とは、生のリクエストヘッダを送信する関数らしい!!

いや、この説明でわかる初心者おらんやろ!!生ってなんやねん。レバーか!?ビールか!?

結論から言わせてもらうと、俺もよくわかっていないのだが、そもそも、ユーザにサーバーからレスポンスを返すときには、「ステータスライン」・「HTTPレスポンスヘッダ」・「HTTPレスポンスボディ」の3構成で返すのだが、この「HTTPレスポンスボディ」については、htmlがそのまま入っている。

今回のクラスで言うところの$contentプロパティにあたる。

残り二つの「ステータスライン」・「HTTPレスポンスヘッダ」について、ユーザーに送信できる関数なのではないかと踏んでいる。

この関数を使えば、相手が指定してきたurlを無視して、自分が見せたいurlに変更(リダイレクト)してレスポンスを返したりすることができるらしい。

というわけで、実際の挙動について調べてみた結果の画像を貼っておく。

コメントアウトしている部分については、見ていないことにしておいてくれ。

この構文はクラスではないものの、まずは$http_headerを空の配列で初期化しており、その後、header()関数と、foreach()を実行した後、echo文により、ハローワールドを出力している。

ん??これじゃハローワールドではなく、ハローウッドだって??ち、バレたか。

俺は英語が苦手なのだ!!まぁ、気にしないでくれ。とりあえずこの構文はやっていることは、send()メソッドとほぼ同じである。

ではこれを実際に実行するとどうなるのか。

これが結果発表だ。特に上のheader()関数とforeach()については、関係なくただただ、echo文が実行された。

ということは、send()メソッドについては、特に変更される値がない場合については、そのまま$contentの中身が出力されそうだ。

ではここで、先ほどの構文を少しいじってみたいと思う。

この構文では先ほどのforeach()は取りやめて、代わりにリダイレクトの効果のあるLocation: http~の形に変更してみた。

この場合の挙動はどうだろうか。

ちなみに、この構文のurlは「study.localhost/Respons.php」なので、それをurlに打ちこむこととする。

するとどうだろうか。

実行結果はこれである。

この画像の中身については気にしないでくれ。「study.localhost/Respons.php」にアクセスしたところ、urlを打ちこみ、エンターキーを押した直後に、urlが先ほど上のheader()関数内に書きこんだurlにリダイレクトされた。(初めてなので少し感動)

なお、その構文の下にあったecho文については無視される模様だ。まぁあたりまえか。

このリダイレクトの処理についてもこの先進めるうちに出てくることになるので、予め挙動を確かめておいた。

以上の結果からsend()メソッドの挙動については、基本的にはhtmlを出力するが、急遽リダイレクトするときなどにも使用することができるメソッドということになるのではないだろうか。

というわけで、今回のResponsクラスについてはここまでだ。もし俺が間違って言っていることがあったら遠慮なく教えて下さい。

よろしくお願いいたします。。ではまた次回!!