WN

WN (https://www.wn.se/forum/index.php)
-   Serversidans teknologier (https://www.wn.se/forum/forumdisplay.php?f=4)
-   -   Dubbla utropstecken i PHP (https://www.wn.se/forum/showthread.php?t=1042721)

Magnus_A 2010-06-29 16:26

Dubbla utropstecken i PHP
 
Har stött på en ovanlig sätt att använda utropstecknet (!) som används som negerande operator i PHP.

I en kodbit som jag hittade http://sourceforge.net/projects/phpexcelreader/ upptäcker jag dubbla utropstecken före vissa uttryck. Det skulle bli en dubbel negation men det verkar lite onödigt.
Effekten borde bli likadan med en enkel typecasting (bool)$expression eller?

Så här ser det ut på en hel del ställen:
Kod:

return !!$this->colInfo[$sheet][$col]['hidden'];
Nån som sett något liknande?

emilv 2010-06-29 18:23

Ja, effekten borde bli densamma som en typecast till bool. Jag har sett liknande ett par gånger tidigare. Vill du verkligen förvirra nästa programmerare slänger du på några utropstecken till!

Tydligast är annars att skriva just (bool) så det blir tydligt vad som händer. Vid en skumläsning kanske någon missar att det är två utropstecken, eller blir lika förvirrad som du angående syftet med koden.

Magnus_A 2010-06-29 21:46

Ja, såg för gräsligt ut så jag körde sök och ersätt på skiten.

studiox 2010-06-30 00:12

Kanske inte samma sak, men kan det inte vara så att man försäkrar sig om att den inte får finnas, ungefär som
Kod:

if $apa === 0

Clarence 2010-06-30 08:18

Citat:

Ursprungligen postat av studiox (Inlägg 20361008)
Kanske inte samma sak, men kan det inte vara så att man försäkrar sig om att den inte får finnas, ungefär som
Kod:

if $apa === 0

Nej, inte samma sak. === kollar om värdena är identiska, dvs typ int med värdet 0 i ditt fall. ! jämför mot något av värdena som PHP tycker motsvarar false, dvs tom sträng, false, 0, odefinierad variabel osv. Som redan sagts skulle en (bool)$var ge samma resultat, men då skulle man trevligt nog kunna se resultatet utan att spärra upp ögonen rejält.

Magnus_A 2010-06-30 09:23

Den används inte i frågesatser utan vid tilldelning av värden. Så jag antar att det är ett sätt att sätta typ på variabeln.

Eftersom skriptet ifråga jobbar mycket med att iterera över arrayer och författarna hoppat över den fina funktionen isset() så får man ett par ton notices om missade index när man kör. Blir till att skriva om och göra rätt. Det är nackdelen med att använda färdiga skript, man måste skriva om dem för att de ska fungera som man vill.

studiox 2010-06-30 18:05

Citat:

Ursprungligen postat av Magnus_A (Inlägg 20361022)
Den används inte i frågesatser utan vid tilldelning av värden. Så jag antar att det är ett sätt att sätta typ på variabeln.

Eftersom skriptet ifråga jobbar mycket med att iterera över arrayer och författarna hoppat över den fina funktionen isset() så får man ett par ton notices om missade index när man kör. Blir till att skriva om och göra rätt. Det är nackdelen med att använda färdiga skript, man måste skriva om dem för att de ska fungera som man vill.

Du menar skriva om för du ska slippa notices? :-)

Clarence 2010-07-01 08:08

Citat:

Ursprungligen postat av Magnus_A (Inlägg 20361022)
Eftersom skriptet ifråga jobbar mycket med att iterera över arrayer och författarna hoppat över den fina funktionen isset() så får man ett par ton notices om missade index när man kör. Blir till att skriva om och göra rätt. Det är nackdelen med att använda färdiga skript, man måste skriva om dem för att de ska fungera som man vill.

En notice är en notice - inte en warning. För kodraden du postade blir den till och med (minimalt) mindre effektiv och ger mer kod om du skriver om den så att den inte ger notices om den ska ha exakt samma funktion (du får ersätta den med en if-sats med isset och samma/liknande kod igen).

Magnus_A 2010-07-01 11:53

Jag vill inga notices ha. Rent och snyggt ska det vara i loggarna.
Dessutom ska jag tydligen from php 5.3 kunna skriva
$resultat = (isset($variabel)) ? : $default;
istället för
$resultat = (isset($variabel)) ? $variabel : $default;
Alltid en förbättring.

jonny 2010-07-03 22:34

Citat:

Ursprungligen postat av Magnus_A (Inlägg 20361185)
Jag vill inga notices ha. Rent och snyggt ska det vara i loggarna.
Dessutom ska jag tydligen from php 5.3 kunna skriva
$resultat = (isset($variabel)) ? : $default;
istället för
$resultat = (isset($variabel)) ? $variabel : $default;
Alltid en förbättring.

Ser vi någon fördel med det här förutom att det är lite kortare att skriva? Jag tycker det är ett lite svårläst sätt som blivit än mer svårläst. Jag föredrar tydliga if-satser ;)


Alla tider är GMT +2. Klockan är nu 06:27.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson