Vinnaren i pepparkakshustävlingen!
2023-01-02, 18:11
  #1
Medlem
BradSs avatar
Mycket av min kod består av kod som denna:

Kod:
$foo $bar ?: false

Men i och med PHP7 (?) så får jag warnings på dessa, att variable "$bar" inte är definierad. Så det logiska är ju att ändra till detta:

Kod:
$foo = !empty($bar) ? $bar false

Men med Null coalescing operator så ska man kunna göra så här:

Kod:
$foo $bar ?? false

Men är det garanterat att det ger exakt samma resultat som i exemplet innan? Anledningen till frågan är ju då dokumentationen anger "The null coalescing operator (??) has been added as syntactic sugar for the common case of needing to use a ternary in conjunction with isset(). It returns its first operand if it exists and is not null; otherwise it returns its second operand."

isset() och !empty() är ju inte samma sak, även om dom lägger till isset och är inte null vilket känns tokigt för det blir som en mellanläge mellan isset() och !empty(). Alltså om $bar är en tom sträng så är den inte null och den ger false på isset() så då matchar det ju inte min första kodsnutt alls.

Några tankar kring detta?
Citera
2023-01-02, 18:25
  #2
Medlem
Enterprises avatar
Citat:
Ursprungligen postat av BradS
Mycket av min kod består av kod som denna:

Kod:
$foo $bar ?: false

Men i och med PHP7 (?) så får jag warnings på dessa, att variable "$bar" inte är definierad. Så det logiska är ju att ändra till detta:

Kod:
$foo = !empty($bar) ? $bar false

Men med Null coalescing operator så ska man kunna göra så här:

Kod:
$foo $bar ?? false

Men är det garanterat att det ger exakt samma resultat som i exemplet innan? Anledningen till frågan är ju då dokumentationen anger "The null coalescing operator (??) has been added as syntactic sugar for the common case of needing to use a ternary in conjunction with isset(). It returns its first operand if it exists and is not null; otherwise it returns its second operand."

isset() och !empty() är ju inte samma sak, även om dom lägger till isset och är inte null vilket känns tokigt för det blir som en mellanläge mellan isset() och !empty(). Alltså om $bar är en tom sträng så är den inte null och den ger false på isset() så då matchar det ju inte min första kodsnutt alls.

Några tankar kring detta?
Jag kan förstå att du vill att odefinerat värde, Null eller (eventuellt) "" ska returnera false.
Men jag kan inte förstå varför 0 ska returnera false. Vad händer om värdet på riktigt är noll?
Citera
2023-01-02, 18:35
  #3
Medlem
BradSs avatar
Citat:
Ursprungligen postat av Enterprise
Jag kan förstå att du vill att odefinerat värde, Null eller (eventuellt) "" ska returnera false.
Men jag kan inte förstå varför 0 ska returnera false. Vad händer om värdet på riktigt är noll?

Vi pratar om scenarios där jag tidigare använt motsvarande:

Kod:
if ($bar){ $foo $bar; } 

I alla de fallen så är ju $bar = 0 ett false, och det är så koden är uppbyggd helt enkelt. I de fall jag specifikt vill veta om variabeln är satt även om dess värde är 0 så använder jag annan logik så klart.

Så problem uppstår ju när null coalescing operator hamnar i något mellanland mellan isset() och !empty()
Citera
2023-01-02, 18:52
  #4
Medlem
Enterprises avatar
Citat:
Ursprungligen postat av BradS
Vi pratar om scenarios där jag tidigare använt motsvarande:

Kod:
if ($bar){ $foo $bar; } 

I alla de fallen så är ju $bar = 0 ett false, och det är så koden är uppbyggd helt enkelt. I de fall jag specifikt vill veta om variabeln är satt även om dess värde är 0 så använder jag annan logik så klart.

Så problem uppstår ju när null coalescing operator hamnar i något mellanland mellan isset() och !empty()
För ditt use case verkar empty() fungera och det logiska alternativet som du kom på också fungera:
Kod:
<?php

$bar
="";
$foo = !empty($bar) ? $bar false
var_dump($foo);

$bar=0;
$foo = !empty($bar) ? $bar false
var_dump($foo);

$bar=null;
$foo = !empty($bar) ? $bar false
var_dump($foo);

unset(
$bar);
$foo = !empty($bar) ? $bar false
var_dump($foo);
?>
Allt ovan returnerar false.

Med ?? så returnerar de två första testen "" respektive noll (0). Alltså använd inte ?? för att skriva om din befintliga kod.
__________________
Senast redigerad av Enterprise 2023-01-02 kl. 18:55.
Citera
2023-01-02, 18:57
  #5
Medlem
BradSs avatar
Citat:
Ursprungligen postat av Enterprise
För ditt use case verkar empty() fungera och det logiska alternativet som du kom på också fungera:
Kod:
<?php

$bar
="";
$foo = !empty($bar) ? $bar false
var_dump($foo);

$bar=0;
$foo = !empty($bar) ? $bar false
var_dump($foo);

$bar=null;
$foo = !empty($bar) ? $bar false
var_dump($foo);

unset(
$bar);
$foo = !empty($bar) ? $bar false
var_dump($foo);
?>
Allt ovan returnerar false.

Med ?? så returnerar de två första testen "" respektive noll (0). Alltså använd inte ?? för att skriva om din befintliga kod.

Precis vad jag var rädd för, och egentligen visste så klart, men hoppades att någon hade en sjysst workaround som jag inte kände till. Men tack ändå!
Citera

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback