読者です 読者をやめる 読者になる 読者になる

kwsktr's study log

kwsktr のおべんきょログ

空文字列が入った変数を count すると 1 になる

PHP

PHP をやっているといろいろな関数があって便利な反面、なんでこんな返り値なんだ!? ということが多々あるかと思います。


最近、遭遇してビックリしたのは count の振る舞い。


PHP: count - Manual

count — 変数に含まれるすべての要素、 あるいはオブジェクトに含まれる何かの数を数える

<?php
$var = '';  // 空文字列


$result = count($var);
var_dump($result);  // count だと int(1)


$result = strlen($var);
var_dump($result);  // strlen だと int(0)


既存のコードを修正してページを追加するお仕事していたときに、for が回らなくてエラーがでてハマってしまいました。
どうやら、配列を格納するべき変数なのに、メソッドのバグで空文字列が入ってしまったことが原因でした。
空文字列が入っている変数を、for で回すために count 関数で数を数えたところ、まさかの 1 が帰っていたために、おかしな動きをしていたというわけです。
int(1) という返り値のおかげで、中途半端に1回だけループしていたために、しばらくバグに気付けませんでした。


それにしても count の振る舞いは、感覚的にはわかりにくい。
count とは直訳で「数える」というわけで、空の文字列を 1 として数えるというのはどうなんでしょう。
空文字列も「数えた」場合には int(0) で良いのではないかと…
だって……

<?php
$var = null;


$nya = "";

$result = ($var == $nya) ? true : false;
var_dump($result);  // bool(true)


$wan = array();

$result = ($var == $wan) ? true : false;
var_dump($result);  // bool(true)


空文字列や空配列と null を一緒に扱ってしまうんだから、count も空文字列を int(0) として扱ってくれませんかね。と、思うわけです。


もっとも「==を使うな」というのは、あるんですけれどね。
頑張っていきましょう。

プログラミング PHP

洋書は第3版が今年の初めに出版されているようなので、PHP 5.5 に対応して、年末くらいにはでるのかなと、予想。