ふいっと、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演算子
って感じになるのが多そうかな?