プログラミングPHP 第2版を読んだ

気になったところをメモ。

スタティック変数

関数が終了しても破棄されない。関数内でしか使用できない。

<?php
function counter () {
    static $count = 0;
    return ++$count;
}

$count = 10;
echo counter(); // 1
echo counter(); // 2
echo $count;    // 10

and, && と or, ||

<?php
// 左オペランドがfalseの場合は、右オペランドを評価しない
$result = $flag and mysql_connect();
// 左オペランドがtrueの場合は、右オペランドを評価しない
$result = fopen($filename) or exit();

もう一つのブロック

波括弧の代わりに、コロン(:)とキーワード(endif, endforeachなど)で囲む。htmlに埋め込む時に便利。

<?php
if ($validated) :
    echo "Welcome!";
else :
    echo "Access Forbidden!";
    exit;
endif;

declare

指定した間隔で特定の関数を実行させることができる。register_tick_functionで登録。

<?php
register_tick_function("some_function");

# 3つの文が実行されるたびに、関数sume_functionを呼び出す
declare (ticks = 3) {
    for ($i =0; $i < 10; $i++) {
        // 何らかの処理
    }
}

for文の低レベルな命令もカウントされるらしい。

正規表現

  • インラインオプション = パターンの一部に適用するオプション (?flags:subpattern)
  • 先読みと戻り読み = 「次の文字が○○だったら・・・」(?=subpattern)など
  • 条件式 = 正規表現でのif文のようなもの (?(条件)yespattern|nopattern)

イテレータ関数

<?php
reset($array); // 位置を先頭に戻す
while (list($key, $value) = each($array)) {
    echo "$key : $value\n";
}

この方法だとforeachのように配列をコピーしないのでメモリを節約できる。

オブジェクトのシリアライズ

オブジェクトをバイトストリームに変換し、ファイルに保存できるようにする。

<?php
$encoded = serialize(something);
$something = unserialize(encoded); 

クラスに__sleep()、__wakeup()を定義すると、シリアライズ、復元の際にそれぞれ処理が呼び出される。

出力の圧縮

圧縮したテキストを送信できる。ブラウザがそれを展開して表示。

<?php
ob_start("ob_gzhandler");

php.iniのoutput_handlerにコールバックとして指定することもできる。

  • ob_gzhandler = ob_startのコールバック関数として使用する組み込み関数。

メモリ最適化

  • 数値が使用できる場面では、可能な限り文字列ではなく数値を使用する。("1"ではなく1を使う)
  • mysql_unbuffered_query()を使用すると、結果セットの必要な部分のみを少しずつ読み込める。

PHPの拡張、WindowsでのPHP

ちゃんと読んでないけど、拡張モジュールの作成方法、WindowsPHP、COMなどの説明もあった。


プログラミングPHP 第2版

プログラミングPHP 第2版