9 Stimmen

Identitätsbedingung "===" , Leistung und Konvertierung

Ich habe aus den Stackoverflow-Antworten und jeder Lektüre, die ich gemacht habe, immer mitgenommen, dass "===" ist besser als "==" weil ein strengerer Vergleich verwendet wird und Sie keine Ressourcen für die Konvertierung von Werttypen verschwenden, um auf eine Übereinstimmung zu prüfen.

Vielleicht gehe ich von einer falschen Annahme aus, daher nehme ich an, dass ein Teil dieser Frage lautet: "Stimmt meine Annahme?"

Zweitens,

Ich habe es speziell mit einer Situation zu tun, in der ich Daten aus einer Datenbank in Form einer Zeichenfolge abrufe "100" .

Der Code, den ich vergleiche, ist dieser...

    if ($this->the_user->group == 100) //admin
    {
        Response::redirect('admin/home');
    }
    else   // other
    {
        Response::redirect('user/home');
    }

vs.

    if ( (int) $this->the_user->group === 100) //admin
    {
        Response::redirect('admin/home');
    }
    else   // other
    {
        Response::redirect('user/home');
    }

oder sogar

    if (intval($this->the_user->group) === 100) //admin
    {
        Response::redirect('admin/home');
    }
    else   // other
    {
        Response::redirect('user/home');
    }

ist die Integrität (oder Leistung), die durch manuelles Casting oder Konvertierung gewonnen wird, nur damit Sie die Identität ( '===' ) Vergleich?

13voto

NikiC Punkte 98746

In Ihrem speziellen Fall == ist die bessere Option. Wie Sie (wie in Ihrem Code zu sehen ist) wahrscheinlich schon herausgefunden haben, geben viele Datenbankfunktionen immer Strings zurück, auch wenn Sie eine ganze Zahl abrufen. So Typ strengen Vergleich wirklich nur bläht Ihren Code.

Außerdem stellen Sie ein potenzielles (nennen wir es theoretisches) Sicherheitsrisiko dar. z.B. (int) '100AB2' würde ergeben 100 . In Ihrem Fall kann das wahrscheinlich nicht passieren, aber in anderen Fällen schon.

Also: Übertreiben Sie es nicht mit dem strengen Vergleich, er ist nicht immer gut. Man braucht ihn hauptsächlich nur in zweideutigen Fällen, wie dem Rückgabewert von strpos .

4voto

Tomek Punkte 41

Es gibt einen Leistungsunterschied zwischen == y === - Letzteres wird sogar doppelt so schnell sein, siehe Gleicher vs. identischer Vergleichsoperator . Der Unterschied ist jedoch zu gering, um sich damit zu befassen - es sei denn, der Code wird millionenfach ausgeführt.

3voto

JohnP Punkte 48581

Das ist eine wirklich kleine Optimierung, die Sie da vornehmen. Ich persönlich denke nicht, dass es das wirklich wert ist.

Jede Steigerung, die Sie dadurch erhalten, dass Sie den Wert nicht werfen, wenn Sie === geht verloren, wenn Sie den Wert explizit casten. In Ihrem Fall, da der Typ für Sie nicht wichtig ist, sollten Sie einfach == und damit fertig werden.

Meine Empfehlung wäre es, die === für den Fall, dass Sie auch den Typ überprüfen müssen - z. B. 0, der zu false ausgewertet wird, usw.

3voto

Marc B Punkte 347897

Jegliche Leistungssteigerung wird mikroskopisch klein sein, es sei denn, Sie führen buchstäblich Milliarden und Billionen dieser Vergleiche über Tage/Monate/Jahre hinweg durch. Der strenge Vergleich hat seinen Nutzen, aber er ist auch eine Art Anomalie in PHP. PHP ist eine schwach typisierte Sprache und tut (normalerweise) das Richtige, wenn es darum geht, Werte automatisch zu konvertieren/zu kodieren, um das Richtige zu tun. Meistens ist es nicht notwendig, einen strengen Vergleich durchzuführen, da PHP das Richtige tut.

Es gibt jedoch Fälle, wie z. B. bei der Verwendung von strpos , wo die automatische Konvertierung fehlschlägt. strpos gibt '0' zurück, wenn die gesuchte Nadel ganz am Anfang des Heuhaufens liegt, was als FALSE behandelt würde, was falsch ist. Die einzige Möglichkeit, damit umzugehen, ist der strenge Vergleich.

3voto

Semra Punkte 2547

PHP hat einige WTF lose Vergleiche, die TRUE zurückgeben wie:

array() == NULL

0 == 'Non-numeric string'

Stets strikter Vergleich zwischen einer Variablen und einer Zeichenkette verwenden

$var === 'string'

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X