php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > PHP Developer Forum
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Fragen zu Laravel, YII oder anderen PHP-Frameworks.

Antwort
 
LinkBack Themen-Optionen Thema bewerten
  #1 (permalink)  
Alt 06-10-2006, 22:05
3DMax
 PHP Senior
Links : Onlinestatus : 3DMax ist offline
Registriert seit: Jan 2004
Beiträge: 1.916
3DMax ist zur Zeit noch ein unbeschriebenes Blatt
Standard interessante frage zum string casting

hi,

habe gerade im heiseforum folgende interessante frage entdeckt:

Zitat:
Zum Beispiel der ganze Typendurcheinander geht mir auf den Geist -
wenn man auf Strings castet, dann heißt das nämlich überhaupt nix,
hier ein Beispiel:
PHP-Code:
if ( (string)'0X2BAD' == (string)'11181' ) {
echo 
"*ARGH*";
} else {
echo 
"PHP ist super";

Na? Was kommt wohl raus? Ja, raus kommt:
> *ARGH*
Sowas gibts nur bei PHP. Es gibt zwar den ===, aber da die Typen alle
String sein müssten, müsste auch ein == reichen!
weiß jemand, warum das so ist? ich habe
Mit Zitat antworten
  #2 (permalink)  
Alt 06-10-2006, 22:27
Slava
 PHP Senior
Links : Onlinestatus : Slava ist offline
Registriert seit: Nov 2002
Ort: Köln->Karlsruhe
Beiträge: 1.589
Slava befindet sich auf einem aufstrebenden Ast
Standard

hm
gut zu wissen.
PHP ist von Menschen entwickelt worden und die Menschen machen die Fehler.

ich finde so ein verhalten natürlich komisch, bei c, c++, java, c# gibt es so ein problem nicht, da jede Variable mit seinem Type deklariert sein muss.
__________________
Slava
bituniverse.com
Mit Zitat antworten
  #3 (permalink)  
Alt 06-10-2006, 22:43
penizillin
 PHP Guru
Links : Onlinestatus : penizillin ist offline
Registriert seit: Feb 2004
Beiträge: 10.166
penizillin ist zur Zeit noch ein unbeschriebenes Blatt
Standard

da gibt es einiges:

http://de2.php.net/manual/en/languag...e-juggling.php
http://de2.php.net/manual/en/languag...ing.conversion

also: einfach vermeiden. das ist einfach.
Mit Zitat antworten
  #4 (permalink)  
Alt 06-10-2006, 22:43
ghostgambler
 Master
Links : Onlinestatus : ghostgambler ist offline
Registriert seit: Jul 2004
Ort: DE - NRW
Beiträge: 4.620
ghostgambler ist zur Zeit noch ein unbeschriebenes Blatt
Standard Re: interessante frage zum string casting

Hm ... scheint mit dem zval zusammen zu hängen, sobald man einen Buchstaben oder eine Zahl ändert funktioniert es nicht mehr, warum es allerdings intern als gleich angesehen wird Oo,

strcmp schafft Abhilfe!
Mit Zitat antworten
  #5 (permalink)  
Alt 07-10-2006, 03:07
3DMax
 PHP Senior
Links : Onlinestatus : 3DMax ist offline
Registriert seit: Jan 2004
Beiträge: 1.916
3DMax ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Original geschrieben von Slava
ich finde so ein verhalten natürlich komisch, bei c, c++, java, c# gibt es so ein problem nicht, da jede Variable mit seinem Type deklariert sein muss.
du weißt schon, dass das hier ein php-forum ist?
Mit Zitat antworten
  #6 (permalink)  
Alt 07-10-2006, 03:24
3DMax
 PHP Senior
Links : Onlinestatus : 3DMax ist offline
Registriert seit: Jan 2004
Beiträge: 1.916
3DMax ist zur Zeit noch ein unbeschriebenes Blatt
Standard

@penizillin && @ ghostgambler

also ist es doch offensichtlich ein php-bug? .. oder wie seht ihr das?
... so langsam geht mir das php-type-casting auch auf die nervern
Mit Zitat antworten
  #7 (permalink)  
Alt 07-10-2006, 03:29
3DMax
 PHP Senior
Links : Onlinestatus : 3DMax ist offline
Registriert seit: Jan 2004
Beiträge: 1.916
3DMax ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Original geschrieben von penizillin also: einfach vermeiden. das ist einfach.
und wie vermeiden?
nenne mal ein konkretes beispiel, anstatt links zu posten.
Mit Zitat antworten
  #8 (permalink)  
Alt 07-10-2006, 09:50
Koala
 PHP Junior
Links : Onlinestatus : Koala ist offline
Registriert seit: Jan 2006
Beiträge: 887
Koala ist zur Zeit noch ein unbeschriebenes Blatt
Standard

(string)'0X2BAD' weist ja dem Inhalt 0X2BAD den Typ String zu.

Dies ergibt true.

Und wenn ich eine Typ-Zuweisung mit einer anderen Typ-Zuweisung
vergleiche, dann ergibt das eben auch true.

Also in der if-Abfrage nicht die Zuweisung vergleichen,
sondern den Inhalt der Variablen.
Mit Zitat antworten
  #9 (permalink)  
Alt 07-10-2006, 12:51
Slava
 PHP Senior
Links : Onlinestatus : Slava ist offline
Registriert seit: Nov 2002
Ort: Köln->Karlsruhe
Beiträge: 1.589
Slava befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Original geschrieben von Koala
(string)'0X2BAD' weist ja dem Inhalt 0X2BAD den Typ String zu.

Dies ergibt true.

Und wenn ich eine Typ-Zuweisung mit einer anderen Typ-Zuweisung
vergleiche, dann ergibt das eben auch true.

Also in der if-Abfrage nicht die Zuweisung vergleichen,
sondern den Inhalt der Variablen.
nein
wenn du (string)23==(string)24 vergleichst bekommst du false, also kasting macht nur typeumwandlung und kann kein boolean liefern.
Problem ist, das bei 0X2BAD und 11181 handelt es sich um gleichen integer Wert nur eben anderes geschrieben und operator == vergleicht die Werte ohne rücksicht auf die typen.
das bedeutet, dass operator "==" versucht bei vergleich alle mögliche typeumwandlungen durchzutesten und bei erstem positivem vergleich true liefert, sonnst false.

Also meine meinung nach liegt es am ganz normalem gierigem verhalten von "==" operator.
als beweis:
if((string)"false" == (float)0)echo "stimmt?";
operator== ist eine function, die vergleich von 2 Werten ohne rücksicht auf die Type macht. das war schon immer so.
für die typen und werten vergleich gibt es operator===


Zitat:
Original geschrieben von 3DMax
du weißt schon, dass das hier ein php-forum ist?
ja
aber php ist in c geschrieben worden und operator == hat intern eine andere Name:
ZEND_API int compare_function(zval *result, zval *op1, zval *op2 TSRMLS_DC)

du kannst auch Geburt von diesem operator nachvollziehen, wenn du die source dateien zend_operators.c und zend_operators.h anschaust
__________________
Slava
bituniverse.com

Geändert von Slava (07-10-2006 um 13:24 Uhr)
Mit Zitat antworten
  #10 (permalink)  
Alt 08-10-2006, 21:40
ghostgambler
 Master
Links : Onlinestatus : ghostgambler ist offline
Registriert seit: Jul 2004
Ort: DE - NRW
Beiträge: 4.620
ghostgambler ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Original geschrieben von Slava
Problem ist, das bei 0X2BAD und 11181 handelt es sich um gleichen integer Wert nur eben anderes geschrieben
Das Problem ist aber trotzdem merkwürdig, da
PHP-Code:
<?php
echo intval('0X2BAD');
echo 
intval('11181');
ergibt
Code:
0
11181
D.h. die interne Konvertierung in der zval-struct, ist wiederum anders als die, die bei PHP ausgeführt wird, weshalb alles ziemlich tricky ist...

Aber wenn das auf Heise schon stand, gehe ich davon aus, dass sich das Verhalten in einer der nächsten php-Versionen ändern wird. Ganz abgesehen von dem Verhalten in php6, wenn die Unicode-Unterstützung kommen wird ... mal abwarten

Geändert von ghostgambler (09-10-2006 um 01:24 Uhr)
Mit Zitat antworten
  #11 (permalink)  
Alt 08-10-2006, 22:37
closure
 Master
Links : Onlinestatus : closure ist offline
Registriert seit: Mar 2006
Beiträge: 796
closure ist zur Zeit noch ein unbeschriebenes Blatt
Standard

@ghostgambler
das kann auch an der implementierung von intval liegen und hat
keinen beweischaracter. Es ist doch schon ein unding, dass php
automatisch versucht stringliterale die zufällig mal aussehen
wie zahlen auch bei vergleichen wie zahlen behandelt.

Der "cast" im konkreten fall von string zu string (was ja eigentlich
kein cast ist) und der anschliessende vergleich lassen das doch deutlich werden.


OffTopic:


Solche dinge und noch vieles mehr, hat mich schon vor einiger zeit
dazu gebracht in php nicht mehr zu sehen als spielerei. Etwa wie brainfuck, nur
das brainfuck konsistenter ist.

Seht es ein, ihr befindet euch auf einem sinkenden schiff. Ihr wollt
doch nicht die letzten sein, die es verlassen oder ?




grets
__________________
(((call/cc call/cc) (lambda (x) x)) "Scheme just rocks! and Ruby is magic!")
Mit Zitat antworten
  #12 (permalink)  
Alt 08-10-2006, 23:00
Slava
 PHP Senior
Links : Onlinestatus : Slava ist offline
Registriert seit: Nov 2002
Ort: Köln->Karlsruhe
Beiträge: 1.589
Slava befindet sich auf einem aufstrebenden Ast
Standard

also hier finde ich das verhalten von "intval" comisch
es siht so aus, dass intval mit hexadezimalen werten nicht umgehen kann.
wenn du
echo hexdec('0X2BAD');
machst, dann bekommst du eigentlich 11181.

operator == macht einfach wie ich schon gesagt habe alle mögliche Vergleiche und bei erstem Positivem Vergleich liefert True zurück.

Ich kenne der genaue Hintergrund nicht, aber vermute einfach, dass es extra gemacht wurde , um direkt ein wert von einer Variable z.b.s mit Inhalt von POST Variable durchzuführen ohne Rücksicht auf die Type.

Wir müssen auch bedenken, dass bei älteren PHP-versionen (wenn ich mich nicht irre) überhaupt kein casting ind form (type) gegeben hat, sondern es wurde automatisch durchgeführt, und wenn es uns nicht gepasst hat, dann haben wir einfach $var*1 oder $var.""
bzw intval, strval aufgerufen.

Fazit:
1) nur === kann mit Garantie 2 werte mit Ihren Typen vergleichen
2)wenn du 2 werte mit == vergleichen willst, dann mach dir keine mühe wegen Typenumwandlung, da "==" pfeift einfach darauf.
__________________
Slava
bituniverse.com
Mit Zitat antworten
  #13 (permalink)  
