In PHP wird die StrPOS -Funktion verwendet, um zu finden, wo eine Zeichenfolge zuerst in einer anderen Zeichenfolge erscheint. Wenn in der Zielzeichenfolge kein angegebenes Substring gefunden wird, gibt Strpos false zurück. Da False jedoch in PHP als "falscher Wert" angesehen wird, kann dies bei einigen Programmierern Verwirrung verursachen, wenn es sich um Rückgabewerte handelt, insbesondere wenn der Rückgabewert mit 0 (der Ausgangsposition der Zeichenfolge) verwechselt wird. In diesem Artikel wird gründlich analysiert, warum STRPOS false zurückgibt, Fallen verwendet und wie man diese Situationen effektiv umgeht.
Der Prototyp der STRPOS -Funktion lautet wie folgt:
<span><span><span class="hljs-title function_ invoke__">strpos</span></span><span>(</span><span><span class="hljs-keyword">string</span></span><span> </span><span><span class="hljs-variable">$haystack</span></span><span>, </span><span><span class="hljs-keyword">string</span></span><span> </span><span><span class="hljs-variable">$needle</span></span><span>, </span><span><span class="hljs-keyword">int</span></span><span> </span><span><span class="hljs-variable">$offset</span></span><span> = </span><span><span class="hljs-number">0</span></span><span>): </span><span><span class="hljs-keyword">int</span></span><span>|</span><span><span class="hljs-literal">false</span></span><span>
</span></span>
$ haystack : Die String, nach der gesucht wird.
$ nadel : Das zu findene Substring.
$ offset : Optionaler Startversetz, angeben, wo mit der Suche begonnen werden soll.
Wenn $ nadle in $ haystack existiert, gibt Strpos den Ort zurück, an dem $ nadle zuerst erscheint (der Index beginnt bei 0). Wenn $ Nadel nicht gefunden wird, wird False zurückgegeben.
In PHP wird FALSE als "falscher Wert" behandelt. In einem booleschen Kontext wird False als falsch behandelt und jeder andere Wert ungleich Null als wahr behandelt. Das Problem ist, dass Strpos false oder 0 zurückgeben können. Da 0 im PHP ein falscher Wert ist, wird dies beim Vergleich von Programmierern Verwirrung verursachen.
Beispielsweise kann der folgende Code einen Fehler erzeugen:
<span><span><span class="hljs-variable">$haystack</span></span><span> = </span><span><span class="hljs-string">"Hello, world!"</span></span><span>;
</span><span><span class="hljs-variable">$needle</span></span><span> = </span><span><span class="hljs-string">"Hello"</span></span><span>;
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">strpos</span></span><span>(</span><span><span class="hljs-variable">$haystack</span></span><span>, </span><span><span class="hljs-variable">$needle</span></span><span>)) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Found!"</span></span><span>;
} </span><span><span class="hljs-keyword">else</span></span><span> {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Not found!"</span></span><span>;
}
</span></span>
Wenn die Startposition von $ nadle in $ haystack 0 beträgt (dh zu Beginn der Zeichenfolge), gibt Strpos 0 zurück, und wenn das Urteil 0 als falsch behandelt wird, glauben Sie fälschlicherweise, dass das Substring nicht gefunden wurde und so "nicht gefunden" ausgibt! .
Um dieses Problem zu vermeiden, sollte ein strenger Vergleichsoperator ( === ) verwendet werden, da der Vergleich von === nicht nur der Wert, sondern auch der Typ ist. In diesem Fall wird das Substring nicht nur gefunden, wenn der Rückgabewert falsch gleich ist:
<span><span><span class="hljs-variable">$haystack</span></span><span> = </span><span><span class="hljs-string">"Hello, world!"</span></span><span>;
</span><span><span class="hljs-variable">$needle</span></span><span> = </span><span><span class="hljs-string">"Hello"</span></span><span>;
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">strpos</span></span><span>(</span><span><span class="hljs-variable">$haystack</span></span><span>, </span><span><span class="hljs-variable">$needle</span></span><span>) !== </span><span><span class="hljs-literal">false</span></span><span>) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Found!"</span></span><span>;
} </span><span><span class="hljs-keyword">else</span></span><span> {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Not found!"</span></span><span>;
}
</span></span>
Dieser Ansatz vermeidet die Situation, in der 0 mit falschem Missständen verwechselt wird. Der Code kann ihn korrekt verarbeiten, unabhängig davon, ob der Ort, an dem $ Nadel erscheint, der Beginn der Zeichenfolge (d. H. Der Index ist 0 ) oder die Mitte.
Es gibt mehrere Situationen, die dazu führen, dass Strpos falsch zurückgegeben werden:
Das Substring existiert nicht : Der häufigste Fall ist, dass die Substring $ -Nadel in der Zielzeichenfolge $ haystack überhaupt nicht erscheint.
Ungültige Typeingabe : Strpos kann False zurückgeben, wenn der eingehende Parametertyp falsch ist (z. B. $ Haystack ist keine Zeichenfolge).
Der Offset ist zu groß : Wenn ein Offset eingestellt ist, was dazu führt, dass $ nadel nicht in den verbleibenden Saiten zu finden ist, gibt Strpos auch false zurück.
Um nicht in Missverständnissen festzuhalten, finden Sie hier einige Best Practices für die Verwendung von Strpos :
Verwenden Sie immer einen strengen Vergleich ( === ) : Vermeiden Sie, wie bereits erwähnt, die Verwendung von losen Vergleichsoperatoren ( == ), da es 0 und falsch verwirren.
Überprüfen Sie den Parametertyp : Stellen Sie sicher, dass $ Haystack und $ nadle beide String -Typen sind. Wenn Sie sich nicht sicher sind, können Sie die Funktion is_string () verwenden, um zu überprüfen.
Verständnis von Offsets : Wenn Sie Offsets verwenden, müssen Sie die Auswirkungen von Offsets verdeutlichen und vermeiden, zu große Werte einzustellen, was dazu führen kann, dass Substring -Suchvorgänge fehlschlagen.
Der Rückgabewert der STRPOS -Funktion kann 0 oder falsch sein, und die beiden haben unterschiedliche booleale Semantik in PHP. Um zu vermeiden, dass Programmfehler, die dadurch verursacht werden, dass 0 als falsch behandelt wird, als falsch behandelt wird, muss immer ein strenger Typvergleich ( ! == Falsch ) verwendet werden, um festzustellen, ob ein Substring gefunden wurde. Das Verständnis der Funktionsweise von STRPOs und wie er mit seinen Rückgabewerten ordnungsgemäß umgeht, ist der Schlüssel zur Vermeidung potenzieller Fehler und zum Schreiben von robuster Code.