list 2
前もちょっと書いたけど、list() の使い方に関して。ちょっと納得いかんのですよ。
バージョン
試した PHP は以下のバージョンです。マシンは MacBook Air。
% php -v PHP 5.3.10 with Suhosin-Patch (cli) (built: Feb 20 2012 22:55:53) Copyright (c) 1997-2012 The PHP Group Zend Engine v2.3.0, Copyright (c) 1998-2012 Zend Technologies
マニュアルには
マニュアルにはこういうサンプルがあり、その通りに動く。
<?php // list() は文字列では動作しません list($bar) = "abcde"; var_dump($bar); // NULL
でも
次のように文字列を変数にいれ、その変数を list に渡すと、$bar には "a" が入る。
<?php $var = "abcde"; list($bar) = $var; var_dump($bar); // string(1) "a"
マニュアルにあるコメント「list() は文字列では動作しません」は、正しくは「文字列リテラルでは動作しません」じゃないのか。
他の型は
<?php echo "* Array\n"; $var = array('a', 'b', 'c'); list($bar) = $var; var_dump($bar); list($bar) = array('a', 'b', 'c'); var_dump($bar); echo "* Bool\n"; $var = false; list($bar) = $var; var_dump($bar); list($bar) = false; var_dump($bar); echo "* Int\n"; $var = 123; list($bar) = $var; var_dump($bar); list($bar) = 123; var_dump($bar);
↑のコードを実行すると、結果は↓のようになる。
* Array string(1) "a" string(1) "a" * Bool NULL NULL * Int NULL NULL
文字列だけ特殊のようだ。
将来的には
PHP 5.5 からは
<?php echo "abcde"[2]; // "c"
というような書き方ができるようになる(らしい)ので、文字列リテラルでも動作するようになるのかもしれない。ただ、この記法で文字列を1文字ずつ分解し変数に割り当てるというのは、どういう場合に便利な書き方のかは不明。