がるの健忘録

エンジニアでゲーマーで講師で占い師なおいちゃんのブログです。

グローバルスコープ変数? filter_input関数? (それともNULL え・ん・ざ・ん・し?(はぁと))

ふいっと、filter_input関数を思い出しまして(って程度には使ってないw)。
機能的にはさほど大きな違いはないと思われるので、まずは性能をチェック。
基本は以下のコードで、コメントアウトを適宜はずしつつ測定。

<?php

//$_GET['hoge'] = 'a';

$t = microtime(true);
for($i = 0; $i < 100000; ++$i) {
    //$s = (string)@$_GET['hoge'];
    //$s = (string)filter_input(INPUT_GET, 'hoge');
    //$s = (string)($_GET['hoge'] ?? '');
    if (false === isset($_GET['hoge'])) {
        $s = '';
    } else {
        $s = (string)$_GET['hoge'];
    }
}
$t2 = microtime(true);
var_dump($t2 - $t);


結果一覧。


ある:(string)@$_GET['hoge'];
float(0.011772871017456)
float(0.017148971557617)
float(0.015825986862183)
float(0.014954805374146)
float(0.016114950180054)


ある:(string)filter_input(INPUT_GET, 'hoge');
float(0.032809972763062)
float(0.033557891845703)
float(0.02568507194519)
float(0.027527093887329)
float(0.02209997177124)


ある:null演算子
float(0.013915061950684)
float(0.016128063201904)
float(0.013824939727783)
float(0.014352083206177)
float(0.016026973724365)


ある:isset
float(0.023705959320068)
float(0.031208038330078)
float(0.013985872268677)
float(0.028561115264893)
float(0.022880077362061)


ない:(string)@$_GET['hoge'];
float(0.065753221511841)
float(0.078284025192261)
float(0.083561897277832)
float(0.048727035522461)
float(0.057971954345703)


ない:(string)filter_input(INPUT_GET, 'hoge');
float(0.014656066894531)
float(0.01726508140564)
float(0.016877889633179)
float(0.023527860641479)
float(0.022456169128418)


ない:isset
float(0.011105060577393)
float(0.0091698169708252)
float(0.0077798366546631)
float(0.0075478553771973)
float(0.0067591667175293)


ない:null演算子
float(0.010882139205933)
float(0.0078949928283691)
float(0.0078151226043701)
float(0.0083792209625244)
float(0.0070400238037109)


ふむぅ。
配列が「存在する」場合と「存在しない」場合で。
「ある」場合は、超雑な「(string)@$_GET['hoge'];」か、超丁寧な「isset」が双璧で早い感じ。
「ない」場合は、issetがさすがに「言語構造」なので最速、filter_inputがその後を追う感じ。
NULL演算子はいずれにも「隙がない」w。「PHP7以降」ってのが最大の欠点???


速度的にも「10万回ぶんまわして」一番遅いので80ミリ秒、なので。
どれでもそんなにかわらん気もするなぁ色々。


まぁ多分おいちゃん的には「基本的には"ある"前提で考える」ので、その辺の速度とか今までとかの兼ね合いを考えると
・雑に書きたいんなら相変わらず「(string)@$_GET['hoge'];」
・ただし、PHP7環境になったら光の速さでNULL演算子
って感じになるのが多そうかな?