PHP5で書き直してみた。オブジェクト指向っぽい感じ。
class HttpAgent {
protected $limitSize = NULL;
protected $openTimeout = 50;
protected $socketTimeout = 10;
private function __constract()
{
}
public function send($httpRq)
{
if($fp = fsockopen($httpRq->getServer(), $httpRq->getPort(), $en, $em, $this->openTimeout)){
$buffer = "";
if ($this->limitSize) {
$buffer .= fread($fp, $this->limitSize);
} else {
while (!feof($fp)) {
$buffer .= fread($fp, 40960);
}
} else {
return FALSE;
}
fclose ($fp);
$result = new HttpResponse($buffer);
return $result;
}
}
class HttpRequest {
protected $uri = NULL;
protected $headers = array();
protected $server = NULL;
protected $port = 80;
protected $method = "GET";
protected $httpVersion = "1.0";
public function __construct($uri)
{
$this->setUri($uri);
}
public function setUri($val)
{
$this->uri = $val;
}
public function setHeaders($val)
{
$this->headers = $val;
}
public function setMethod($val)
{
$this->method = $val;
}
public function setServer($val)
{
$this->server = $val;
}
public function setPort($val)
{
$this->port = $val;
}
public function setHttpVersion($val)
{
$this->httpVersion = $val;
}
public function getUri()
{
return $this->uri;
}
public function getHeaders()
{
return $this->headers;
}
public function getMethod()
{
return $this->method;
}
public function getServer()
{
if (! $this->server) {
$parsedUri = parse_url($this->getUri());
return $parsedUri["host"];
}
return $this->server;
}
public function getPort()
{
return $this->port;
}
public function getHttpVersion()
{
return $this->httpVersion;
}
public function getRequestMessage()
{
$requestMessage = $this->getMethod() . " " .
$this->getUri() . " HTTP/". $this->getHttpVersion() .
"\r\n";
foreach ($this->getHeaders() as $fieldName => $fieldValue) {
$requestMessage .= $fieldName . ": " . $fieldValue . "\r\n";
}
$requestMessage .= "\r\n";
return $requestMessage;
}
}
class HttpResponse {
protected $rawData = "";
protected $httpVersion = "";
protected $statusCode = "";
protected $reasonPhrase = "";
protected $headers = array();
protected $entityBody = "";
public function __construct($responseMassage)
{
$this->parseResponseMassage($responseMassage);
}
public function parseResponseMassage($responseMassage)
{
$this->rawData = $responseMassage;
$respnseFlagments = explode("\r\n\r\n", $responseMassage);
$responseHeaderFragment = array_shift($respnseFlagments);
$responseHeaderFragmentLines = explode("\r\n", $responseHeaderFragment);
$this->entityBody = implode("\r\n\r\n", $respnseFlagments);
$statusLine = array_shift($responseHeaderFragmentLines);
$statusLineFragments = explode(" ", $statusLine);
$this->httpVersion = $statusLineFragments[0];
$this->statusCode = $statusLineFragments[1];
$this->reasonPhrase = $statusLineFragments[2];
$this->headers = array();
foreach ($responseHeaderFragmentLines as $line) {
$lineFragments = explode(":", $line);
$filedName = rtrim(array_shift($lineFragments));
$this->headers[$fieldName]= ltrim(implode(":", $lineFragments));
}
}
public function getRawData() {
return $this->RawData;
}
public function getHttpVersion() {
return $this->httpVersion;
}
public function getStatusCode() {
return $this->statusCode;
}
public function getReasonPhrase() {
return $this->reasonPhrase;
}
public function getHeaders() {
return $this->headers;
}
public function getEntityBody() {
return $this->entityBody;
}
}
パラメータが多いせいで、getHogeHoge()が延々と続くのがダサい。フィールドというか、メンバ変数をpublicにして直接参照するのも有りだと思うのだけども、それだとカプセル化とは言えない気もする。__call()を使うべきか。
それにしても、どこをオブジェクトとしてとらえて、どこまでメソッドを持たせるかが難しい。
細かいところをもうちょっと煮詰めよう。特にフィールドの初期化方法が微妙だ。Javaの本ばっかり読んでいたので、型宣言が無いとどうも気持ち悪いんだけども、その代わりに""とかでString型、とやるのも中途半端か。
try...catchは実装されたのにfinallyが無いのはどういう訳か。微妙に不便な気が。
クラス内クラスが作れないのがちょっと不便かも。
Javaっぽく、クラス名は大文字から、変数名とメソッド名は小文字から、定数は大文字とアンダーバー、って書いていると、関数名が小文字+アンダーバーのPHPには馴染まないかもしれない。
オブジェクトっぽく書き始めるとなんだかPHPの関数は気持ち悪くなってくる。標準関数が豊富なのはすごく便利なのだけども。
なんか、JavaServlet使いたくなってきた。XREAにtomcat導入されないかな。
spamメールの語源的存在のSPAMを食べてみた。
たしか480円ぐらいだった。中身はピンク色で、見た目は巨大なソーセージみたいな雰囲気。味は単体で食べるとコンビーフに似てるかもしれない。結構しょっぱくて、独特の臭みが感じられる。これのみで1缶丸ごと食べるのは無理だと思う。
普通はパッケージの写真のように、パンや野菜と組み合わせて食べるらしい。聞いた話によるとフレッシュネスバーガーの「スパムサンドイッチ」は結構おいしいそうだ。
新刊のあとがきで書かれていたけれども、なにやら情報が。
今回は再び本編が主体になるらしい。
うを、「テッサのどきどきジャンボシリコンクッション」が売り切れている……。