php.de

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

 
 
LinkBack Themen-Optionen Thema bewerten
Alt 21.07.2006, 14:40  
Erfahrener Benutzer
 
Registriert seit: 14.09.2004
Beiträge: 382
Crypi
Standard $var==0 == $var==""

Hi,

ich stoße gerade in ungeahnte tiefen vor...
und ich dachte ich hätte was begriffen...

ich vergleiche

$this->var=0;

if ($this->var == "") => true
if($this->var==0) => true

das zweite versteh ich ja aber das erste?? ich will doch nur eine integer testen...

ist das normal?
wie doof ist das denn??!! wie soll ich denn zwischen einer nicht initialisierten variablen und 0 unterscheiden?

Crypi
__________________
PostgreSQL Forum:
www.pg-forum.de
Crypi ist offline  
Sponsor Mitteilung
PHP Code Flüsterer

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

Alt 21.07.2006, 14:47  
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

Schonmal beim Stöbern auf isset() gestoßen?
__________________
**********************************
Nein, ich bin nicht die Signatur.
Ich putze hier nur.
**********************************
Der_Gerhard ist offline  
Alt 21.07.2006, 14:53  
Gast
 
Beiträge: n/a
Standard http://www.phpfriend.de/forum/posting.php?mode=reply&t=5

Warum ist 0==''? http://www.php.net/manual/en/languag...e-juggling.php
 
Alt 21.07.2006, 14:55  
Erfahrener Benutzer
 
Registriert seit: 14.09.2004
Beiträge: 382
Crypi
Standard

ok, aber bei objekten hilft das doch nicht oder?
wenn ich kontrollieren möchte ob eine exemplarvariable bereits gesetzt wurde oder?

weil sie da dann ja auf jeden fall existiert aber noch nicht notwendiger weise einen wert zugewiesen bekommen hat.

hät ich oben schon schreiben sollen, dass ich mich auf exemplarvariablen von objekten beziehe.

Crypi
__________________
PostgreSQL Forum:
www.pg-forum.de
Crypi ist offline  
Alt 21.07.2006, 14:58  
Gast
 
Beiträge: n/a
Standard

Zitat:
Zitat von Crypi
ok, aber bei objekten hilft das doch nicht oder?
wenn ich kontrollieren möchte ob eine exemplarvariable bereits gesetzt wurde oder?
Worauf fußt diese Vermutung?
Darauf, dass Der_Gerhard $this->var nicht zu deuten weiss?
Oder darauf, dass er immer nur in die Irre leiten will?
Glaube ich nicht.
 
Alt 21.07.2006, 14:59  
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

Stichwort "typschwach"
PHP-Code:
$this->var 0;

$this->var == 0// TRUE
$this->var === 0// TRUE

$this->var == ""// TRUE
$this->var === ""// FALSE 
Zusammen mit dem Link von Bruchpilot noch was zum stöbern: Vergleichsoperatoren
__________________
Nicht jeder Fehler ist ein Bug.
KingCrunch ist offline  
Alt 21.07.2006, 15:04  
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

Zitat:
Zitat von Crypi
weil sie da dann ja auf jeden fall existiert aber noch nicht notwendiger weise einen wert zugewiesen bekommen hat.
Das ist so gesehen falsch. Jede existierende Variable besitzt einen Wert, der (falls kein Typ definiert ist) eben einfach NULL ist. Und nach der Typschwäche von PHP ist NULL gleich 0 gleich "" gleich FALSE

Desweiteren: Zu meiner Schande muss ich gestehen, dass ich Exemplarvariable noch nie gehört habe. Meinst du zufällig Eigenschaften? Wieso sollten dann Eigenschaften eines Objekts anders behandelt werden, als reguläre Variablen?
__________________
Nicht jeder Fehler ist ein Bug.
KingCrunch ist offline  
Alt 21.07.2006, 15:06  
Erfahrener Benutzer
 
