PHPの勉強 #1 (「プログラミングPHP」第1〜2章)

以前からPHPの勉強はしていましたが、このブログに勉強したことを書くのは初めてなので第1回としました。

使用する本

ええ、Gaucheに引き続き、今回もオライリーです。

プログラミングPHP 第2版

プログラミングPHP 第2版

ていうか買ったのはこっちの方が先なんですけどね^^;

第1章

PHPの歴史とかインストール方法とか簡単なコードサンプルとか。

第2章

論理値のfalse
  • キーワードfalse
  • 整数値0
  • 浮動小数点数値0.0
  • 空の文字列("")および文字列"0"
  • 素数がゼロの配列
  • プロパティやメソッドをいっさい含まないオブジェクト
  • NULL値

文字列"0"もfalse扱いされるんですね。これはtrueの方が自然だと思うんですが…。PHPらしいです。

copy-on-write

たとえば

<?php
$worker = array("Fred", 35, "Wilma");
$other = $worker;
?>

としたとき、$otherは$workerの値へのアドレスを持っている。この状態から

<?php
$worker[1] = 36;
?>

などと片方の値を変えた場合、新たにメモリを確保し、値のコピーを行う。こうすることで時間とメモリを節約する。

参照カウンタ

上のプログラムを例にすると、最初に$workerと$otherに値を代入した時点で参照カウンタが2となる。これはその値へアクセスする方法が2通りあることを指す。次に$worker[1]に36を代入したとき、$worker用に新たにメモリを確保し、コピーを行うので、参照カウンタはそれぞれ1となる。
こんな感じで参照カウンタが減っていき、0になった時点で、メモリが解放される。この参照カウンタはメモリを管理する際によく使われるらしい。
メモリ解放をもう少し細かく行うためにisset()とかunset()とかがある。なるほど〜。

フロー制御文の書き方

普通は

<?php
if ($hoge = true) {
    echo "hello";
}
?>

みたいな書き方ですが、

<?php
if ($hoge = true) :
    echo "hello";
endif;
?>

みたいな書き方ができたらしい。知らなかった…。こっちの方がブロックの最後が何で終わってるのかがわかりやすい。ただNetBeansで試したところ、正常にインデントしてくれませんでした。やっぱりマイナーなのかな。使ってる人見たことないし。http://news.php.net/php.internals/27809で「この書き方廃止にしよっか」とか話されてたらしいし。結局廃止になるのかな?ちなみにendfor, endwhile, endforeachとかもちゃんとあるみたいです。

declare
<?php
//実行させたい関数を指定
register_tick_function("some_function");
declare(ticks = 3) {
    for($i=0; $i < 10; $i++) {
        //何か処理
    }
}
?>

これで3つの文が実行されるたびにsome_function()が呼び出されるらしい。ちなみにdeclare文で使用できる命令は今のところticksの一つだけ。
なんか地味に凄そうだけど、使い道がイマイチよくわからない。マニュアルを見てみるか…。

警告 PHP 5.3.0 で tick は非推奨となりました。 PHP 6.0.0 で削除される予定です。
PHP: declare - Manual

/(^o^)\ ナクナルノカヨ!
でもdeclare文自体はなくならないっぽい。「declare先生の次回作にご期待ください!」ってところかな。

まとめ

endifなどと書けることを知ったときの衝撃は異常。