Warum verlangt php hier einen expliziten Stringvergleich? – SELFHTML-Forum Forum als Ergänzung zum SELFHTML-Wiki und zur Dokumentation SELFHTML https://forum.selfhtml.org/self?srt=yes Warum verlangt php hier einen expliziten Stringvergleich? Thu, 24 Sep 15 11:06:41 Z https://forum.selfhtml.org/self/2015/sep/24/warum-verlangt-php-hier-einen-expliziten-stringvergleich/1650812?srt=yes#m1650812 https://forum.selfhtml.org/self/2015/sep/24/warum-verlangt-php-hier-einen-expliziten-stringvergleich/1650812?srt=yes#m1650812 <p>Hallo Forum,</p> <p>ich habe hier folgende Methode:</p> <pre><code class="block language-php"> <span class="token keyword">protected</span> <span class="token keyword">function</span> <span class="token function-definition function">doChecks</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token variable">$this</span><span class="token operator">-></span><span class="token property">watermarkfile</span> <span class="token operator">==</span> <span class="token string double-quoted-string">"0"</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token operator">...</span> </code></pre> <p>In $this->watermarkfile steht, wenn ich es per echo mal ausgeben lasse, vor der if-Abfrage der Pfad zum Wasserzeichen drin, somit wird nicht in die if-Bedingung hinein gesprungen, sondern in die anschließende else-Bedingung.</p> <p>Wenn ich aber die Methode so notiere:</p> <pre><code class="block language-php"> <span class="token keyword">protected</span> <span class="token keyword">function</span> <span class="token function-definition function">doChecks</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token variable">$this</span><span class="token operator">-></span><span class="token property">watermarkfile</span> <span class="token operator">==</span> <span class="token number">0</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token operator">...</span> </code></pre> <p>Dann wird die if-Bedingung als "true" gewertet und das Script macht innerhalb der if-Bedingung weiter.</p> <p>Das hätte ich nicht erwartet. Kann mir jemand erklären, warum das so ist? Ich hätte gedacht, dass mein Pfad (der ja in $this->watermarkfile drin steht, sowohl != "0", wie auch != 0 wäre.</p> <p>Jonny</p> Warum verlangt php hier einen expliziten Stringvergleich? Thu, 24 Sep 15 11:10:44 Z https://forum.selfhtml.org/self/2015/sep/24/warum-verlangt-php-hier-einen-expliziten-stringvergleich/1650814?srt=yes#m1650814 https://forum.selfhtml.org/self/2015/sep/24/warum-verlangt-php-hier-einen-expliziten-stringvergleich/1650814?srt=yes#m1650814 <p>Hallo Regenbogenjonny,</p> <blockquote> <p>Das hätte ich nicht erwartet. Kann mir jemand erklären, warum das so ist? Ich hätte gedacht, dass mein Pfad (der ja in $this->watermarkfile drin steht, sowohl != "0", wie auch != 0 wäre.</p> </blockquote> <p>Das ist das automatische <a href="http://php.net/manual/de/language.types.type-juggling.php" rel="noopener noreferrer">Type-Juggling von PHP</a>. Durch den Vergleich mit der <code>0</code> wird der String in eine Zahl umgewandelt; da das fehlschlägt ist das Ergebnis halt <code>0</code>, und dann steht da <code>0 == 0</code>.</p> <p>Um solche Fehler zu vermeiden ist es sinnvoll <a href="http://php.net/manual/de/language.operators.comparison.php" rel="noopener noreferrer"><code>===</code></a> zu verwenden anstatt <code>==</code>.</p> <p>LG,<br> CK</p> <div class="signature">-- <br> <a href="http://ck.kennt-wayne.de/" rel="nofollow noopener noreferrer">CK kennt Wayne</a> </div> Warum verlangt php hier einen expliziten Stringvergleich? Thu, 24 Sep 15 11:14:37 Z https://forum.selfhtml.org/self/2015/sep/24/warum-verlangt-php-hier-einen-expliziten-stringvergleich/1650815?srt=yes#m1650815 https://forum.selfhtml.org/self/2015/sep/24/warum-verlangt-php-hier-einen-expliziten-stringvergleich/1650815?srt=yes#m1650815 <p>Tach!</p> <blockquote> <pre><code class="block language-php"> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token variable">$this</span><span class="token operator">-></span><span class="token property">watermarkfile</span> <span class="token operator">==</span> <span class="token string double-quoted-string">"0"</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token operator">...</span> </code></pre> <p>In $this->watermarkfile steht, wenn ich es per echo mal ausgeben lasse, vor der if-Abfrage der Pfad zum Wasserzeichen drin, somit wird nicht in die if-Bedingung hinein gesprungen, sondern in die anschließende else-Bedingung.</p> </blockquote> <p>Hier findet ein Vergleich zweier Strings statt.</p> <blockquote> <pre><code class="block language-php"> <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token variable">$this</span><span class="token operator">-></span><span class="token property">watermarkfile</span> <span class="token operator">==</span> <span class="token number">0</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token operator">...</span> </code></pre> <p>Dann wird die if-Bedingung als "true" gewertet und das Script macht innerhalb der if-Bedingung weiter.</p> </blockquote> <p>Hier hast du einen String und eine Zahl. In dem Fall wird versucht, der String in eine Zahl zu konvertieren. Wenn da keine Zahl (am Anfang) drinsteht, ist das Ergebnis der Konvertierung 0. Damit ergibt der Vergleich true.</p> <blockquote> <p>Das hätte ich nicht erwartet. Kann mir jemand erklären, warum das so ist? Ich hätte gedacht, dass mein Pfad (der ja in $this->watermarkfile drin steht, sowohl != "0", wie auch != 0 wäre.</p> </blockquote> <p>Siehe auch <a href="http://php.net/manual/en/types.comparisons.php" rel="noopener noreferrer">PHP type comparision table</a>.</p> <p>Warum aber vergleichst du mit der Zahl 0 (egal ob String oder Zahl), wenn du da gar keine 0 erwartest? Es gäbe da beispielsweise null für einen nicht vorhandenen Wert.</p> <p>dedlfix.</p> Warum verlangt php hier einen expliziten Stringvergleich? Thu, 24 Sep 15 19:21:32 Z https://forum.selfhtml.org/self/2015/sep/24/warum-verlangt-php-hier-einen-expliziten-stringvergleich/1650832?srt=yes#m1650832 https://forum.selfhtml.org/self/2015/sep/24/warum-verlangt-php-hier-einen-expliziten-stringvergleich/1650832?srt=yes#m1650832 <p>Hallo Christian, hallo dedlfix,</p> <p>danke für Eure Antworten, wie gesagt, der Fehler war etwas unerwartet für mich. Hatte ich so noch nicht erlebt...</p> <blockquote> <p>Warum aber vergleichst du mit der Zahl 0 (egal ob String oder Zahl), wenn du da gar keine 0 erwartest? Es gäbe da beispielsweise null für einen nicht vorhandenen Wert.</p> </blockquote> <p>Doch, eine 0 erwarte ich ja. Nämlich dann, wenn der User kein Wasserzeichen setzen möchte, kann er eine 0 anstelle eines Pfades/Datei angeben.</p> <p>Jonny</p> Warum verlangt php hier einen expliziten Stringvergleich? Thu, 24 Sep 15 19:37:24 Z https://forum.selfhtml.org/self/2015/sep/24/warum-verlangt-php-hier-einen-expliziten-stringvergleich/1650834?srt=yes#m1650834 https://forum.selfhtml.org/self/2015/sep/24/warum-verlangt-php-hier-einen-expliziten-stringvergleich/1650834?srt=yes#m1650834 <p>Tach!</p> <blockquote> <p>Doch, eine 0 erwarte ich ja. Nämlich dann, wenn der User kein Wasserzeichen setzen möchte, kann er eine 0 anstelle eines Pfades/Datei angeben.</p> </blockquote> <p>Das ist aber nicht besonders sinnvoll, so ein Typ-Mischmasch. Wie gesagt, null steht für nichts. 0 ist nur im Zahlenumfeld eine sinnvolle Größe für "kein".</p> <p>dedlfix.</p> Warum verlangt php hier einen expliziten Stringvergleich? Fri, 25 Sep 15 07:44:13 Z https://forum.selfhtml.org/self/2015/sep/24/warum-verlangt-php-hier-einen-expliziten-stringvergleich/1650853?srt=yes#m1650853 https://forum.selfhtml.org/self/2015/sep/24/warum-verlangt-php-hier-einen-expliziten-stringvergleich/1650853?srt=yes#m1650853 <p>@@Regenbogenjonny</p> <blockquote> <p>Doch, eine 0 erwarte ich ja. Nämlich dann, wenn der User kein Wasserzeichen setzen möchte, kann er eine 0 anstelle eines Pfades/Datei angeben.</p> </blockquote> <p>Warum sollte der Nutzer eine Eingabe machen, wenn er keine Eingabe machen möchte?</p> <p>"0" ist eine Eingabe, ein leergelassenes Eingabefeld ist keine.</p> <p>Oder ein (vor)angewählter Radiobutton „kein Wasserzeichen“. Oder eine nicht angewählte Checkbox „Wasserzeichen“. Wobei in beiden Fällen das Eingabefeld für den Pfad zum Wasserzeichen versteckt werden kann.</p> <p>LLAP </p> <div class="signature">-- <br> Ist diese Antwort <em>anstößig</em>? Dann könnte sie <a href="http://forum.selfhtml.org/self/2015/jun/21/select-felder/1643860#m1643860" rel="noopener noreferrer"><em>nützlich</em></a> sein. </div> Warum verlangt php hier einen expliziten Stringvergleich? Thu, 24 Sep 15 19:39:57 Z https://forum.selfhtml.org/self/2015/sep/24/warum-verlangt-php-hier-einen-expliziten-stringvergleich/1650836?srt=yes#m1650836 https://forum.selfhtml.org/self/2015/sep/24/warum-verlangt-php-hier-einen-expliziten-stringvergleich/1650836?srt=yes#m1650836 <blockquote> <p>Das ist aber nicht besonders sinnvoll, so ein Typ-Mischmasch. Wie gesagt, null steht für nichts. 0 ist nur im Zahlenumfeld eine sinnvolle Größe für "kein".</p> </blockquote> <p>Ok, verändere ich. Danke, Jonny</p> Warum verlangt php hier einen expliziten Stringvergleich? Fri, 25 Sep 15 08:32:24 Z https://forum.selfhtml.org/self/2015/sep/24/warum-verlangt-php-hier-einen-expliziten-stringvergleich/1650858?srt=yes#m1650858 https://forum.selfhtml.org/self/2015/sep/24/warum-verlangt-php-hier-einen-expliziten-stringvergleich/1650858?srt=yes#m1650858 <p>Hi Gunnar,</p> <blockquote> <blockquote> <p>Doch, eine 0 erwarte ich ja. Nämlich dann, wenn der User kein Wasserzeichen setzen möchte, kann er eine 0 anstelle eines Pfades/Datei angeben.</p> </blockquote> <p>Warum sollte der Nutzer eine Eingabe machen, wenn er keine Eingabe machen möchte?</p> <p>"0" ist eine Eingabe, ein leergelassenes Eingabefeld ist keine.</p> <p>Oder ein (vor)angewählter Radiobutton „kein Wasserzeichen“. Oder eine nicht angewählte Checkbox „Wasserzeichen“. Wobei in beiden Fällen das Eingabefeld für den Pfad zum Wasserzeichen versteckt werden kann.</p> </blockquote> <p>Um den Endnutzer geht es ja nicht. Es geht um den Nutzer der Klasse.</p> <p>Jonny</p> <blockquote> <div class="signature">-- <br> > Ist diese Antwort <em>anstößig</em>? Dann könnte sie <a href="http://forum.selfhtml.org/self/2015/jun/21/select-felder/1643860#m1643860" rel="noopener noreferrer"><em>nützlich</em></a> sein. </div> </blockquote> Warum verlangt php hier einen expliziten Stringvergleich? Fri, 25 Sep 15 08:51:46 Z https://forum.selfhtml.org/self/2015/sep/24/warum-verlangt-php-hier-einen-expliziten-stringvergleich/1650865?srt=yes#m1650865 https://forum.selfhtml.org/self/2015/sep/24/warum-verlangt-php-hier-einen-expliziten-stringvergleich/1650865?srt=yes#m1650865 <p>@@Regenbogenjonny</p> <blockquote> <p>Um den Endnutzer geht es ja nicht. Es geht um den Nutzer der Klasse.</p> </blockquote> <p>„Nämlich dann, wenn der User kein Wasserzeichen setzen möchte, kann er eine 0 anstelle eines Pfades/Datei angeben“ las sich anders.</p> <p>Du meinst „Programmierer, der diese Klasse verwendet“? „Nutzer“ ist im Sprachgebrauch so fest mit dem Nutzer der Anwendung verbunden, dass man den Begriff nicht anderweitig verwenden sollte.</p> <p>LLAP </p> <div class="signature">-- <br> Ist diese Antwort <em>anstößig</em>? Dann könnte sie <a href="http://forum.selfhtml.org/self/2015/jun/21/select-felder/1643860#m1643860" rel="noopener noreferrer"><em>nützlich</em></a> sein. </div> Warum verlangt php hier einen expliziten Stringvergleich? Fri, 25 Sep 15 08:54:04 Z https://forum.selfhtml.org/self/2015/sep/24/warum-verlangt-php-hier-einen-expliziten-stringvergleich/1650866?srt=yes#m1650866 https://forum.selfhtml.org/self/2015/sep/24/warum-verlangt-php-hier-einen-expliziten-stringvergleich/1650866?srt=yes#m1650866 <p>Hallo Gunnar,</p> <blockquote> <p>Du meinst „Programmierer, der diese Klasse verwendet“? „Nutzer“ ist im Sprachgebrauch so fest mit dem Nutzer der Anwendung verbunden, dass man den Begriff nicht anderweitig verwenden sollte.</p> </blockquote> <p>In deinem vielleicht. Das ist aber je nach peer group anders. Bei der Entwicklung von System-Diensten meint man damit z.B. oft den Anwendungsentwickler.</p> <p>LG,<br> CK</p> <div class="signature">-- <br> <a href="http://ck.kennt-wayne.de/" rel="nofollow noopener noreferrer">CK kennt Wayne</a> </div>