php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger > PHP Tipps 2007

 
 
LinkBack Themen-Optionen Thema bewerten
Alt 31.03.2007, 18:58  
Erfahrener Benutzer
 
Registriert seit: 08.11.2004
Beiträge: 2.079
Der_Gerhard ist zur Zeit noch ein unbeschriebenes Blatt
Der_Gerhard eine Nachricht über ICQ schicken
Standard

Na weil man auf den ersten Blick evtl. die Klammerung der Teilausdrücke übersieht und meint, dass der Wert im einzigen Array-Element irgendeine Bedeutung hätte.
Erst wenn man sich die Klammern genauer ansieht, merkt man, dass da nur true aus der ersten Klammer mit dem Array verglichen wird, was eben auch einfach nach true konvertiert wird.
__________________
**********************************
Nein, ich bin nicht die Signatur.
Ich putze hier nur.
**********************************
Der_Gerhard ist offline  
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 31.03.2007, 19:00  
Erfahrener Benutzer
 
Registriert seit: 08.11.2004
Beiträge: 2.079
Der_Gerhard ist zur Zeit noch ein unbeschriebenes Blatt
Der_Gerhard eine Nachricht über ICQ schicken
Standard

Zitat:
Zitat von Slava
if((int)"23 Frauen"==(float)"23 Mäner")echo "das ist verrückt";
Das ist nicht das Problem.

Das Array am Ende des Ausdrucks hat ja nun gar nix mit dem Zeugs davor zu tun. Da hilft auch keine Konvertierung nach integer mehr.
__________________
**********************************
Nein, ich bin nicht die Signatur.
Ich putze hier nur.
**********************************
Der_Gerhard ist offline  
Alt 31.03.2007, 19:28  
Erfahrener Benutzer
 
Registriert seit: 17.01.2006
Beiträge: 468
Slava
Standard

du hast es richtg bemerkt
(string)"0XABBA"==(int)"43962" liefert TRUE weil
0xABBA ist einfach hexadezimale darstellung von 43962
0xABBA==43962 ist also true.
und wie erwartet pfeift operator "==" auf die datentüpen von Variablen da seine Aufgabe ist ein Vergleich ohne rücksicht auf die typen durchzuführen.
das bedeutet also, dass intern mcht er aus dem string "0xABBA" ein int und vergleicht diesen int wert mit dem int wert von 43962
etwa so
if(intval(0xABBA)===intval("43962")) was natürlich TRUE liefert.

vergleich mit dem array war natürlich ein trik
da wir in wirklichkeit
if(TRUE==array(egalwas)) abgfragt haben und das hat uns true geliefert
__________________
Slava
http://bituniverse.com
Slava ist offline  
Alt 31.03.2007, 19:39  
Erfahrener Benutzer
 
Registriert seit: 13.08.2007
Beiträge: 1.976
KingCrunch befindet sich auf einem aufstrebenden Ast
KingCrunch eine Nachricht über ICQ schicken KingCrunch eine Nachricht über AIM schicken KingCrunch eine Nachricht über MSN schicken KingCrunch eine Nachricht über Yahoo! schicken
Standard

Das hab ich so weit verstanden, aber wieso ist die Klammer "true"?
__________________
Nicht jeder Fehler ist ein Bug.
KingCrunch ist offline  
Alt 31.03.2007, 19:46  
Erfahrener Benutzer
 
Registriert seit: 17.01.2006
Beiträge: 468
Slava
Standard

Zitat:
Zitat von KingCrunch
Das hab ich so weit verstanden, aber wieso ist die Klammer "true"?
lese noch mal durch was ich über operator "==" geschrieben habe.
Also die datentypen, die du übergibst sind ihm egal, er macht alle Typumwandlungen intern um eine gleichheit zwischen variablen zu finden.
aus diesem grund liefert if("23"==23) ein true weil dtentypen für operator "==" keine rolle spielen.
__________________
Slava
http://bituniverse.com
Slava ist offline  
Alt 31.03.2007, 19:57  
Erfahrener Benutzer
 
Registriert seit: 08.11.2004
Beiträge: 2.079
Der_Gerhard ist zur Zeit noch ein unbeschriebenes Blatt
Der_Gerhard eine Nachricht über ICQ schicken
Standard

Na weil dem == der Typ egal ist.
Mit (string) wird zwar der String als String betrachtet (also eigentlich überflüssig), dann aber für den Vergleich in eine Zahl konvertiert.
Und "0xabba" ist eben 0xabba = 43962, was somit == (int)"43962") ist.

