Есть ли ярлык для "isset construct"? - PullRequest
11 голосов
/ 21 ноября 2011

Я часто пишу эту строку кода:

$myParam = isset($params['myParam']) ? $params['myParam'] : 'defaultValue';

Как правило, это делает строку очень длинной для вложенных массивов.

Можно ли сделать ее короче?

Ответы [ 9 ]

14 голосов
/ 21 ноября 2011
function getOr(&$var, $default) {
    if (isset($var)) {
        return $var;
    } else {
        return $default;
    }
}

$myParam = getOr($params['myParam'], 'defaultValue');

Обязательно передайте переменную по ссылке, в противном случае код выдаст E_NOTICE. Также использование if / else вместо тернарного оператора здесь преднамеренно, поэтому zval может использоваться совместно, если вы используете PHP <5.4.0RC1. </p>

3 голосов
/ 28 сентября 2014

PHP 7 будет содержать ?? оператор, который делает именно это.

См. https://wiki.php.net/rfc/isset_ternary, пример:

// Fetches the request parameter user and results in 'nobody' if it doesn't exist
$username = $_GET['user'] ?? 'nobody';
// equivalent to: $username = isset($_GET['user']) ? $_GET['user'] : 'nobody';
3 голосов
/ 21 ноября 2011

Да, с помощью функции прокси, но стоит ли это того?

Кроме того, isset является языковой конструкцией, поэтому ее обертывание в прокси-функцию приведет к снижению производительности, хотя снижение производительности, вероятно, будет менее чем тривиальным (даже не стоит упоминать).

1 голос
/ 03 декабря 2012

Вот что я использую:

function getindex($arr, $index, $default = null) {
    return isset($arr[$index]) ? $arr[$index] : $default;
}
0 голосов
/ 05 сентября 2013

Я знаю, что это ничего не сокращает для вас, но подумал, что просто поделюсь этим, я использую это много в своих приложениях, чтобы убедиться, что что-то установлено и имеет значение.Тогда ...

if(chk_var($myvar)){ ... }
0 голосов
/ 30 июля 2013

Я немного использую этот маленький магический класс, который работает как переменная

class Post() {
 private $post = Array();
 public function __construct() {
  $this->post = $_POST;
 }
 public function __get($name) {
  return @$this->post[$name];
 }
 public function __set($name, $value) {
  return $this->post[$name] = $value;
 }
 public function __call($function, $params) {
  if(isset($this->post[$function])) {
   return $this->post[$function];
  } else {
   $this->post[$function] = $params[0];
   return $params[0];
  }
 }
}
$post = new Post();

, затем в документе вы можете легко использовать его как любую другую переменную, например, $post->name $post->somelist[2] или со значением по умолчанию $post->name("John Doe"), и после этого вы получите его возвращенное и сохраненное.

0 голосов
/ 21 ноября 2011

Если вы часто делаете это, вы, вероятно, упускаете суть.

Фактически, переменные должны быть определены перед использованием .
Так что не должно быть случая, когда ваш параметр не определен.
Просто создайте файл параметров по умолчаниюи инициализируйте каждую вашу переменную.

$params['myParam'] = 'defaultValue'; 

позже его можно изменить при некоторых обстоятельствах, но оно никогда не будет неопределенным.
Есть идея?

0 голосов
/ 21 ноября 2011

Нет. К сожалению, вы не можете. Не прилично. Вам, по крайней мере, придется уступить в производительности.

Обновление : начиная с PHP7, ?? будет делать именно это. Смотри https://wiki.php.net/rfc/isset_ternary

0 голосов
/ 21 ноября 2011

Начиная с PHP 5.3, вы можете использовать:

$myParam = $params['myParam'] ?: 'defaultValue';

Обратите внимание, однако, что $params['myParam'] и isset($params['myParam']) не на 100% совпадают.

...