PHPプロ!TIPS+

1. 携帯サイトを作るためのPEAR::Net_UserAgent_Mobile

携帯サイトを作る場合、機種判定が必要になる場合が多いと思います。

今回は、機種判定を簡単に行ってくれるライブラリ、PEAR::Net_UserAgent_Mobileをご紹介します。

まず、PEAR::Net_UserAgent_Mobileをインストールします。このライブラリはベータ版なので、pearコマンドを使って

pear install Net_UserAgent_Mobile-alpha

で、インストールすることが出来ます。

インストールできたら、さっそく使ってみましょう。以下は、アクセスしてきた端末のキャリアと型番を表示するサンプルプログラムになります。

<?php
// ここのインクルード指定は、Net_UserAgent_Mobileの配置場所に応じて適宜変更して下さい。
include_once('Net/UserAgent/Mobile.php');

$agent Net_UserAgent_Mobile::factory();
//型番の入手
$model $agent->getModel();

if (
$agent->isDoCoMo()) {
echo(
"お使いの機種はDoCoMoの{$model}です。");
} else if (
$agent->isVodafone()) {
echo(
"お使いの機種はVodafoneの{$model}です。");
} else if (
$agent->isEZweb()) {
echo(
"お使いの機種はEZwebの{$model}です。");
}
?>

このように、Net_UserAgent_Mobile::factory()メソッドでインスタンスを作った後、メソッドを通じて機種判定などの処理を行えます。

getModel()
型番の文字列を返す
isDoCoMo()、isVodafone()、isEZweb()
各キャリアの端末ならtrue、そうでなければfalse

他にも、機種判定用の便利なメソッドが用意されています。

isFOMA()
DoCoMoのFOMA端末ならtrue、そうでなければfalse
isWAP1(), isWAP2()
それぞれEZwebのWAP1(WAP2)端末ならtrue、そうでなければfalse

また、factoryメソッドでは、ユーザーエージェントを引数に指定することで、特定の端末の情報を取得することができます。

$user_agent = 'DoCoMo/2.0 N900iS(c100;TB;W24H12)';
$agent = Net_UserAgent_Mobile::factory($user_agent);

こうすることで、実機でアクセスしなくてもユーザエージェントが分かれば情報を入手することが可能です。

この他にも、多くの便利なメソッドが用意されています。執筆時点ではまだベータ版ですが、携帯サイトを作成する上で非常に便利なライブラリです。

2. FPDFで簡単にPDFを作ろう

PHPでPDFを作成したいとき、皆さんはどのようなライブラリを用いて作成しますか?PDFlibでしょうか。PDFlibはPHP側であらかじめ関数が用意ということもあって使いやすいかもしれません。しかし、ライブラリをコンパイルしなければならないなど手間が掛かることがあります。そこで、今回はフリーウェアとして公開されているPDF作成のクラス「FPDF」を使って簡単にPDFを作成する方法をご紹介します。

FPDFはフリーウェアとして公開されているPDFを作成するためのPHPクラスです。しかも、このクラスを利用してPDFを作成するのに特別なextensionは必要ありません。動作環境としてはPHP4またはPHP5の環境となります。

では早速使ってみましょう。FPDFのサイトで公開されているものでも日本語対応モジュールをインストールすることにより日本語のPDFを作成することが可能になりますが、airwhile氏によって機能拡張されたMBFPDFを使うことによって日本語特有の処理にも対応できるようになります。よって今回はそのMBFPDFを用いて作成します。

まず、FPDFのサイトで公開されているFPDFをダウンロードして解凍します。次にMBFPDFをダウンロードして先のFPDFのディレクトリにファイルをコピーします。これで準備完了です。

これらのファイルと同じ階層に下記スクリプトを書いて保存、実行してください。

<?php
require('mbfpdf.php');

$pdf=new MBFPDF();
$pdf->AddMBFont(KOZMIN'EUC-JP');
$pdf->Open();
$pdf->AddPage();
$pdf->SetFont(KOZMIN''20);
$pdf->Write(10,"こんにちはFPDF\n");
$pdf->Output();
?>

ページ左上に「こんにちはFPDF」と書かれたPDFが作成されます。スクリプトの流れを簡単に説明すると、AddMBFont()で使用するフォントを指定します。設定されている日本語フォントは、KOZMINの他に、GOTHIC、PGOTHIC、UIGOTHIC、MINCHO、PMINCHOです。次にOpen()でPDFを作成し、AddPage()で新規ページを追加、SetFont()でAddMBFont()で指定したフォントをセットしてWrite()で文を書いてOutput()でPDFを出力。以上のような流れになります。

FPDFには、もちろんこれ以外にも様々な機能が用意されています。表を作成したりJPEGまたはPNGといった画像を貼り付けたりすることが出来ます。

特別なextensionを用意する必要もなくこのクラスファイルだけでPDFを作成することが出来るFPDF。皆さんも使ってみてはいかがでしょうか。

