/ Forside / Teknologi / Udvikling / PHP / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
PHP
#NavnPoint
rfh 3959
natmaden 3372
poul_from 3310
funbreak 2700
stone47 2230
Jin2k 1960
Angband 1743
Bjerner 1249
refi 1185
10  Interkril.. 1146
Type juggling
Fra : Thomas L. Kjeldsen


Dato : 27-06-02 14:25

Hej,
jeg faldt over en pudsighed i forbindelse php's type håndtering, som jeg
har beskrevet herunder. Jeg vil lige høre om der er nogen der har en
fornuftig forklaring før jeg rapporterer det som en bug?


test.php:
---------
<?php


error_reporting(E_ALL);


$boolean = true;

if ($boolean != "blob")
   print('$boolean != "blob"');
else
   print('$boolean == "blob"');


?>



output:
-------
$boolean == "blob"



platform:
---------
PHP Version 4.2.1
Apache/1.3.26
FreeBSD 4.6-RELEASE



vh Thomas

 
 
Bertel Lund Hansen (27-06-2002)
Kommentar
Fra : Bertel Lund Hansen


Dato : 27-06-02 14:45

Thomas L. Kjeldsen skrev:

>jeg faldt over en pudsighed i forbindelse php's type håndtering

Jeg gætter ud fra C.

>if ($boolean != "blob")

"blob" er (refereres til med) en konstant char pointer. Da den
ikke er null, har den samme testværdi som true.

Prøv f.eks.:

   if ("blob") print('Bertel har nok gættet rigtigt.');

--
Bertel
http://lundhansen.dk/bertel/   FIDUSO: http://fiduso.dk/

Niels Andersen (27-06-2002)
Kommentar
Fra : Niels Andersen


Dato : 27-06-02 15:41

Thomas L. Kjeldsen wrote in <slrnahm4h9.88b.tlk@tigerdyr.wheel.dk>:
> Hej,
> jeg faldt over en pudsighed i forbindelse php's type håndtering, som jeg
> har beskrevet herunder. Jeg vil lige høre om der er nogen der har en
> fornuftig forklaring før jeg rapporterer det som en bug?

> $boolean = true;
> if ($boolean != "blob")
// giver false

Well, er det ikke lidt noget underligt noget at sammenligne en boolean og
en string?

I de fleste sprog ville parseren gå i panik og give op. PHP går også amok,
men kommer med et løsningsforslag. :)

Jeg foretrækker egentlig den første løsning, men PHP's løsning er helt fin
i nogen tilfælle.

--
Mvh.

Niels Andersen
(la nels. anersyn.)

Martin Mouritzen (27-06-2002)
Kommentar
Fra : Martin Mouritzen


Dato : 27-06-02 15:54

After I finished the 3 Pan Galactic Gargle Blasters, "Thomas L.
Kjeldsen" <tlk@tigerdyr.wheel.dk> just offered me, he muttered some
weird stuff, and I had to correct this gibberish:

>jeg faldt over en pudsighed i forbindelse php's type håndtering, som jeg
>har beskrevet herunder. Jeg vil lige høre om der er nogen der har en
>fornuftig forklaring før jeg rapporterer det som en bug?
<snip>
>$boolean = true;
>
>if ($boolean != "blob")
>   print('$boolean != "blob"');
>else
>   print('$boolean == "blob"');

Det er sådan set slet ikke så mærkeligt, hvis du tænker over PHPs
(svage) type håndtering.
Hvis der er noget i en variabel anser PHP det for sandt.

I din første if laver du derfor en
if (true != true)

og sand er ikke forskelligt fra sand, derfor udskriver den det der
står i din else.

Man kan så diskutere om det er hensigtsmæssigt. Men sådan er PHP nu
engang skruet sammen.
--
Nano Martin Mouritzen Phone +45 27105580
Vesterbrogade 30C. 2. Programmer Advanced Simplicity
DK-8000 Århus martin@nano.dk http://www.nano.dk
Nano nu officiel dansk distributør af UltraEdit, se mere på websitet

Tonni Aagesen (27-06-2002)
Kommentar
Fra : Tonni Aagesen


Dato : 27-06-02 16:37

"Thomas L. Kjeldsen" <tlk@tigerdyr.wheel.dk> skrev i en meddelelse
news:slrnahm4h9.88b.tlk@tigerdyr.wheel.dk...

> $boolean = true;
>
> if ($boolean != "blob")
> print('$boolean != "blob"');
> else
> print('$boolean == "blob"');

Hvis du vil tjekke for samme type:

if ($boolean !== "blob")
print('$boolean !== "blob"');
else
print('$boolean === "blob"');

Bemærk ekstra "=" - Se i øvrigt:
http://dk.php.net/manual/en/language.operators.comparison.php


--
Mvh
Tonni Aagesen
<agent29 AT stofanet DOT dk>



Thomas L. Kjeldsen (28-06-2002)
Kommentar
Fra : Thomas L. Kjeldsen


Dato : 28-06-02 18:32

Hej Bertel, Niels, Martin og Tonni

Tak for Jeres svar. Jeg kom faktisk selv i tanke om her til frokost,
hvorfor ("blob" == true) i php - nemlig, som I også skriver, fordi php
ved sammenligning med en boolsk værdi cast'er en streng til true hvis
strlen er over nul.

Jeg var helt overbevist om at == og != inkluderede sammenligning af
typer. Tak for hintet om at man kan bruge === og !== til netop det.

Heh, mit mindset er åbenbart blevet forstyrret - for et år siden havde
jeg ikke været i tvivl om ovenstående. Det må skyldes kosmisk stråling.


Undskyld forstyrrelsen


vh Thomas
- over and out

N/A (30-06-2002)
Kommentar
Fra : N/A


Dato : 30-06-02 14:56



Thomas L. Kjeldsen (30-06-2002)
Kommentar
Fra : Thomas L. Kjeldsen


Dato : 30-06-02 14:56

Niels Andersen wrote:
> Det er godt nok ved at være længe siden jeg har læst på det, og
> især brugt det. Jeg plejer nemlig at kode så jeg slet ikke bruger
> de vilde castings.

Ditto. Det gjorde de der skrev den oprindelige kode jeg skulle rette i
bare ikke :)


[snip]

> Disse bliver til false, resten true. Så vidt jeg husker. Slå selv op,
> hvis det er relevant. :)

Nah, men tak for info.


>> Heh, mit mindset er åbenbart blevet forstyrret - for et år siden
>> havde jeg ikke været i tvivl om ovenstående. Det må skyldes kosmisk
>> stråling.
>
> Måske har du kigget på andre sprog? Den slags bliver hurtigt
> forvirrende, hvis man lige studerer 2-3 sprog på samme tid. :)

Præcis :)


alt vel,
vh Thomas

Søg
Reklame
Statistik
Spørgsmål : 177503
Tips : 31968
Nyheder : 719565
Indlæg : 6408545
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste