PHP троичен !empty, вместо да оценява на true или false

Възможно ли е да се използва съкратената тройка, за да се провери дали дадена променлива е зададена или не, вместо дали се оценява на нула или не-нула?

Например опитах:

$var = 0;
echo (string) $var ?: (string) false ?: 2;

Но тъй като и двата първи два израза дават 0 или невярно, се показва 2.

Мислех, че може би прехвърлянето им към низ ще доведе до различни резултати, но не стана. Нулата си е нула предполагам.

Искам да използвам този стил, когато присвоявам променливи като

$get->var = $get->var ?: $setindb ?: $default;

Искам да присвоя $get-›var на $get-›var, ако е зададено, в противен случай проверете дали db има стойност, в противен случай използвайте стойност по подразбиране.

редактиране

Реших да спомена, че знам, че мога да направя нещо подобно

$get->var = (!empty($get->var)) ? $get->var : ( (!empty($setindb)) ? $setindb : $default )

Но вие преценете кое е по-лесно :)


person Senica Gonzalez    schedule 07.11.2011    source източник
comment
защо вместо това не използвате isset($get-›var)?   -  person SERPRO    schedule 07.11.2011
comment
добре, вместо празно, в моя пример по-горе, isset би било по-подходящо, но това пак ме поставя в същата ситуация. Търсех по-прост начин да го направя.   -  person Senica Gonzalez    schedule 07.11.2011


Отговори (1)


Низът "0" и "false" се считат за FALSE-y (списък с неверни стойности) стойности в PHP.

isset() връща TRUE за променливи, които са зададени, а не NULL. empty() ще провери дали променливата е зададена и това не е FALSE стойност. Така че ще върне TRUE за "0".

Мисля, че това, което искате, е вашият трети кодов фрагмент, но с isset(), а не empty().

Най-лесният начин да направите (с най-малко скоби), който би бил:

$get->var = isset($get->var) ? $get->var : (isset($setindb) ? $setindb : $default);

Тъй като съкратеният тенар връща първия параметър, не можете да го използвате, защото това би било булево. (isset($get->var) ?: $default ще върне TRUE, FALSE или $default, но никога стойността на $get->var.)


Редактиране: Може би бихте искали нещо като функция за обединяване? PHP не го предлага първоначално, доколкото знам, но е тривиално за създаване. Имайте предвид, че това може да е малко грозно, поради използването на препратки към функция. Ще се интересувам от коментари за това (толкова лошо ли е, колкото си мисля?).

function coalesce(array $values)
{
    foreach($values as &$value)
    {
        if(isset($value))
            return $value;
    }
    return null;
}
$this->var = coalesce(array(&$this->var, &$setindb, $default));

Горното не съм го тествал. Предавайте променливи в масива като препратки (символ &). Почти съм сигурен, че ще се задави с нещо като coalesce(array(1,"a_string",false));.

person RickN    schedule 07.11.2011
comment
добре, не знаех дали има някакъв трик (като кастинг), който троичният модул ще провери, различен от true или false - person Senica Gonzalez; 07.11.2011
comment
PHP7 има оператор за сливане, внедрен с ?? php.net/manual/ en/ - person Mauro Zadunaisky; 17.02.2017