Als een boer kiespijn heeft, lacht hij dan?
Hij zal dit dus waarschijnlijk beschouwen als een integer, en het omzetten naar een 'nette' integer, waardoor er 123 komt uit je var_b (immers, type maar eens 0123 + 1 in op je rekenmachine).
met === wordt de strict check aangezet, waardoor hij gewoon gaat checken of de 2 strings ook qua type met elkaar overeen komen, en dan zal er dus geen conversieslag naar integer gebeuren.
in het kort is je antwoord dus ja
SchizoDuckie wijzigde dit bericht 20-12-2006 12:01 (6%)
PHP:
1 | <?php
|
Zo is 'ie wel ongelijk:
PHP:
1 | <?php
|
mcdronkz wijzigde dit bericht 20-12-2006 12:12 (27%)
In de if lijkt de variabele een integer te zijn, dus kan de voorlop nul weg, dus zijn ze gelijk.
frickY wijzigde dit bericht 20-12-2006 12:14 (37%)
Zo typisch is dat niet hoor, PHP's gedrag bij de == vergelijking is gewoon gedocumenteerd: http://www.php.net/manual/en/types.comparisons.phpquote:
En dat hij in het tweede geval wel gelijk is omdat het dan twee strings zijn (de strings zijn niet te casten naar een integer)
| Last.fm | "Mr Bent liked counting. You could trust numbers, except perhaps for pi, but he was working on that in his spare time and it was bound to give in sooner or later." -Terry Pratchett
٩(●̮̮̃•̃)۶ Clewless Pink Elephants Are Utterly Boring
De voilgende constructies, hoe lelijk ook, zie je regelmatig als men moet wisselen tussen strings en getallen en zekerheid wil hebben over het type dat wordt gebruikt door PHP:quote:daft_dutch schreef op woensdag 20 december 2006 @ 12:22:
dus als je wilt dat het een string moet zijn moet je er letters of tekens (\n) in donderen
PHP:
| <?php
|
hamsteg wijzigde dit bericht 20-12-2006 12:30 (6%)
There are 10 kinds of people, those who understand binary and those who don't. Besparingsmeter: 887W, 87W sluipverbruik(+MV) en 800W halogeen vervangen voor LEDs.
neej, je moet gewoon de juiste evaluators (===) gebruiken voor je checks of een check doen of iets echt een INT isquote:daft_dutch schreef op woensdag 20 december 2006 @ 12:22:
dus als je wilt dat het een string moet zijn moet je er letters of tekens (\n) in donderen
zo heb je ook dit trucje:
PHP:
| <?php
|
SchizoDuckie wijzigde dit bericht 20-12-2006 12:40 (31%)
PHP:
| <?php
|
[GoT topic extension for Chrome - nu met Quote-to-Quickreply feature!] - [T.net karma monitor]
[Deus Ex: HR] - [Lara Croft and the Guardian Of Light]
Euh, false is 0 hoorquote:SchizoDuckie schreef op woensdag 20 december 2006 @ 12:32:
zo heb je ook dit trucje:
[GoT topic extension for Chrome - nu met Quote-to-Quickreply feature!] - [T.net karma monitor]
[Deus Ex: HR] - [Lara Croft and the Guardian Of Light]
heh wuh wah?quote:
sorry niet echt wakker nog vandaag
True, maar sommige functies returnen -1 als ze false bedoelen.quote:
C'est le ton qui fait la musique. | BINK software | Blog | @linkedin
7D | 18-55 IS | 50mm 1.8 2 | 70-200 2.8 APO EX HSM
[GoT topic extension for Chrome - nu met Quote-to-Quickreply feature!] - [T.net karma monitor]
[Deus Ex: HR] - [Lara Croft and the Guardian Of Light]
PHP:
| <?php
|
Echter als $veld de waarde '0123' heeft krijgt $result de waarde 'eentweedrie'
Hoe kan ik dit nu het beste oplossen?
Als een boer kiespijn heeft, lacht hij dan?
Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'
Ikzelf zit te denken aan:quote:Yohost! schreef op woensdag 20 december 2006 @ 12:46:
Nu heb ik dus het volgende case statement
PHP:
1
2
3
4<?php
switch ($veld) {
case '123': $result = 'eentweedrie'; break;
case '456': $result = 'viervijfzes'; break;
}
?>
Echter als $veld de waarde '0123' heeft krijgt $result de waarde 'eentweedrie'
Hoe kan ik dit nu het beste oplossen?
PHP:
| <?php
|
Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'
Reg. datum: 08 juni 2001
Misschien zoiets of bedoel je dat niet?quote:Yohost! schreef op woensdag 20 december 2006 @ 12:46:
Nu heb ik dus het volgende case statement
PHP:
1
2
3
4<?php
switch ($veld) {
case '123': $result = 'eentweedrie'; break;
case '456': $result = 'viervijfzes'; break;
}
?>
Echter als $veld de waarde '0123' heeft krijgt $result de waarde 'eentweedrie'
Hoe kan ik dit nu het beste oplossen?
PHP:
| <?php
|
PHP:
1 | <?php
|
EDIT: Grrrrrr
Patriot wijzigde dit bericht 20-12-2006 12:56 (4%)
Deze Tweaker zet geen actuele feitjes meer in zijn sig, die vergeet hij toch te verwijderen.
Daar zat ik stiekem ook aan te denken maar daar wil ik eigenlijk niet aan denken omdat het wel heel idioot isquote:Janoz schreef op woensdag 20 december 2006 @ 12:49:
[...]
Ikzelf zit te denken aan:
PHP:
1
2
3
4<?php
switch ('pauper php'.$veld) {
case 'pauper php123': $result = 'eentweedrie'; break;
case 'pauper php456': $result = 'viervijfzes'; break;
}
?>
Als een boer kiespijn heeft, lacht hij dan?
PHP:
1 | <?php
|
SchizoDuckie wijzigde dit bericht 20-12-2006 13:04 (10%)
Deze Tweaker zet geen actuele feitjes meer in zijn sig, die vergeet hij toch te verwijderen.
Als je een if/else constructie wil gebruiken ja, ik vind switch statements eerlijk gezegd wel prettig werken als je meer dan 2 mogelijke waardes hebt...quote:Patriot schreef op woensdag 20 december 2006 @ 13:01:
En toch is de oplossing van mij en Vorlox nog het netst
Is dit iets om te submitten naar de PHP bugtracker?
SchizoDuckie wijzigde dit bericht 20-12-2006 13:03 (5%)
Inderdaad!quote:Patriot schreef op woensdag 20 december 2006 @ 13:01:
En toch is de oplossing van mij en Vorlox nog het netst
Dat gaat hem worden
* Yohost! gaat vanaf nu wel meer === gebruiken!!
Yohost! wijzigde dit bericht 20-12-2006 13:06 (48%)
Als een boer kiespijn heeft, lacht hij dan?
There are 10 kinds of people, those who understand binary and those who don't. Besparingsmeter: 887W, 87W sluipverbruik(+MV) en 800W halogeen vervangen voor LEDs.
Deze Tweaker zet geen actuele feitjes meer in zijn sig, die vergeet hij toch te verwijderen.
oh sorry ik had er even omheen gelezen excuus.quote:Patriot schreef op woensdag 20 december 2006 @ 13:06:
SchizoDuckie, dat van ons is gewoon een switch hoor, en je kunt gewoon zelf nieuwe waardes toevoegen.
Eigenlijk vind ik dat geen switch, maar meer een soort vern***te if/else constructie die de logica van je code niet echt ten goede komt.
De gein is dat casten met (string) dit ook zou moeten kunnen voorkomen imo...quote:hamsteg schreef op woensdag 20 december 2006 @ 13:06:
De vraag is eerst of het een bug is ... het type is gewoon loosly coupled. Gebruik gewoon de juiste checks '==='. String compare zou dit toch ook goed moeten doen ?
SchizoDuckie wijzigde dit bericht 20-12-2006 13:09 (30%)
dacht dat de vorig post verdwenen was maar er waren zoveel posts
hamsteg wijzigde dit bericht 20-12-2006 13:12 (66%)
There are 10 kinds of people, those who understand binary and those who don't. Besparingsmeter: 887W, 87W sluipverbruik(+MV) en 800W halogeen vervangen voor LEDs.
Dat zei je net ook alquote:hamsteg schreef op woensdag 20 december 2006 @ 13:08:
String compare zou dit alles toch goed moeten doen? Maar goed het is een loosely type dus '===' is zo-wie-zo beter.
Bij compileer programmeertalen is een switch vaak een beter oplossing omdat men dan in arrays dingen kan verwerken en vaak deze verwerking kwa processing efficienter is. PHP is echter een script taal en daar weet ik niet van of de if/else of switch beter is.quote:SchizoDuckie schreef op woensdag 20 december 2006 @ 13:08:
Eigenlijk vind ik dat geen switch, maar meer een soort vern***te if/else constructie die de logica van je code niet echt ten goede komt.
There are 10 kinds of people, those who understand binary and those who don't. Besparingsmeter: 887W, 87W sluipverbruik(+MV) en 800W halogeen vervangen voor LEDs.
Een switch is in feite zelf niets meer dan een 'verneukte' if/else constructie.quote:SchizoDuckie schreef op woensdag 20 december 2006 @ 13:08:
[...]
oh sorry ik had er even omheen gelezen excuus.
Eigenlijk vind ik dat geen switch, maar meer een soort vern***te if/else constructie die de logica van je code niet echt ten goede komt.
[...]
De gein is dat casten met (string) dit ook zou moeten kunnen voorkomen imo...
Casten met (string) gaat niet werken, omdat PHP het verschil niet ziet tussen een int gecast met (string) en een string met alleen cijfers.
Deze Tweaker zet geen actuele feitjes meer in zijn sig, die vergeet hij toch te verwijderen.
Het verschil tussen een switch en een if/else was volgens mij ook dat je met een switch al meerdere voorgedefineeerde uitkomsten matched, en met een if/else een statement uitvoert en a.d.h.v. de uitkomst daarvan iets doet. Deze 'hack' met switch (true) en case ($blaat === '0123') verbouwt dus volgens mij je switch naar 1 grote if/else constructie, maar da's een verhaal wat eigenlijk even buiten dit topic hoort.quote:hamsteg schreef op woensdag 20 december 2006 @ 13:10:
[...]
Bij compileer programmeertalen is een switch vaak een beter oplossing omdat men dan in arrays dingen kan verwerken en vaak deze verwerking kwa processing efficienter is. PHP is echter een script taal en daar weet ik niet van of de if/else of switch beter is.
Bovendien doe je dan twee checks, in de switch wordt namelijk $veld == '123' gedaan en zelf doe je nog eens de check $veld === '123'.quote:SchizoDuckie schreef op woensdag 20 december 2006 @ 13:08:
[...]
oh sorry ik had er even omheen gelezen excuus.
Eigenlijk vind ik dat geen switch, maar meer een soort vern***te if/else constructie die de logica van je code niet echt ten goede komt.
Oftewel, je doet iets als dit: ($veld == '123' & $veld === '123').
IMHO kun je dan beter kiezen voor een reeks if- else.
Jaap-Jan wijzigde dit bericht 20-12-2006 13:19 (5%)
| Last.fm | "Mr Bent liked counting. You could trust numbers, except perhaps for pi, but he was working on that in his spare time and it was bound to give in sooner or later." -Terry Pratchett
PHP:
1 | <?php
|
Want IMHO horen getallen niet tussen haakjes ?
De feature is dat je zo een getal octaal in je code kan opschrijven. De feature is niet dat PHP alles dat met een 0 begint maar octaal moet vergelijken. Het resultaat van $a = 0123; is gewoon een int en het talstelsel dat gebruikt is voor de assignment is later niet meer belangrijk.quote:Janoz schreef op woensdag 20 december 2006 @ 12:47:
Wat raar weer trouwens. '123' en '0123' zijn gelijk aan elkaar omdat php het wel even denkt te casten naar integers, maar 123 en 0123 zijn weer ongelijk (aangezien de tweede als octaal wordt geinterpreteerd)
Je hebt gelijk, maar soms heb je nou eenmaal wel gewoon de strings '123' en '0123'.quote:mcdronkz schreef op woensdag 20 december 2006 @ 13:16:
Dit geeft overigens wel "ongelijk":
8< decimale vs octale definitie van vars 8<
Want IMHO horen getallen niet tussen haakjes ?
en je bedoelt quotes ipv haakjes.
Voutloos wijzigde dit bericht 20-12-2006 13:23 (23%)
Talkin.nl daily photoblog
Day 2203: Beer and Ice Hockey (2)
Foto specs: Canon 50D, Tamron 17-50 f/2.8, 1/200s, f/8.0, ISO 100
Als een boer kiespijn heeft, lacht hij dan?
Reg. datum: 11 november 2003
Heb je bij PHP niet zoiets als bij java?:
code:
1
| string1.equals(string2); |
In java doe je bij strings ook geen string1 == string2
Nee, maar dat komt omdat in java de '==' operator adressen vergelijkt als het objecten zijn. Op primitieven checkt het de value.quote:ID-College schreef op woensdag 20 december 2006 @ 13:26:
Een switch is leuk maar vaak omslachtig.
Heb je bij PHP niet zoiets als bij java?:
code:
1 string1.equals(string2);
In java doe je bij strings ook geen string1 == string2
Equals gebruikt onder water ook '==', want als de adressen gelijk zijn, zijn de waardes dat ook. Daarna zal equals (nadat gecheckt is of het opgegeven Object wel een String is) waarschijnlijk elk karakter van beide strings nalopen om te kijken of ze gelijk zijn. Aangezien dat tijdrovender is dan het vergelijken van een tweetal adressen wordt dat eerst gedaan.
In PHP wordt met de '==' operator altijd de waarde vergeleken en is het in feite een soort equals.
Jaap-Jan wijzigde dit bericht 20-12-2006 13:39 (9%)
| Last.fm | "Mr Bent liked counting. You could trust numbers, except perhaps for pi, but he was working on that in his spare time and it was bound to give in sooner or later." -Terry Pratchett
Maargoed, waarom niet gewoon strcmp gebruiken? Ben je van al dat gezeik af.
Grijze Vos wijzigde dit bericht 20-12-2006 13:45 (44%)
Hanlon's Razor: "Never attribute to malice that which can be adequately explained by stupidity."
Daar gaat het niet om in deze discussiequote:Grijze Vos schreef op woensdag 20 december 2006 @ 13:43:
In de meeste talen kun je uberhaupt niet een switch/case statement gebruiken op strings.
Maargoed, waarom niet gewoon strcmp gebruiken? Ben je van al dat gezeik af.
Jawel, daar gaat het wel om. PHP is een loosely type taal. Als je dan iets strict wilt gebruiken zul je gebruik moeten maken van strict functionaliteiten. De '===' en de 'strcmp' zijn beiden strict oplossingen.quote:
[edit]Als programmeur moet je wel je taal, zijn kracht en zijn beperkingen kennen. Netjes programmeren is een vak.
hamsteg wijzigde dit bericht 20-12-2006 13:59 (13%)
There are 10 kinds of people, those who understand binary and those who don't. Besparingsmeter: 887W, 87W sluipverbruik(+MV) en 800W halogeen vervangen voor LEDs.
Zoals je gezien hebt in mijn voorbeeld staat er ook een stukje met explicite casts naar (string). Dat daarna deze explicite cast vervolgens genegeerd wordt is imo een bug.
Het is wel de meest duidelijke workaround.quote:SchizoDuckie schreef op woensdag 20 december 2006 @ 13:52:
[...]
Daar gaat het niet om in deze discussie
Ik zou graag zien dat PHP ooit nog eens van die loose types afstapt. Of voor mijn part blijven ze ze ondersteunen in een non-strict omgeving. Ik heb het idee dat er teveel mensen met PHP bezig gaan zonder te weten wat ze doen, puur en alleen omdat het zo makkelijk is om met variabelen te goochelen. Om vervolgens tegen dit soort problemen aan te lopen.
Morituri Nolumus Mori 10-man WoW raiding guild op Doomhammer
Standeman: Ik wil mijn ballen ook wel doneren hoor, ik doe er toch ook niets meer mee.
Een talstelsel wordt niet gebruikt voor de assignment. Het gaat om de representatie van een bepaald getal, waarbij je met een 0 aangeeft dat het octaal is. De lexical analyser zet dit om naar echt getal (de CPU werkt met binaire representaties, dus in feite wordt het altijd omgezet naar een binaire representatie), en de assignment werkt vervolgens op dat getal, niet op de representatie van dat getalquote:Voutloos schreef op woensdag 20 december 2006 @ 13:16:
en het talstelsel dat gebruikt is voor de assignment is later niet meer belangrijk.
Als PHP dezelfde representaties toepast in strings als in de taal zelf dan leg je de eindgebruiker vage regels op, wat natuurlijk niet echt gewenst is
[GoT topic extension for Chrome - nu met Quote-to-Quickreply feature!] - [T.net karma monitor]
[Deus Ex: HR] - [Lara Croft and the Guardian Of Light]
Volgens mij zijn ze er vanaf als ze gewoon het expliciet casten naar een bepaald type *netjes* gaan implementen.quote:-NMe- schreef op woensdag 20 december 2006 @ 13:59:
[...]
Het is wel de meest duidelijke workaround.
Ik zou graag zien dat PHP ooit nog eens van die loose types afstapt. Of voor mijn part blijven ze ze ondersteunen in een non-strict omgeving. Ik heb het idee dat er teveel mensen met PHP bezig gaan zonder te weten wat ze doen, puur en alleen omdat het zo makkelijk is om met variabelen te goochelen. Om vervolgens tegen dit soort problemen aan te lopen.
Ik ben ff een testcase aan het samenstellen om te submitten naar de bugtracker, want voor de toekomst van PHP is dit wel iets waar gewoon duidelijkheid over moet zijn.
100% mee eens, maar het succes van PHP is deels te wijten aan het feit dat men als beginnend PHP programmeur niet druk hoeft te maken om strict dingen en daardoor een relatief lage instap heeft. Een optie om PHP strict te maken (dus niet default) krijgt mijn support!quote:-NMe- schreef op woensdag 20 december 2006 @ 13:59:
[...]
Ik zou graag zien dat PHP ooit nog eens van die loose types afstapt. Of voor mijn part blijven ze ze ondersteunen in een non-strict omgeving.
There are 10 kinds of people, those who understand binary and those who don't. Besparingsmeter: 887W, 87W sluipverbruik(+MV) en 800W halogeen vervangen voor LEDs.
PHP heeft volgens mij geen aparte type octaal. Wel integer en dus valt een octaal daar ook onder.quote:Janoz schreef op woensdag 20 december 2006 @ 12:47:
Wat raar weer trouwens. '123' en '0123' zijn gelijk aan elkaar omdat php het wel even denkt te casten naar integers, maar 123 en 0123 zijn weer ongelijk (aangezien de tweede als octaal wordt geinterpreteerd)
< dit stukje webruimte is te huur >
Nee, voordat ze strict typing toe gaan passen kunnen ze beter naar andere items kijken. Fatsoenlijke OO (Waarom wordt de constructor van de superclass niet aangeroepen), wat meer en vooral fatsoenlijke (niet lekkende) scopes, maar vooral nieuwe dingen eerst eens goed overdenken en uitzoeken en dan pas implementeren ipv iets erin hacken om vervolgens 3 versies nodig te hebben om alle rariteiten eruit te moeten halen (Of te laten zitten onder het mom 'by design')
Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'
Octaal, decimaal of hexadecimaal heeft helemaal niks met het type te maken, maar meer met de representatie tijdens opslag inlezen en afdrukken. Integers worden gewoon binair opgeslagen.quote:aex351 schreef op woensdag 20 december 2006 @ 14:15:
[...]
PHP heeft volgens mij geen aparte type octaal. Wel integer en dus valt een octaal daar ook onder.
Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'
goed... dit is dus expected behavior volgens degene die het gelijk naar bogus veranderd heeft :x
SchizoDuckie wijzigde dit bericht 20-12-2006 14:23 (28%)
Je hebt ook geen aparte types voor een getalweergave Een getal kan weergegeven worden als binair, octaal, decimaal, hexadecimaal, een character en noem maar op.quote:aex351 schreef op woensdag 20 december 2006 @ 14:15:
[...]
PHP heeft volgens mij geen aparte type octaal. Wel integer en dus valt een octaal daar ook onder.
Al die dingen worden in de computer toch gerepresenteerd als een binair getal. Shorts, chars, ints en longs geven alleen maar de hoeveelheid bits voor het opslaan van een getal.
Nee dus, het is 'expected behavior'quote:SchizoDuckie schreef op woensdag 20 december 2006 @ 14:20:
Ik heb het even gesubmit als bug. Nu hopen dat het doordringt tot de stubborn-zend/php programmeurs...
Jaap-Jan wijzigde dit bericht 20-12-2006 14:23 (21%)
| Last.fm | "Mr Bent liked counting. You could trust numbers, except perhaps for pi, but he was working on that in his spare time and it was bound to give in sooner or later." -Terry Pratchett
Commentaar is reeds aanwezig:quote:SchizoDuckie schreef op woensdag 20 december 2006 @ 14:20:
Ik heb het even gesubmit als bug. Nu hopen dat het doordringt tot de stubborn-zend/php programmeurs...
switch() construct uses "==" semantics to compare values, which compares
numeric strings as numbers:
var_dump("0123"=="123"); => true
If you want to compare numeric strings as strings, use "===":
var_dump("0123"==="123"); => false.
This is expected behaviour.
There are 10 kinds of people, those who understand binary and those who don't. Besparingsmeter: 887W, 87W sluipverbruik(+MV) en 800W halogeen vervangen voor LEDs.
En nog steeds mensen die het vreemd vinden dat die persoon verantwoordelijk voor security weggelopen is....
Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'
Zolang er geen sprake is van verschillende typen aan weerszijden van een operator is het niet relevant dat je waarde lijkt op een waarde van een ander type. Er hoeft geen conversie van typen plaats te vinden (en het mag imho ook niet) omdat je gewoon werkt met strings en dus moet er ook gewoon een string-comparison plaatsvinden, geen cast naar ints en die vergelijken...quote:SchizoDuckie schreef op woensdag 20 december 2006 @ 12:01:
PHP is loosely typed. Hij zal dus zelf een inschatting maken van wat jij in een variabele propt, of het nou een array, integer, double of string is.
Ik zou het dus een bug noemen, niet 'logisch want het is loose typed'. Het zijn tenslotte dezelfde typen en dan hoort de vergelijking op basis van de standaard comparator binnen die typen te gebeuren, imho dan... === voegt alleen toe dat je eerst checked dat je dezelfde typen hebt en dan daarbinnen dezelfde waarden.
Dus 1 == '1' = true maar 1 === '1' = false
"a" = "0a" is false, om welke reden zou dan precies de string '123' gelijk moeten zijn aan de string '0123' ? En waarom geldt dat dan weer niet voor '123 bar' vs '0123 bar' ? En waarom is '000000000123' gelijk aan '123' ?
Magoed, blijkbaar zijn ze het bij php niet eens dat het een bug is. Imho zou iemand die bovenstaand gedrag per se wil hebben gewoon ltrim($var, '0') moeten doen... maarja.
Saai uitzicht in je tuin? Hang er een foto voor!
Zoals jij het daar beschrijft: 100% mee eens. Maar het punt blijft dat veel PHP ontwikkelaars al 'gewend' zijn aan deze manier van werken en dat is op zich geen probleem, zolang je maar met een expliciete cast het gedrag dat jij hierboven beschrijft (en wat ik dus ook verderop bedoel in mijn switch-verhaal en in m'n bugreport) het verwachte resultaat krijgt en niet alsnog het 'php-zoekt-zelf-wel-even-uit-wat-jij-bedoelt-resultaat'. Dan is iedereen blijquote:
Vandaar dat ik ook zo blij was met het casten met data types omdat dat dit soort problemen voorkomt, maar als dit in de rest van de taal gewoon genegeerd wordt kan je het net zo goed er weer uit slopen
SchizoDuckie wijzigde dit bericht 20-12-2006 14:42 (42%)
quote:ID: 39901
Updated by: tony2001@php.net
Reported By: schizoduckie at gmail dot com
-Status: Open
+Status: Bogus
Bug Type: Variables related
Operating System: Win32/XP
PHP Version: 5CVS-2006-12-20 (snap)
New Comment:
It does not matter whether you cast the variables or not, switch()
always uses semantics similar to "==".
Again, there is nothing wrong and we're not going to change it.
Previous Comments:
------------------------------------------------------------------------
[2006-12-20 13:34:25] schizoduckie at gmail dot com
I disagree with this bug being bogus.
Once you start giving people the power of casting, this type of
programming should be either consistently be possible to use throughout
the PHP or be completely removed to avoid any misunderstandings.
< dit stukje webruimte is te huur >
mcdronkz wijzigde dit bericht 20-12-2006 14:52 (84%)
Dat ze aan het toewerken zijn naar een hybride taal van loose typed en strictly typed (maar toch ook weer stiekem niet) door mensen variabelen te kunnen laten casten naar een bepaald type.quote:aex351 schreef op woensdag 20 december 2006 @ 14:48:
PHP is gewoon loose typed en switch gebruikt "==" . Ik zie niet wat hier nou zo fout aan is.
Casten kan nuttig zijn. Alleen met een switch dus niet.quote:SchizoDuckie schreef op woensdag 20 december 2006 @ 14:52:
[...]
Dat ze aan het toewerken zijn naar een hybride taal van loose typed en strictly typed (maar toch ook weer stiekem niet) door mensen variabelen te kunnen laten casten naar een bepaald type.
< dit stukje webruimte is te huur >
Reg. datum: 11 november 2003
Niet dat switch() zo'n super functie is, je kan er altijd omheen werken. Dan maar een if/else constructie.
Overigens kun je altijd === gebruiken dus het maakt mij niet zoveel uit of ze nou == of === in switch gebruiken. Switch() wordt volgens mij zoiezo weinig gebruikt
Je ziet het even verkeerd (opdezelfde manier als de php-developers volgens mij)quote:aex351 schreef op woensdag 20 december 2006 @ 14:56:
[...]
Casten kan nuttig zijn. Alleen met een switch dus niet.
Casten ís nuttig en het zou nóg nuttiger zijn als de compiler ook snapt dat als jij iets expliciet cast, hij === ipv == moet gebruiken.
Wat hier fout aan is is dat je bijvoorbeeld geen telefoonnummers goed kunt vergelijken. De essentie van een loosetyped taal is niet dat er helemaal geen types bestaan, maar dat ze on the fly worden bepaald. Lees het stuk van ACM nog even goed door.quote:aex351 schreef op woensdag 20 december 2006 @ 14:48:
PHP is gewoon loose typed en switch gebruikt "==" . Ik zie niet wat hier nou zo fout aan is.
Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'
Goed, doe nu eens: $veld = '';quote:Patriot schreef op woensdag 20 december 2006 @ 12:55:
Dit werkt ook:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21<?php
$veld = '0123';
switch($veld) {
case $veld === '123':
echo "Pils";
break;
case $veld === '456':
echo "Geen pils :/";
break;
default:
echo "Wat dan?";
break;
}
?>
Rara wat krijg ik nu op mijn scherm?
Als een boer kiespijn heeft, lacht hij dan?
quote:Quite frankly, your excuse is kind of weak. Yes, switch uses the same semantics as the == operator. Yes, this means possible unwanted conversions (which, for the life of me, I don't understand - "0123" is a string; which, compared to "123" is _not_ the same. If I'd wanted it to be the same, I'd have defined it as 0123 and 123 respectively). But if you actually explicitly cast the variable to a string, I think it should do a strict comparison.
PHP invites you to use strange code, very strange code indeed. For instance, the following returns true:
PHP:
1
2
3
4
5<?php
$a = 0;
$b = "foo";
if ($a == $b)
echo "PHP sucks";
?>
Idiotic inconsistencies like this one and the workarounds experienced programmers have to write just to make the language easy to work with for beginners really damage your reputation and the PHP language in general.
Do with this comment as you please, but I really think you should provide experienced programmers with more means of keeping their code tidy and clean, without dumb workarounds.
Morituri Nolumus Mori 10-man WoW raiding guild op Doomhammer
Standeman: Ik wil mijn ballen ook wel doneren hoor, ik doe er toch ook niets meer mee.
Je zou ze er nog op kunnen wijzen dat je strings vergelijkt die toevallig uit getallen bestaan en dus ook van == zou verwachten dat een en ander ongelijk is... Er zijn tenslotte geen type-casts nodig, ook al doen ze die blijkbaar wel. Ook jouw expliciete casts hebben geen resultaat, want het zijn al strings die je er in stopt, daar op hameren zal weinig zin hebben.quote:
Bovendien, 123 != 0123, waar je ze dan ook nog op zou kunnen wijzen
Switch is geen functie. Het is een taal-constructie die je kan gebruiken om snel te kiezen tussen bepaalde stukken code. Sneller dan if/else bij grotere statements.quote:ID-College schreef op woensdag 20 december 2006 @ 14:57:
Nja vind het ook een beetje vreemd.
Niet dat switch() zo'n super functie is, je kan er altijd omheen werken. Dan maar een if/else constructie.
Overigens kun je altijd === gebruiken dus het maakt mij niet zoveel uit of ze nou == of === in switch gebruiken. Switch() wordt volgens mij zoiezo weinig gebruikt
Jij misbruikt (blijkbaar onbewust) het feit dat php dynamische constructies toelaat in de switch. Want je $veld === ... wordt eerst geevalueerd tot false en $veld = '' wordt ook geevalueerd tot false en in de switch is dat dus gelijkquote:Yohost! schreef op woensdag 20 december 2006 @ 16:09:
Goed, doe nu eens: $veld = '';
Rara wat krijg ik nu op mijn scherm?
Saai uitzicht in je tuin? Hang er een foto voor!
...waaraan toe te voegen is dat de code verder wel werkt als je hem onveranderd laat, afgezien van het switchen op true in plaats van op $veld. Maak er maar eens switch (true) van en kijk wat er gebeurt.quote:ACM schreef op woensdag 20 december 2006 @ 16:27:
Jij misbruikt (blijkbaar onbewust) het feit dat php dynamische constructies toelaat in de switch. Want je $veld === ... wordt eerst geevalueerd tot false en $veld = '' wordt ook geevalueerd tot false en in de switch is dat dus gelijk
Morituri Nolumus Mori 10-man WoW raiding guild op Doomhammer
Standeman: Ik wil mijn ballen ook wel doneren hoor, ik doe er toch ook niets meer mee.
Edit:
Ja zo werkt ie wel weer pima inderdaad!quote:-NMe- schreef op woensdag 20 december 2006 @ 16:34:
Maak er maar eens [font=mono]switch (true)[/font] van en kijk wat er gebeurt.
Een behoorlijk verbouwde switch is het nu geworden
Yohost! wijzigde dit bericht 20-12-2006 16:42 (54%)
Als een boer kiespijn heeft, lacht hij dan?
Ik heb je post er nog even bijgezet.quote:-NMe- schreef op woensdag 20 december 2006 @ 16:24:
Hmm, ik mag blijkbaar geen comments submitten op bugs die zij als "bogus" bestempelen. Stel je voor dat ze kritiek krijgen.Dan maar hier posten.
[...]
Da's dus nu juist mijn punt van wél expliciet casten naar strings, op die manier zou de 'standaard' typecast naar INT gewoon *niet* mogen gebeuren. De compiler/interpreter zou dat gewoon moeten snappen en dan eventuele typecasts overslaan. Dat zou de huidige manier van werken niet aanpassen, de switch() hoeft gelijk niet eens === te gebruiken maar kan netjes met == blijven werken, en voor degenen die niet geconfronteerd willen worden met dit soort wazigheden de standaard oplossing kunnen zijnquote:ACM schreef op woensdag 20 december 2006 @ 16:27:
[...]
Je zou ze er nog op kunnen wijzen dat je strings vergelijkt die toevallig uit getallen bestaan en dus ook van == zou verwachten dat een en ander ongelijk is... Er zijn tenslotte geen type-casts nodig, ook al doen ze die blijkbaar wel. Ook jouw expliciete casts hebben geen resultaat, want het zijn al strings die je er in stopt, daar op hameren zal weinig zin hebben.
Bovendien, 123 != 0123, waar je ze dan ook nog op zou kunnen wijzen
SchizoDuckie wijzigde dit bericht 20-12-2006 17:25 (3%)
Op het moment dat je variabele de switch in gaat is het totaal niet bekend meer dat ie getypecast was, maar het type van het ding is wel bekend.quote:SchizoDuckie schreef op woensdag 20 december 2006 @ 17:24:
Da's dus nu juist mijn punt van wél expliciet casten naar strings, op die manier zou de 'standaard' typecast naar INT gewoon *niet* mogen gebeuren. De compiler/interpreter zou dat gewoon moeten snappen en dan eventuele typecasts overslaan.
Want wat moet er in jouw geval dan met zoiets gebeuren?
PHP:
| <?php
|
Persoonlijk heb ik er niet zoveel moeite mee dat er standaard de '==' gedaan wordt in de diverse vergelijkingen. Waar ik wel moeite mee heb is dat als er twee variabelen hetzelfde type (string) hebben, dat ze behandeld worden als andere soorten types... Maar ook weer niet helemaal, want als de quotes er niet om heen hadden gestaan werden ze weer anders geinterpreteerd.
Ik snap dan ook niet waarom het "expected behavior" is dat een 0 vooraan een getalstring weggeknipt wordt als je die vergelijkt met een andere getalstring, maar niet als er andere soorten karakters in zitten. Blijkbaar vinden ze dus dat er ipv twee (int en string) er drie typen bestaan hier (int, number string, string), oid.
Saai uitzicht in je tuin? Hang er een foto voor!
Zo is het logisch toch? Als je nog een case "1" toe zou voegen zou dat weer wel matchen want de expliciete cast naar string zegt dat je alleen daarop wilt matchen.quote:ACM schreef op woensdag 20 december 2006 @ 18:59:
[...]
PHP:
1
2
3
4
5
6<?php
$bla = 1;
switch((string)$bla)
{
case 1 : ...; break; // nuh-uh da's een int, geen string!
default : ...; break; // er wordt hierheen gesprongen
}
?>
SchizoDuckie wijzigde dit bericht 20-12-2006 19:12 (9%)
Reg. datum: 25 juli 2006
De volgende code
PHP:
| <?php
|
wordt eigenlijk als volgt uitgevoerd (is semantisch gelijk aan)
PHP:
| <?php
|
Dus wanneer de switch wordt ingegaan heeft deze switch geen kennis van het feit dat deze variabele zojuist expliciet gecast is (en dat wil een switch ook niet weten).
Binnen het switch-statement wordt de '=='-operator gebruikt en wordt dus niet expliciet gekeken naar het type. Dat lijkt mij ook correct want PHP is loosly typed. Anders moet er onderscheid gemaakt kunnen worden tussen de twee verschillende switches die jij wilt hebben (één switch die rekening houdt met het type van een variabele en één die dat niet doet)? Dit lijkt mij (zo op het eerste gezicht) niet wenselijk en het bevordert de helderheid van de semantiek van het switch-statement niet bepaald.
Quidquid agis, prudenter agas, et respice finem!
Danku.quote:SchizoDuckie schreef op woensdag 20 december 2006 @ 17:24:
[...]
Ik heb je post er nog even bijgezet.
Morituri Nolumus Mori 10-man WoW raiding guild op Doomhammer
Standeman: Ik wil mijn ballen ook wel doneren hoor, ik doe er toch ook niets meer mee.
JavaScript:
1 | alert('123' == '0123'); // false
|
crisp wijzigde dit bericht 20-12-2006 22:27 (24%)
PHP:
| <?php
|
bool(true) bool(true) bool(true) bool(true) bool(true) bool(true) -------------------- bool(false) bool(false) bool(false) bool(false) bool(false) bool(false) -------------------- bool(true) bool(true) bool(true) bool(true) bool(true) bool(true) -------------------- bool(false) bool(false) bool(true) bool(false) bool(false) bool(true) -------------------- bool(true) bool(true) bool(true) bool(true) bool(true) bool(true)
Wat is nou precies gelijkheid?
My intentions soon you will see. The sway of my scheme, imposed upon all.
Come follow me, my puppets to be, I'll attach my strings, manipulation begins.
www.stichtingspots.nl
Pagina: 1




