Есть ли в PHP эквивалент оператора || =? - PullRequest
7 голосов
/ 19 июля 2009

Я хочу назначить переменную, только она еще не была назначена. Как PHP может сделать следующее?

$result = null;
$result ||= check1();
$result ||= check2();
$result ||= "default";

Я проверил стандартные операторы и функцию is_null , но, похоже, не существует простого способа выполнить вышеуказанную операцию.

Ответы [ 6 ]

17 голосов
/ 19 июля 2009

isset() - это обычный способ сделать это:

if (!isset($blah)) {
  $blah = 'foo';
}

Примечание: вы можете присвоить null переменной, и она будетназначены.Это даст разные результаты с isset() и is_null(), поэтому вам нужно четко понимать, что вы подразумеваете под "не назначен".См. Нуль против isset () .Это также один из случаев, когда вам нужно соблюдать осторожность при выполнении автоматического преобразования типов, то есть использовать !=/== или ===/!== в зависимости от желаемого результата.

Вы также можете использовать для этого логическое сокращение (котороечто такое оператор Perl ||=).Начиная с PHP 5.2.x, нет такого оператора, о котором вы говорите.В Perl:

$a ||= $b;

эквивалентно:

$a = $a || $b;

Вы можете создать вторую форму в PHP, но в PHP есть несколько прикольных правил о жонглировании типа .См. Преобразование в логическое значение :

При преобразовании в логическое значение следующие значения считаются ложными:

Любое другое значение считается ИСТИННЫМ (включая любой ресурс).

Поэтому после:

$a = 0;
$a = $a || 5;

$ a будет равно5. Аналогично:

$a = 0;
$b = '';
$c = $a == $b; // true
$d = $a === $b; // false

Вы должны следить за этими вещами.

14 голосов
/ 19 июля 2009
isset($foo) || $foo = 'bar';
5 голосов
/ 19 июля 2009

С php 5.3 вы можете использовать:

$result = $result ?: check1();
1 голос
/ 19 июля 2009

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

function default_value(&$var, $default) {
    return isset($var) ? $var : $default;
}

$want_something = default_value($_POST['mightbeunset'], false);
0 голосов
/ 19 июля 2009

Я еще не пробовал, но хотел поиграть с PECL Operator целую вечность.

0 голосов
/ 19 июля 2009

Как насчет использования нескольких вложенных троичных операторов?

Для меня это самый простой способ справиться с вашей проблемой. А поскольку вы можете использовать вложенные тернарные операторы, вы сможете добавить больше проверок, если это необходимо.

$var = isset($var) ? $var : ($i=check1()) ? $i : ($i=check2()) ? $i : "default" ;

Это почти такой же объем кода, и он должен работать .. если я не понял вас. Если это так, извините.

По сравнению с исходным кодом, который вы разместили в качестве примера, длина практически одинакова:

$result = null; $result ||= check1(); $result ||= check2(); $result ||= "default";
 - vs -
$var = isset($var) ? $var : ($i=check1()) ? $i : ($i=check2()) ? $i : "default" ;

Вложенные троичные операторы могут быть немного запутанными, поэтому здесь у вас есть это с комментариями:

    // Is $var set?
    $var = isset($var) ?
        // TRUE: It is, use $var
        $var :
        // FALSE: $var is not set, run check1
        ( $i=check1() ) ?
        // TRUE: the function check1 returned valid data
        $i :
        // FALSE: the function check1 returned null or false, run check2
        ($i=check2()) ?
        // TRUE:  the function check2 returned valid data
        $i :
        // FALSE: the function check1 returned null or false, set default value
        "default" ;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...