В Perl, если я хочу по умолчанию значение, которое может существовать, например, как переданный параметр, я могу сделать это:
$var = parm->('variable') || 'default';
Есть ли что-то аналогичное в PHP или мне нужно проверить значение после назначения, и если он все еще null, присвойте ему значение по умолчанию?
Не совсем.
PHP 5.3 представил то, что они называют «тройной ярлык».
// old way $foo = $foo ? $foo : 'default'; // new way in 5.3 $foo = $foo ?: 'default';
Это даже не так много ярлыков и работает только с коэффициентами короткого замыкания (если 0
является допустимым значением для $foo
этот ярлык завершится с ошибкой).
В противном случае вам придется выполнять проверку типа / существования старого, жесткого, ручного способа.
Вы также можете указать значения по умолчанию для параметров в сигнатуре – не уверен, что именно это вы получаете, но вот что в действии
function foo( $bar = 'baz' ) { echo $bar; } foo(); // baz
$var = (!empty($foo)) ? $foo : 'default';
Я думаю, что стандартный тернар является defacto в PHP:
$var = $foo ? $foo : 'default'; echo $foo ? $foo : 'default';
Но есть несколько других трюков, которые могут быть немного чище в некоторых случаях:
//these are very close but can't be echo'd inline like a ternary $var = $foo OR $var = 'default';//assigning a default to $var if $foo is falsy ($var = $foo) || $var = 'default';//same effect as above isset($var) || $var = 'default';//making sure $var is set
Вот один из них: echo'd inline:
$var = ($foo) ?: 'default';//partial ternary echo ($foo) ?: 'default';//aka ternary shortcut (PHP 5.3+ only)
Важно отметить, что многие из них могут испускать ошибки, когда варны не установлены 🙁
echo @($foo) ?: 'default';//@ fixes it but isn't considered good practice
Одно место, которое не стоит использовать тернарный подход, – это когда они вложены:
$user = (($user)?$user:(($user_name)?$user_name:(($user_id)?$user_id:'User'))); echo 'Welcome '.$user;//is pretty messy ($user = $user) || ($user = $user_name) || ($user = $user_id) || ($user = 'User'); echo 'Welcome '.$user;//is more readable
В любом случае, весело провести время.