はじめに
PHP アドベントカレンダー が結構空いているので突貫で記事を書いています。
以前、以下のような記事を書きました。
また、Qiitaにはこんな記事も書きました。
このように、PHPには面白い挙動がいろいろあります。最近は面白い挙動や細かい仕様について、見つけるたびにサンプルを書いてリポジトリに追加していっています。
今回は、この中から「面白いな」と思ったものをいくつか紹介します。
PHPのバージョン
- PHP 7.2.4
empty(false) は true
PHPerには常識かもしれませんが、empty(false)
は true です。is_null(false)
は false です。
var_dump(empty(false));
var_dump(is_null(false));
実行結果
bool(true) bool(false)
empty や is_null 、 if($variable)
した時のPHPの挙動は難しいです。公式ドキュメントに挙動一覧の表が載っているほどです。
empty([])
や empty("")
が true になるのはなんとなくわかりますが、 empty(false)
まで true になってしまうのは、知らなければハマってしまいそうです。
is_null は割と素直な挙動を示しますし、isset は単に is_null の逆なのですが、 if("0")
は false となり分岐には入らないので難しいところです。名前に "0"
と入れられた時にバグらないようにしましょう。 ((これからPHP使ってそうなサイトで名前とかタイトルに "0"
を入れて回る作業をはじめなければ...))
is_numericはfloatでもtrue
is_numericという関数があります。文字列が数値としてvalidかどうかを確かめる関数です。
is_numeric("1235"); // => true
まれに、これを「stringが整数値かどうか」の判定に使っているコードを見ますが、is_numericはfloat型でもvalidと判定されるので注意が必要です。
is_numeric("0.234"); // => true
つまり
if (is_numeric($_GET["id"])) { return (int) $_GET["id"]; }
このような利用は注意が必要です。
$datetime->format の t
DateTime::formatにtを指定するとその月の末日を表現できます。
$time = new DateTime("2008-02-22 10:00:00"); var_dump($time->format('Y-m-t')); // string(10) "2008-02-29"
なんとこの際うるう年までしっかりと考慮されるのです。知らなかった。
まとめ
PHPにはまだまだ面白い挙動、ハマりそうな挙動があります。何も考えずにタイトルに「その1」とつけてしまいましたが、また何かあれば紹介したいと思います。