カテゴリー : PHP他

PHP 今さらですが前月、翌月の日付取得

日付を取り扱う処理で前日や翌日、前月や翌月などを取得しようとすると、閏年の事も考えながら if 文などを使わなければならず、意外と面倒だ。

だったのだが、mktime() を使えば簡単に取得できる事が分かった(今さらで済みません orz)。

例えば今日の前日や翌日、あるいは前月や翌日は次の通り。

$yesterday = date('Y-m-d', mktime(0, 0, 0, date('n'), date('j') - 1, date('Y'));
$tomorrow = date('Y-m-d', mktime(0, 0, 0, date('n'), date('j') + 1, date('Y'));
$pastmonth = date('Y-m-d', mktime(0, 0, 0, date('n') - 1, date('j'), date('Y'));
$nextmonth = date('Y-m-d', mktime(0, 0, 0, date('n') + 1, date('j'), date('Y'));

なお、mktime() の引数に負の値が使えるのは、Windows で PHP5.1 以降なので使う場合はご注意を。

PHP5 クラス継承とメソッドのオーバーライド

PHP を習い始めてみると、Web アプリケーションを作る事に主題があるため、データベースの使い方、セッションやクッキーなどを利用した認証管理、メールの扱い方、開発に必要なフレームワーク、何よりも Web を取り巻く環境についての学習で手一杯だ。そのため、言語それ自体が持つオブジェクト指向プログラミングの機能について、かなり疎かにしていた事に気が付いた。

今後はもう少し突っ込んで勉強しようかと反省をしている。

さて今回、クラス継承した子クラスでメソッドをオーバーライドしたとき、親クラスでそのメソッドを呼び出していた場合、親クラスのメソッドが有効なのか、子クラスのメソッドが有効なのか悩んだのでテストして見ることにした。プログラムは以下の通り。

<php
class papa {
    public function __construct() {
        $this->hello();
    }

    protected function hello() {
        echo 'フムフム';
    }
}

class son extends papa {
    protected function hello() {
        echo 'キタ━━━━(゚∀゚)━━━━ !!!!!';
    }
}

$ore = new son();

さて、結果はいかに?何と、

キタ━━━━(゚∀゚)━━━━ !!!!!

でした。それでは、「protected」を「private」にするとどうなるか?

フムフム

でした。「public、protected、private」は、スコープに影響するので正しく使わないといけないですね。

次に、子クラスにもコンストラクタを用意するとどうなるでしょうか?子クラスを次のように書き換える。

class son extends papa {
    public function __construct() {
        $this->thanks();
    }

    protected function hello() {
    	echo 'キタ━━━━(゚∀゚)━━━━ !!!!!';
    }

    protected function thanks() {
        echo 'ドモドモ';
    }
}

結果は、

ドモドモ

でした。親クラスのコンストラクタは呼び出されないので、初期化で必要なら必ず呼び出すように。

class son extends papa {
    public function __construct() {
        parent::__construct();
        $this->thanks();
    }

以上、オレ備忘録でした。
PHP Ver.5.2.14

遅ればせながらQRコードをGoogle Chart API を使って表示してみた

QRコードを表示するためのプログラムを調べていた5年ほど前と比較すると、今はツールが豊富に供給され、手軽に表示できるようになったなぁ、と感心する。中でも Google Chart API を使ったこの方法が、一番お手軽ではないだろうか。

試しに、携帯のメーラーが起動できるか docomo用のコード

  MATMSG:TO:mt-systems@mt-systems.jp;SUB:docomo;;

を、Google Chart API で以下にQRコード表示してみる。



首尾良く表示、携帯のメーラーは起動しましたか?実は docomo の携帯持ってないので、自分は確認できてません(T_T)。

上の表示の指定は次の通り。

<a href="mailto:mt-systems@mt-systems.jp">
	<img src="http://chart.apis.google.com/chart?cht=qr&amp;chl=MATMSG%3ATO%3Amt-systems%40mt-systems.jp%3BSUB%3Adocomo%3B%3B&amp;chs=180x180" width="180" height="180" />
</a>

Google Chart API のアクセスは「img」タグを利用する。データはURLエンコードして渡す。漢字文字を利用したい場合は、docomo では Shift-JIS を利用するよう指示している。一方、Google Chart API はデフォルトで UTF-8 となっている。そこで、漢字を利用するなら API へのパラメータに「choe=Shift_JIS」を渡せばいいだろう。

docomo用の携帯メーラーに本文もQRコードで読み取りたい場合、上のコードの末尾にある2つの「;;」の間に、「BODY:(メッセージ);」を挿入すればよい。

以上、資料は以下の通りです。

KDDI au の場合

<a href="mailto:mt-systems@mt-systems.jp">
	<img src="http://chart.apis.google.com/chart?cht=qr&amp;chl=MAILTO%3Amt-systems%40mt-systems.jp%0D%0ASUBJECT%3Aau%0D%0A&amp;chs=180x180" width="180" height="180" />
</a>



うーん??? 「SUBJECT:au」 の後ろの改行コードがないようだが、これを読み込むとどうなるのだろうか?

au の資料は

PHP SimpleXML オブジェクト@(アットマーク)attributes のアクセス

PHP で Amazon Product Advertising API を利用して受け取った検索結果の XML データは、SimpleXML のオブジェクトで取り込むことで処理も容易になる。のだが、属性データのアクセスでつまづいて年を越してしまった。次のようなオブジェクトの [@attributes] が、どうやってアクセスしたらいいか分からなかったのである。

SimpleXMLElement Object
(
    [Argument] => Array
        (
            [0] => SimpleXMLElement Object
                (
                    [@attributes] => Array
                        (
                            [Name] => Timestamp
                            [Value] => 2010-01-02T13:34:57Z
                        )
                )

            [1] => SimpleXMLElement Object
                (
                    [@attributes] => Array
                        (
                            [Name] => Version
                            [Value] => 2009-10-01
                        )
                )

年も改まったので、早速 Google 先生にお尋ねしたところ、どなたかのブログのメモ「PHPのsimplexmlで読み込んだXMLの@attributesにアクセスする方法」がヒットした。

なるほど、

$name = $xml->Argument[0]->attributes()->Name;
$value = $xml->Argument[0]->attributes()->Value;

とアクセスすればいいわけか。

ただし、$name も $value もオブジェクトなので、文字列として利用したい場合は、次のようにキャストしておくと良い。

$name = (string) $xml->Argument[0]->attributes()->Name;
$value = (string) $xml->Argument[0]->attributes()->Value;