xibriz Skrevet 1. juni 2012 Del Skrevet 1. juni 2012 Er det noen som kan forklare meg hvorfor følgende kode returnerer "Resultat 2"? <?php $string = "dette er en test"; if ($string != true) { echo "Resultat 1"; } else { echo "Resultat 2"; } ?> Lenke til kommentar
WhiteFire Skrevet 1. juni 2012 Del Skrevet 1. juni 2012 If ('streng') i PHP er "truthish". Bruk !== og du vil oppnå ønsket resultat da den operatoren også kontrollerer type. Google litt, så finner du sikkert en matrise som viser sannhetsverdi for ulike entiteter i PHP. Lenke til kommentar
Ernie Skrevet 1. juni 2012 Del Skrevet 1. juni 2012 Kanskje greit å teste det ut før man påstår !== vil fungere i dette tilfellet? Det vil nemlig ikke gjøre det. === og !== sjekker i tillegg til (u)likhet om de også har samme type. Derfor er "true" !== true siden string ikke er det samme som boolean. Det man nok ønsker seg her er kanskje $string != "true"? Her kan man forøvrig finne en liste over hva som skjer når variabler av ulik type sammenlignes. Lenke til kommentar
etse Skrevet 2. juni 2012 Del Skrevet 2. juni 2012 Kanskje greit å teste det ut før man påstår !== vil fungere i dette tilfellet? Det vil nemlig ikke gjøre det. === og !== sjekker i tillegg til (u)likhet om de også har samme type. Derfor er "true" !== true siden string ikke er det samme som boolean. Det man nok ønsker seg her er kanskje $string != "true"? Her kan man forøvrig finne en liste over hva som skjer når variabler av ulik type sammenlignes. Kanskje best å lese gjennom ordentlig før du klager på andre. Det han over deg sier er riktig, og slik jeg forstår TS også det han spør etter. Han lurer på hvorfor dette alltid blir false og går i elsen: "Dette er en test" != true Og årsaken er akkurat det han over deg sier, at det er fordi en streng er å regne som true så lenge den har innhold når man bruker != eller ==. Lenke til kommentar
LostOblivion Skrevet 2. juni 2012 Del Skrevet 2. juni 2012 PHP har et rævkjørt typesystem. Æsj, for noe ekle greier... Lenke til kommentar
torbjørn marø Skrevet 2. juni 2012 Del Skrevet 2. juni 2012 Dette er helt vanlig oppførsel i dynamisk typede språk - ruby, python, javascript, clojure, osv. - at alle verdier har en sannhetsverdi, uansett type. Og det meste er som regel true. Mulig PHP har et rævkjørt typesystem, men det er ikke dette her som gjør det. Lenke til kommentar
WhiteFire Skrevet 2. juni 2012 Del Skrevet 2. juni 2012 Kanskje greit å teste det ut før man påstår !== vil fungere i dette tilfellet? Det vil nemlig ikke gjøre det. === og !== sjekker i tillegg til (u)likhet om de også har samme type. Derfor er "true" !== true siden string ikke er det samme som boolean. Det man nok ønsker seg her er kanskje $string != "true"? Her kan man forøvrig finne en liste over hva som skjer når variabler av ulik type sammenlignes. Testet nå. Ganske riktig. !== returnerer Resultat 1. Fins en liten sandkasse her. Lenke til kommentar
LostOblivion Skrevet 2. juni 2012 Del Skrevet 2. juni 2012 (endret) Jeg vet ikke jeg, literalen true burde ikke konformere til typen string, og vice versa for boolean, så jo, dette er absolutt en av de tingene som gjør det dårlig, hvertfall når du setter det i sammenheng med hva en type er. Runtime burde klage når en prøver å sammenligne string og boolean. Uansett, jeg sier ikke at PHP og Python er dårlige scriptespråk i seg selv, de har bare et ikke-eksisterende statisk typesystem (altså, sett fra brukeren). Det er faktisk av og til helt genialt intuitivt å programmere i Python, men grunnen til at typer i det hele tatt eksisterer, er fordi det gjør livet mye lettere for programmereren å utvikle store, tunge programmer. Nå snakker jeg ikke om typer som i bits og bytes i minne... Det at sjeldne, semantiske feil skjer under runtime er ikke en god ting! Det finnes store rammeverk skrevet i Python, men Python er et språk som skal brukes til å kjapt kaste sammen noe som forenkler arbeidsdagen din. Endret 2. juni 2012 av LostOblivion Lenke til kommentar
Ernie Skrevet 3. juni 2012 Del Skrevet 3. juni 2012 Det er bare sånn dynamiske, typeløse språk fungerer. Å sammenligne epler og pærer er helt gyldig, den ene konverteres bare til det andre og sammenligningen kan utføres. Det samme kan forsåvidt også utføres i et typesterkt språk som C++. Man må bare definere f.eks. operator == for den typen sammenligning så kan epler og pærer sammenlignes uten problemer. Å skulle begynne å lage runtime feil fordi man sammenligner en string mot en bool tilsier bare at du ønsker et typesterkt språk og ikke liker de typeløse. Skulle man gjort det som du ønsker så måtte man også kunne garantere for variabeltypen før kjøring, og det er komplett umulig. Hva skjer hvis man har en if / else og tilegner to forskjellige datatyper avhengig om det er if eller else? Hvordan ser du for deg at en query-funksjon skal kunne returnere både boolean og int/ressurs avhengig av situasjonen? Det er ting man gjør i et dynamisk språk som vil være særdeles vrient slik du ønsker deg ting. Lenke til kommentar
LostOblivion Skrevet 3. juni 2012 Del Skrevet 3. juni 2012 C++ er ikke sterkt typet. Det er forskjell på statisk og dynamisk typede språk, men sterkt og svakt typede språk er ikke det samme som de over, henholdsvis. C#, Java, og Python er alle eksempler på sterkt typede språk, men kun Python har dynamiske typer. Det er slik det er ja, og det har sine fordeler og ulemper, men den største ulempen med både dynamiske og svakt typede språk, er at det er vanskeligere å finne feil før release. I slike språk kan du aldri være helt sikker på om programmet du har laget ikke vil gi en semantisk feil, men samtidig gir det deg en større frihet. Dog, dette er kun en frihet som gjør det kjappere å programmere i språket, men som kan gi det ganske heftige problemer senere. Lenke til kommentar
Terrasque Skrevet 3. juni 2012 Del Skrevet 3. juni 2012 Table av forskjellige sammenligninger : http://habnab.it/php-table.html Forøvrig har http://me.veekun.com...-of-bad-design/ en del klager på == sin måte å behandle ting på. Forresten så oppfører python seg helt annerledes på disse tingene. Hvis man tar "if var:" i python så blir det noenlunde tolket som "if bool(var):" - men hvis man sammenligner så blir det ingen konvertering. Litt python eksempel kode: >>> True True >>> "asd" 'asd' >>> bool("asd") True >>> bool(" ") True >>> bool("") False >>> "asd" == True False >>> "" == True False >>> "" == False False >>> "" == " " False >>> "" == 0 False >>> "" == "0" False >>> bool(0) False >>> bool(1) True >>> bool(-1) True >>> 1 == "1" False >>> 1 == int("1") True >>> 1 == int("01") True >>> 1 == int("true") Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: invalid literal for int() with base 10: 'true' >>> None == False False >>> None == True False >>> None == "" False >>> None === "" File "<stdin>", line 1 None === "" ^ SyntaxError: invalid syntax >>> bool( [] ) False >>> [] == False False >>> None in [] False >>> False in [] False >>> True in [] False >>> "1" in [1] False >>> 1 in [1] True >>> int("1") in [1] True >>> 1 in "1" Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: 'in <string>' requires string as left operand, not int >>> "1" in "1" True >>> {}.get("asd") >>> print {}.get("asd") None >>> {}.get("asd") == False False >>> {}.get("asd") == True False >>> {}.get("asd") == None True >>> Vi har forresten allerede hatt en lang diskusjon på forumet angående dynamiske datatyper.. Foreslår at folk ikke starter en ny slik diskusjon i en urelatert tråd som denne, eller i det minste leser den tråden først. Også, angående statisk typede / dynamisk typede vs compile time feil... Etter å ha programmert en del i begge typer språk, kan jeg trygt si at praktiske forskjeller er minimal. Og er forresten mye det samme i Java / C#. Bare at der kommer de frem som casting problemer og NullReferenceException Lenke til kommentar
xibriz Skrevet 4. juni 2012 Forfatter Del Skrevet 4. juni 2012 Takk for alle svar folkens. Jeg løste min problemstilling ved å bruke funksjonen is_string() Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå