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 ()?
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
.
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';
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.
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ć.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;
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