WebエンジニアのLoL日記

LoLをプレイしたりLJLの試合を見たりするのが好きなエンジニア。LoLのイベントやパッチノートなど気になった点を記事にしたり、LJLについの記事をかいたりしています。某社でWeb系のエンジニアとして働いているので、技術系の記事もたまに書きます。コンタクトを取りたい場合はtwitterまで。

PHPの面白い挙動や細かい仕様?について その1

f:id:yoshiki_utakata:20181004212834j:plain

はじめに

PHP アドベントカレンダー が結構空いているので突貫で記事を書いています。

以前、以下のような記事を書きました。

www.utakata.work

また、Qiitaにはこんな記事も書きました。

qiita.com

このように、PHPには面白い挙動がいろいろあります。最近は面白い挙動や細かい仕様について、見つけるたびにサンプルを書いてリポジトリに追加していっています。

github.com

今回は、この中から「面白いな」と思ったものをいくつか紹介します。

PHPのバージョン

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の挙動は難しいです。公式ドキュメントに挙動一覧の表が載っているほどです。

PHP: PHP 型の比較表 - Manual

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」とつけてしまいましたが、また何かあれば紹介したいと思います。