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文字ずつ分解し変数に割り当てるというのは、どういう場合に便利な書き方のかは不明。