Alt 08-10-2006, 23:08
Slava
 PHP Senior
Links : Onlinestatus : Slava ist offline
Registriert seit: Nov 2002
Ort: Köln->Karlsruhe
Beiträge: 1.589
Slava befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Original geschrieben von closure

Seht es ein, ihr befindet euch auf einem sinkenden schiff. Ihr wollt
doch nicht die letzten sein, die es verlassen oder ?

[/OT]

grets [/B]

mir macht es nichts aus.
ich bin schon gesunken.
ich bin mir sicher, dass PHP sehr gute Zukunft
__________________
Slava
bituniverse.com
Mit Zitat antworten
  #14 (permalink)  
Alt 08-10-2006, 23:16
Benutzerbild von onemorenerd onemorenerd
  Moderator
Links : Onlinestatus : onemorenerd ist offline
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.471
onemorenerd wird schon bald berühmt werdenonemorenerd wird schon bald berühmt werden
Standard

Na das sehe ich aber anders. Ein sinkendes Schiff sieht nie wieder einen Hafen, erst recht keine Werft. PHP wird aber weiterentwickelt.
Diese Vergleichsanomalien (gibt sicher mehr als die eine von Heise) können durchaus schnell beseitigt werden - der Entwicklungskurs wendet sich zwar nur langsam in Richtung der vielstimmig geforderten Enterprise-Fähigkeit, aber das hat nichts damit zu tun, dass Fehler nicht beseitigt werden: Einfach einen Bugreport absetzen (sicher schon passiert) und mit dem nächsten Release ist 1=1 bestimmt schon true.
Mit Zitat antworten
  #15 (permalink)  
