Есть ли ярлык для "isset construct"?

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

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

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

Могу ли я сделать это короче?

Ответ 1

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';

Ответ 2

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.

Ответ 3

Да, создав прокси-функцию, но действительно ли это стоит?

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

Ответ 4

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

function getindex($arr, $index, $default = null) {
    return isset($arr[$index]) ? $arr[$index] : $default;
}

Ответ 5

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

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

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

Ответ 6

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

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

Ответ 7

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

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"), после чего вы получите его, а также сохранили.

Ответ 8

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

function is_blank($var = NULL){
    return empty($var) && !is_numeric($var) && !is_bool($var);
}    

function chk_var($var = NULL){
    return (isset($var) && !is_null($var) && !is_blank($var));
}

Тогда...

if(chk_var($myvar)){ ... }

Ответ 9

Если вы часто это делаете, вам, вероятно, не хватает смысла.

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

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

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