Registriert seit: 14.09.2004
Beiträge: 382
Crypi
Standard

@ bruchpilot: das fußt darauf das ichs ausprobiert hab und zu keinem befriedegenden ergebnis gekommen bin und auf dem was ich dachte über isset zu wissen.
sicher nicht darauf, das ich annahm das er nicht wüsste was $this-> bedeutet, und ob er nur in die irre führt weiß ich nicht... denke ich aber nicht.

@kingcrunch
so funktionierts. allerdings steht dahinter "nur php4", funktioniert aber auch bestens bei php5, ich nehme an das bedeutet "ab php4"?

Crypi
__________________
PostgreSQL Forum:
www.pg-forum.de
Crypi ist offline  
Alt 21.07.2006, 15:13  
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

Zitat:
Zitat von Crypi
so funktionierts. allerdings steht dahinter "nur php4", funktioniert aber auch bestens bei php5, ich nehme an das bedeutet "ab php4"?
Öhm? Wo steht "nur php4"? ^^

Edit: Habs gefunden, muss nen Inhaltsfehler sein. Kannste ignorieren. Vergleiche hier. Da hat der Übersetzer geschlampt Dort kannste in Tabelle 15-5 auch erkennen, wieso 0 == "" ist (inklusive Begründung).


Übrigens halte ich es für sinnvoller anstatt auf die Existenz einer Eigenschaft zu prüfen (was natürlich nicht geht, weil bei einem instanzierten Objekt die Eigenschaft natürlich existiert) der Eigenschaft einen Initialwert zu geben und auf diesen zu prüfen:
PHP-Code:
class test {
  public 
$var NULL;
}

$test = new test();

if (
$test->var === NULL) {
  echo 
"nicht gesetzt";

Noch sinnvoller wäre der Initialwert, wenn er in einem logischen Kontext steht und dann nicht weiter geprüft werden muss (Stichwort: Standardwert bzw Default).
PHP-Code:
class test {
  public 
$lang "de";

  public function 
setLang ($lang) {
    
$this->lang $lang;
  }
}

$test = new test();
echo 
$test->lang;
$this->setLang("en");
echo 
$this->lang
KingCrunch ist offline  
Alt 21.07.2006, 15:13  
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 Bruchpilot
Zitat:
Zitat von Crypi
ok, aber bei objekten hilft das doch nicht oder?
wenn ich kontrollieren möchte ob eine exemplarvariable bereits gesetzt wurde oder?
Worauf fußt diese Vermutung?
Darauf, dass Der_Gerhard $this->var nicht zu deuten weiss?
Ich muss gestehen, dass ich das this-> glatt ignoriert habe. Ich habe in erster Linie auf die Frage
Zitat:
wie soll ich denn zwischen einer nicht initialisierten variablen und 0 unterscheiden?
geantwortet.
Funktioniert isset() denn nicht mit Instanzvariablen?

Ich kenne zwar die Bedeutung von $this->, aber habe in PHP noch nix mit Klassen gemacht. Jedenfalls würde eine Andersbehandlung von Instanzvariablen mich ziemlich überraschen.
Wenn sich eine Variable im Sichtbarkeitsbereich befindet, sollte sie sich auch genauso verhalten wie eine herkömmliche Variable außerhalb eines Objekts.

Aus dem "Aber bei... funktioniert das doch nicht, oder" schließe ich mal, dass Crypi das jetzt auch nicht ausprobiert hat.

Zitat:
Zitat von Bruchpilot
Oder darauf, dass er immer nur in die Irre leiten will?
Glaube ich nicht.

Also wenn schon, dann will ich die Leute dazu bringen, sich die Doku mal selber durchzulesen.
Wo hab ich denn schonmal in die Irre geführt?
Der_Gerhard 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

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
$var==0 php, php \if($this->var ==\ ||

Alle Zeitangaben in WEZ +2. Es ist jetzt 18:13 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.