Najlepszy sposób na nadanie zmiennej wartości domyślnej (symuluj Perl ||, ||=)

Uwielbiam robić takie rzeczy w Perlu: $foo = $bar || $baz aby przypisać $baz do $foo Jeśli $bar jest puste lub niezdefiniowane. Masz również $foo ||= $bletch, które przypisują $bletch do $foo, Jeśli $foo nie jest zdefiniowane lub puste.

Operator trójkowy w tej sytuacji jest żmudny i męczący. Na pewno istnieje prosta, elegancka metoda dostępna w PHP?

Czy jedyną odpowiedzią jest niestandardowa funkcja, która używa isset ()?

Author: BoltClock, 2011-05-12

5 answers

PHP 5.3 ma skrót ?: operator:

$foo = $bar ?: $baz;

, który przypisuje $bar Jeśli nie jest pustą wartością (Nie wiem, jak różni się to w PHP od Perla), w przeciwnym razie $baz i jest taki sam jak w Perlu i starszych wersjach PHP:

$foo = $bar ? $bar : $baz;

Ale PHP nie ma do tego złożonego operatora przypisania(tzn. nie ma odpowiednika ||= Perla).

Również PHP będzie hałasować, jeśli $bar nie jest ustawione, chyba że wyłączysz powiadomienia. Istnieje również różnica semantyczna między isset() a empty(). Pierwszy zwraca false, jeśli zmienna nie istnieje lub jest ustawiona na NULL. Ta ostatnia zwraca true, jeśli nie istnieje lub jest ustawiona na 0, '', false lub NULL.

 173
Author: BoltClock,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-12 08:30:58

W PHP 7 wreszcie mamy sposób, aby to zrobić elegancko. Nazywany jest operatorem null . Możesz go używać w ten sposób:

$name = $_GET['name'] ?? 'john doe';

Jest to równoważne

$name = isset($_GET['name']) ? $_GET['name']:'john doe';
 65
Author: jpschroeder,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-22 14:48:19

Popularnym idiomem pozwalającym zachować kompatybilność ze starszymi wersjami PHP jest:

 $var = $bool   or   $var = "default";
 // If I use it, then only with excessive spaces for clarity.

To działa dla wartości, które mogą być oceniane W kontekście logicznym. Zaletą jest to, że daje również debug e_notice, jeśli zmienna jest niezdefiniowana.

 7
Author: mario,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-12 01:59:54

Dzięki za wszystkie świetne odpowiedzi!

Dla każdego, kto przyjdzie tu po możliwą alternatywę, oto kilka funkcji, które pomagają pozbyć się nudy z tego rodzaju rzeczy.

function set_if_defined(&$var, $test){
    if (isset($test)){
        $var = $test;
        return true;
    } else {
        return false;
    }
}

function set_unless_defined(&$var, $default_var){
    if (! isset($var)){
        $var = $default_var;
        return true;
    } else {
        return false;
    }
}

function select_defined(){
    $l = func_num_args();
    $a = func_get_args();
    for ($i=0; $i<$l; $i++){
        if ($a[$i]) return $a[$i];
    }
}

Przykłady:

// $foo ||= $bar;
set_unless_defined($foo, $bar);

//$foo = $baz || $bletch
$foo = select_defined($baz, $bletch);
Jestem pewien, że można je poprawić.
 7
Author: Tom Auger,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-22 16:40:31

W PHP wcześniej niż 7.* , można użyć ?: dla niezdefiniowanej zmiennej o błędach lokalnie tłumionych przez @:

$foo = @$bar ?: $baz;
 1
Author: AndreyS Scherbakov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-28 11:23:08