指向性メモ::2004-10-30

ページ情報
制作日
2004-10-30T03:07:38+09:00
最終更新日
2004-10-30T22:34:49+09:00
ページ内目次

PHPでHTTP通信するコードを書き直してみた

Created:
2004-10-30T03:07:38+09:00

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が無いのはどういう訳か。微妙に不便な気が。

クラス内クラスが作れないのがちょっと不便かも。

Comments
0
Trackbacks
0
PermaLink
http://yudai.arielworks.com/memo/2004/10/30/030738

命名規則

Created:
2004-10-30T20:47:03+09:00

Javaっぽく、クラス名は大文字から、変数名とメソッド名は小文字から、定数は大文字とアンダーバー、って書いていると、関数名が小文字+アンダーバーのPHPには馴染まないかもしれない。

オブジェクトっぽく書き始めるとなんだかPHPの関数は気持ち悪くなってくる。標準関数が豊富なのはすごく便利なのだけども。

なんか、JavaServlet使いたくなってきた。XREAにtomcat導入されないかな。

Comments
0
Trackbacks
0
PermaLink
http://yudai.arielworks.com/memo/2004/10/30/204703

SPAM

Created:
2004-10-30T22:22:30+09:00

spamメールの語源的存在のSPAMを食べてみた。

たしか480円ぐらいだった。中身はピンク色で、見た目は巨大なソーセージみたいな雰囲気。味は単体で食べるとコンビーフに似てるかもしれない。結構しょっぱくて、独特の臭みが感じられる。これのみで1缶丸ごと食べるのは無理だと思う。

普通はパッケージの写真のように、パンや野菜と組み合わせて食べるらしい。聞いた話によるとフレッシュネスバーガーの「スパムサンドイッチ」は結構おいしいそうだ。

Comments
0
Trackbacks
0
PermaLink
http://yudai.arielworks.com/memo/2004/10/30/222230

フルメタ再びアニメ化

Created:
2004-10-30T22:34:49+09:00

新刊のあとがきで書かれていたけれども、なにやら情報が。

今回は再び本編が主体になるらしい。

うを、「テッサのどきどきジャンボシリコンクッション」が売り切れている……。

Comments
0
Trackbacks
0
PermaLink
http://yudai.arielworks.com/memo/2004/10/30/223449
連絡先、リンク、転載や複製などについては『サイト案内』をご覧ください。Powered by HIMMEL

I ♥ Validator