前の記事 ≪:2011年3月2日 管理人のブックマーク
次の記事 ≫:データのビジュアリゼーションに使えるJSライブラリ「d3.js」

知っとくと便利なPHPのテクニック9つ

2011年03月03日-はてなブックマーク

スポンサード リンク
[PR] 英単語を忘却曲線アプリを使って超効率よく記憶する方法
9 Useful PHP Functions and Features You Need to Know | Nettuts

知っとくと便利なPHPのテクニック9つが掲載されていました。
初心者の方は勿論、PHPを長年使ってる人にも使えるテクニックが載っていましたので勉強がてらにメモ。

func_get_args() 関数で可変引数 を受け取る
通常、関数といえば、次のように引数と共に定義します。

function hoge($arg1, $arg2) {
}

のように定義して引数を受け取りますが、好きな個数で引数を受け取りたい場合は、次のようにfunc_get_argsで受け取れます。

function hoge() {
    $args = func_get_args();
    foreach ($args as $key=>$value) {
        echo "arg{$key} is $valuen";
    }
}

hoge(1,2,3,4); も hoge(1,2) もエラーにならず動きます。

glob で複数のファイルタイプを受け取る

特定ディレクトリの特定拡張子のファイルリストを配列でうけとれるglobですが、次のようにすれば、phpファイルとtxtファイルの両方を受け取れます。
これは知らなかった。っていうか特定のバージョンからいきなり追加されたんじゃないかという気がします。

$files = glob('*.{php,txt}', GLOB_BRACE);

$files にはカレントディレクトリの php と txt 拡張子のファイルリストが入ります。
あと、全てのファイルをフルパスにするには、array_map を使って次のようにすれば便利。

$files = array_map("realpath", $files);

メモリ利用量の関数を使う
memory_get_usage() と memory_get_peak_usage() 関数でPHPのメモリ利用量についてしれます。

memory_get_usage(); を最初に実行して値を受け取った後に、

$array = array();
for ($i=0;$i<100000;$i++) {
    $array[] = $i;
}

のようにメモリを使う処理をして、memory_get_usage(); をもう一度実行、その差分をとれば、処理中にどれだけのメモリを使ったかってことが分かります。
memory_get_peak_usage() 関数によって使ったメモリの最大値についても得ることが出来ます。
単にメモリ量みるならサーバの情報を見ればいいと思っていましたが、PHPで行った処理でどれだけメモリを使ったかを見れるのは便利ですね。
コードの最適化なんかに使えそう。

リソース利用量の情報を得る
getrusage() 関数を使ってCPU利用量やスワップ等、OSの情報が見れます。
systemやuserが利用しているCPU利用率なんかも得られます。
あんまり使わないので知らないという人もいるかもしれませんが、知っておくとphpプログラムで負荷が高くなったりした場合の調査に便利かも。

マジック定数でカレントディレクトリを知る
__LINE__ 現在のコードの行番号
__FILE__ ファイルのパス
__DIR__ ディレクトリのパス
__FUNCTION__ 関数名
__CLASS__ クラス名
__METHOD__ メソッド名
__NAMESPACE__  ネームスペース

という感じでマジック定数というphpが定義する定数がありますが、dirname(__FILE__) とすると、コードのカレントディレクトリが得られます。
index.php から、lib/db.php を読み込むとして、更に lib/db.php から別ファイルを読み込むような場合、dirname(__FILE__)."/db.config.php"; のようにして現在のディレクトリと同じディレクトリにあるファイルを読み込むような場合に使えます。
これで、どこから、lib/db.php を読み込んでも、db.config.php は db.php と同じディレクトリにあるということを保証出来ます。

ユニークなIDを生成する
プログラムを組んでいると色々な局面でユニークIDが必要になることがありますが、md5(time().mt_rand(1,1000000)); という感じで作ったり、uniqid(); で作ったり、uniqidでの生成IDが短い場合は、uniqid('prefix_', true) のようにして作ったり出来ます。

データのシリアライズ
serialize/unserialize でデータのシリアライズが出来ますが、json_encode/json_decode も忘れてはいけませんね。
ajaxプログラミングをする際にはよく使います。
更に、以前当ブログで紹介したmessagepackによるシリアライズ、デシリアライズも便利

文字列の圧縮
他のサーバと通信するような場合、データをローカルにサイズを小さくして保存したい場合は圧縮するとよいですが、gzcompress("圧縮したい文字列"); と gzuncompress("ENCRYPTED"); で圧縮、解凍が出来ます。

処理終了時に実行するハンドラ関数の設定
register_shutdown_function(関数名) を使えば、コード中の処理が全部終わったタイミングで関数を呼べます。
javascript でいうonloadみたいなもの(onunloadでは?という指摘を頂きました。全ての読み込み処理が終わったという意味ではonloadでブラウザを閉じたという意味ではonunloadですね。ってややこしい。とりあえず処理が全部終わったらということで^^;)

register_shutdown_function("my_shutdown");

function my_shutdown(){
  echo "ended";
}

最後に何かを共通で出したいという場合に使えます。

PHPは大量の関数があって色々インスタントに出来て、更に、バージョンがあがるごとに機能が増えていたりするので面白いですね。
より詳細なコードなんかは元エントリの参照をおすすめします

スポンサード リンク

By.KJ : 2011年03月03日 09:08 livedoor Readerで購読 Twitterに投稿

間違いの指摘をしていただける方はメール、あるいはTwitter/FBでお願いします(クリック)