Intereting Posts

Нулевой коалесцирующий оператор C # (?) В PHP?

Есть ли какой-либо тернарный оператор или тому подобное в PHP, который действует как ?? от C #?

?? в C # чист и короче, но в PHP вы должны сделать что-то вроде:

 // This is absolutely okay except that $_REQUEST['test'] is kind of redundant. echo isset($_REQUEST['test'])? $_REQUEST['test'] : 'hi'; // This is perfect! Shorter and cleaner, but only in this situation. echo null? : 'replacement if empty'; // This line gives error when $_REQUEST['test'] is NOT set. echo $_REQUEST['test']?: 'hi'; 

Related of "Нулевой коалесцирующий оператор C # (?) В PHP?"

PHP 7 добавляет оператор null coalesce :

 // Fetches the value of $_GET['user'] and returns 'nobody' // if it does not exist. $username = $_GET['user'] ?? 'nobody'; // This is equivalent to: $username = isset($_GET['user']) ? $_GET['user'] : 'nobody'; 

Вы также можете взглянуть на короткий способ написания тернарного оператора php :: (только php> = 5.3)

 // Example usage for: Short Ternary Operator $action = $_POST['action'] ?: 'default'; // The above is identical to $action = $_POST['action'] ? $_POST['action'] : 'default'; 

И ваше сравнение с C # не справедливо. «В PHP вы должны сделать что-то вроде:« В C # у вас также будет ошибка времени выполнения, если вы попытаетесь получить доступ к несуществующему элементу массива / словаря.

Оператор Null Coalesce , ( ?? ) был принят и реализован на PHP 7 . Он отличается от короткого тройного оператора ( ?: ?? что ?? будет подавлять E_NOTICE , который в противном случае возникал бы при попытке получить доступ к массиву, где он не имеет ключа. Первый пример в RFC дает:

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

Обратите внимание, что оператор не требует ручного применения isset для предотвращения E_NOTICE .

Я использую функцию. Очевидно, что это не оператор, но кажется более чистым, чем ваш подход:

 function isset_or(&$check, $alternate = NULL) { return (isset($check)) ? $check : $alternate; } 

Применение:

 isset_or($_REQUEST['test'],'hi'); 

До PHP 7 нет. Если вам нужно задействовать isset , шаблон для использования isset($var) ? $var : null isset($var) ? $var : null . Нет ?: Оператор, который включает в себя характеристики isset .

?? является двоичным в C #, а не тройным. И он не имеет эквивалентности в PHP до PHP 7.

Аналогичный оператор не существует с PHP 5.6, но вы можете сделать функцию, которая ведет себя аналогично.

 /** * Returns the first entry that passes an isset() test. * * Each entry can either be a single value: $value, or an array-key pair: * $array, $key. If all entries fail isset(), or no entries are passed, * then first() will return null. * * $array must be an array that passes isset() on its own, or it will be * treated as a standalone $value. $key must be a valid array key, or * both $array and $key will be treated as standalone $value entries. To * be considered a valid key, $key must pass: * * is_null($key) || is_string($key) || is_int($key) || is_float($key) * || is_bool($key) * * If $value is an array, it must be the last entry, the following entry * must be a valid array-key pair, or the following entry's $value must * not be a valid $key. Otherwise, $value and the immediately following * $value will be treated as an array-key pair's $array and $key, * respectfully. See above for $key validity tests. */ function first(/* [(array $array, $key) | $value]... */) { $count = func_num_args(); for ($i = 0; $i < $count - 1; $i++) { $arg = func_get_arg($i); if (!isset($arg)) { continue; } if (is_array($arg)) { $key = func_get_arg($i + 1); if (is_null($key) || is_string($key) || is_int($key) || is_float($key) || is_bool($key)) { if (isset($arg[$key])) { return $arg[$key]; } $i++; continue; } } return $arg; } if ($i < $count) { return func_get_arg($i); } return null; } 

Применение:

 $option = first($option_override, $_REQUEST, 'option', $_SESSION, 'option', false); 

Это будет проверять каждую переменную до тех пор, пока не найдет тот, который удовлетворяет isset() :

  1. $option_override
  2. $_REQUEST['option']
  3. $_SESSION['option']
  4. false

Если бы не было 4, это было бы по умолчанию null .

Примечание. Существует более простая реализация, использующая ссылки, но она имеет побочный эффект от установки проверяемого элемента в null, если он еще не существует . Это может быть проблематично, когда размер или правдивость массива имеет значение.