LoginSignup
17
17

More than 5 years have passed since last update.

PHPでnullガード

Last updated at Posted at 2014-09-17

ほほお。まだ提案レベルですが、なんか楽しそうですね。
PHP: rfc:isset_ternary

$username = $_GET['user'] ?? 'nobody';
// equivalent to: $username = isset($_GET['user']) ? $_GET['user'] : 'nobody';

実在すればそのまま、実在しなければデフォルト値、というような感じですね。

モチベーション

PHPで定義されていない変数を参照すると、E_NOTICEが発生します。
そのため、isset()で実在を確認してから作業するのが美徳とされています。

しかし、そうすると手っ取り早く書けないので、気持ち悪いなあ、というのがたぶん冒頭の提案なのだと思います。

現状での解1

5.3以降に導入されたelvis演算子で書けば提案内容っぽいことができます。しかし存在しなかったらE_NOTICEが発生するので、仕方なくエラー抑制演算子を使うことになります。

<?php
$hoge = @$_GET['hoge'] ?: 'default value';

現状での解2

PHP: rfc:ifsetor
こんなのもあったのですね。
php:RFCにも書いてありますが、リファレンスを使うことに抵抗がなければ、ヘルパー関数を作れば終わりだと思います。

<?php
function ifsetor(&$var, $default)
{
    return isset($var) ? $var : $default;
}

$hoge = ifsetor($_GET['hoge'], 'default value');

もしくはデフォルト値で上書きしちゃう手もありますね。(行儀は悪いですが)

<?php
function ifsetor(&$var, $default)
{
    return isset($var) ? $var : $var = $default;
}

ifsetor($_GET['hoge'], 'default value');

配列の奥深くをいきなり指定してもエラーは一切発生しません。

ifsetor($a->b[0][1][3], 'hoge');

var_dump($a);
17
17
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
17
17