Alt 08-10-2006, 23:58
3DMax
 PHP Senior
Links : Onlinestatus : 3DMax ist offline
Registriert seit: Jan 2004
Beiträge: 1.916
3DMax ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Original geschrieben von closure
Solche dinge und noch vieles mehr, hat mich schon vor einiger zeit
dazu gebracht in php nicht mehr zu sehen als spielerei.
er hat "jehova" gesagt, steinigt ihn
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre 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


PHP News

Die RIGID-FLEX-Technologie
Die RIGID-FLEX-TechnologieDie sogenannte "Flexible Elektronik" , oftmals auch als "Flexible Schaltungen" bezeichnet, ist eine zeitgemäße Technologie zum Montieren von elektronischen Schaltungen.

06.12.2018 | Berni

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni


 

Aktuelle PHP Scripte

ADSMAN V3 - Werbe-Manager ansehen ADSMAN V3 - Werbe-Manager

ADSMAN V3 - mehr als nur ein Bannermanager! Banner, Textanzeigen und PagePeel Manager! Mit ADSMAN PRO haben Sie die Marketinglösung für eine effektive und effiziente Werbeschaltung mit messbaren Ergebnissen. Unterstützt werden Bannerformate in beliebi

25.10.2018 virtualsystem | Kategorie: PHP/ Bannerverwaltung
PHP News und Artikel Script V2

News schreiben, verwalten, veröffentlichen. Dies ist jetzt mit dem neuen PHP News & Artikel System von virtualsystem.de noch einfacher. Die integrierte Multi-User-Funktion und der WYSIWYG-Editor (MS-Office ähnliche Bedienung) ermöglichen...

25.10.2018 virtualsystem | Kategorie: PHP/ News
Top-Side Guestbook

Gästebuch auf Textbasis (kein MySQL nötig) mit Smilies, Ip Sperre (Zeit selbst einstellbar), Spamschutz, Captcha (Code-Eingabe), BB-Code, Hitcounter, Löschfunktion, Editierfunktion, Kommentarfunktion, Kürzung langer Wörter, Seiten- bzw. Blätterfunktion, V

22.10.2018 webmaster10 | Kategorie: PHP/ Gaestebuch
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 06:01 Uhr.