Das alles ist Auswuchs des total kranken Typ-Konzepts. Bzw. des fehlenden Typ-Konzepts.

Da Variablen keinen Typ haben, musst Du eigentlich vor dem Vergleich erst mal sicherstellen, dass wirklich Strings oder Integer enthalten sind.

Wenn ich "0xABBA" schreibe, meine ich eine Zeichenkette. Keinen Zahlenwert.
Und wenn ich dann ne Variable habe, wo 43962 drinsteht, ist das für mich ungleich.
Für PHP ist es gleich.

Ich bin überzeugt, dass man sich mit diesen automatischen alles-in-alles-konvertierereien mehr Ärger einfängt, als man sich an Tipparbeit spart.

@slava:
Mach mal "023" == 023
__________________
**********************************
Nein, ich bin nicht die Signatur.
Ich putze hier nur.
**********************************
Der_Gerhard ist offline  
Alt 31.03.2007, 20:16  
Erfahrener Benutzer
 
Registriert seit: 17.01.2006
Beiträge: 468
Slava
Standard

Zitat:
Zitat von Der_Gerhard
@slava:
Mach mal "023" == 023
das ist kein Bug!
das ist einfach eine Anomalie
__________________
Slava
http://bituniverse.com
Slava ist offline  
Alt 31.03.2007, 20:22  
Erfahrener Benutzer
 
Registriert seit: 08.11.2004
Beiträge: 2.079
Der_Gerhard ist zur Zeit noch ein unbeschriebenes Blatt
Der_Gerhard eine Nachricht über ICQ schicken
Standard

Natürlich ist das kein Bug.
Es ist einfach nur Mist!

Bei der automatischen Konvertierung werden ganz andere Regeln verwendet als wenn man die Zahl einfach hinschreiben würde. Da gibt es glaub ich auch irgnedein Binärformat.
Einfach nur gruselig sowas.
Erst bietet man faulen Benutzern an, sie müssen nicht so genau auf die Typen achten, weil sowieso alles von hinten bin vorne automatisch hin und her konvertiert wird.
Und dann wird es abhängig vom Typ unterschiedlich gemacht.

Genauso krank ist die Implementierung von empty.
Warum um alles in der Welt ist ein String, der eine Ziffer enthält denn empty???
Nur weil diese Ziffer zufällig die 0 ist....
Aaaarrrrggggggg!!!
__________________
**********************************
Nein, ich bin nicht die Signatur.
Ich putze hier nur.
**********************************
Der_Gerhard ist offline  
Alt 31.03.2007, 20:24  
Erfahrener Benutzer
 
Registriert seit: 13.08.2007
Beiträge: 1.976
KingCrunch befindet sich auf einem aufstrebenden Ast
KingCrunch eine Nachricht über ICQ schicken KingCrunch eine Nachricht über AIM schicken KingCrunch eine Nachricht über MSN schicken KingCrunch eine Nachricht über Yahoo! schicken
Standard

Jaaaaaa, ich habs ja verstanden (scho die ganze Zeit :P) Hab bloss verpennt, dass wegen 0x der String als Hex-Wert betrachtet wird ^^
Code:
0xabba = 43962
Zum Typ-Konzept: Find das, wenn man es berücksichtig, garnicht sooo fies. Immerhin haben sie den Identitätsoperator eingeführt Sie hätten bloss (fänd ich besser) bei Abfragen (if, while, ..) nur Bool zulassen sollen... So is mir das auch etwas schwammig, weswegen ich gerne mal bei mir neuerdings solche Sachen finde
PHP-Code:
$bool true;
// blub
if ($bool === true) {
 
// bla

__________________
Nicht jeder Fehler ist ein Bug.
KingCrunch ist offline  
Alt 01.04.2007, 12:29  
Moderator und Wett-König
 
Benutzerbild von dr.e.
 
Registriert seit: 21.05.2008
Beiträge: 3.657
PHP-Kenntnisse:
Fortgeschritten
dr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblickdr.e. ist ein Lichtblick
dr.e. eine Nachricht über Skype™ schicken
Standard

Hallo zusammen,

ich denke die Type-Diskussion ist damit geklärt.

@brian johnson: Ist dein Problem nun geklärt?
__________________
Viele Grüße,
Dr.E.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1. Think about software design before you start to write code!
2. Discuss and review it together with experts!
3. Choose good tools (-> Adventure PHP Framework (APF))!
4. Write clean and reusable software only!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
dr.e. ist offline  
 


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu


Alle Zeitangaben in WEZ +2. Es ist jetzt 18:44 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum

Creative Commons License
Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.