3. PHPの最後の?>は不要なんです

今回はコーディング規約についてちょっとおさらいをしてみたいと思います。

みなさん、それぞれ会社のコーディング規約というものがあると思いますが、PHPの代表的なコーディング規約といえば、「PEARコーディング規約」(以下PEAR規約)と「Zend Framework PHP 標準コーディング規約」(以下Zend規約)があります。

その中のいくつかを見ていきたいと思います。

まず、意外に知られていないスクリプトの最後の「?>」ですが、(ご存知の方はおさらいということでご容赦下さい。)

「Zend規約」より抜粋

A.2.1. 全般
PHP コードのみからなるファイルでは、終了タグ ("?>") は決して含めてはいけません。終了タグは、PHP には必要ありません。終了タグを省略することで、ファイルの最後にある空白文字が出力に影響することを防ぎます。

入門書等では、PHPコードを書く場合は「」で囲われた中に書きましょうというのが一般的ですが、PHPのコードのみからなるファイルでは最後の?>を省略したほうがいいとのことです。

これは、ファイルの最後に余計な改行・空白等が含まれてしまうと表示や動作に影響してしまうためです。

具体的な例としてはheader()関数が当てはまります。header()関数コール前に出力があってはいけない為です。

詳しくはマニュアルをご覧下さい。header関数 :
http://www.phppro.jp/phpmanual/php/function.header.html

とはいえ、別のTipsにもなってしまうのですが、UnicodeでBOMをつけてしまうと、

こういった問題への対策として、出力制御関数(ob_start()など)や、php.iniの設定でoutput_bufferingをOnにする(もしくはoutput_handlerを設定する)ことで、出力をバッファリングする方法があります。BOMによる問題も避けられる為、対策としてはリーズナブルですが、そもそも目的用途が違うことや、ゴミ(改行や空白)も残るので推奨されません。ただ、php.ini-recommendedではoutput_bufferingがOn(正確には4096バイトの値指定)になっています。recommendedを設定のベースにしている際には逆に「元々対策がされている」状態になってしまうので注意が必要です。

また、イメージ関数を使う場合にも注意が必要です。

$im = imagecreatefrompng("y.png");
imagepng($im);

画像を出力する際に、出力の前に余計な改行やスペースが含まれた場合出力画像が壊れてしまい表示できなくなってしまいます。クラスを定義したファイルなどで、以下のようになっていたりしませんか?

<?php

class SampleClass {
//内容
}

?>
←この行に無駄な改行!
[EOF]

上記の場合、最後の一行に改行が入ってしまっているので出力にも改行が含まれてしまいます。こういった単純なミスを防ぐためにも、「?>」は書かないほうが良いとのことです。

※注「PEAR規約」では、「?>の下にカーソルがある状態にすること」となっています。

次に制御構造(if , else, for等)の書き方ですが、これは「PEAR規約」「Zend規約」共に、「条件を指定する括弧の前に空白をひとつ入れなければなりません。また、条件指定の括弧を閉じた後にも空白をひとつ入れなければなりません。」というルールとなっています。「Zend規約」のほうには、さらに詳細に記述してあります。

if ($a != 2) {
$a = 2;
} else if($a === 2) {
$a
}

上記だと、ifと「(」の間にスペース「)」と「{」の間に空白ひとつが必要です。また、「"elseif" を使用することは可能ですが、推奨されません。代わりに"else if" を使用してください。」とあります。

このほか、字下げについても決められており、「PEAR規約」「Zend規約」ともに「タブを使用しないで、空白4文字で行います」とあります。

これについては、賛否両論があり、私もどっちがいいとは言いがたいことではあります。

上記はほんの一例ですが、他にも、関数名・変数名の命名規約やコメントの書き方について書かれています。

「コーディング規約に従うことで、 コードの品質保持・バグの減少・保守の容易性の確保 などの助けになります。」(Zend規約より)とあります。

これらのコーディング規約を読み返し、自分のコードにあてはまることはないか、今一度見直してみてはいかがでしょう。

注)PEARコーディング規約、Zendコーディング規約には互いに違う部分があるので、両方にのっとたコーディングが難しい部分もあります。

バックナンバーについて

TIPS-MLは、毎週金曜日に更新され、新しい記事が掲載されます。

Tipsꗗy[W 

Pick Up Q&A

Q
ログファイルの中の空のデータ行を削除したい
 このエントリーをはてなブックマークに追加 
A
ログのデータ個数(列数)が固定で、空のログが"<><><>"だと既知であれば if ($line === "<><><>") { continue; } で読み飛ばしてもいいのでは? ...

>>続きを読む

まずは配列や文字列の扱いから、じっくり勉強して行きましょう。

▲解説者:岡本(アシアル株式会社 教育コーディネーター兼 システムエンジニア)

Q&A掲示板 新着情報