472 Stimmen

Rückgabewert einer Methode kann nicht im Schreibkontext verwendet werden

Ich würde denken, dass der folgende Code funktionieren sollte, aber das tut er nicht (Bearbeitet: Funktioniert jetzt in PHP 5.5+) :

if (!empty($r->getError()))

Donde getError() ist einfach:

public function getError()
{
    return $this->error;
}

Dennoch erhalte ich diese Fehlermeldung:

kann den Rückgabewert einer Methode nicht im Schreibkontext verwenden

Was soll das bedeuten? Ist das nicht nur eine Lektüre?

781voto

Kornel Punkte 94135

empty() muss auf den Wert per Referenz zugreifen (um zu prüfen, ob diese Referenz auf etwas Existierendes zeigt), und PHP vor 5.5 unterstützte keine Referenzen auf temporäre Werte, die von Funktionen zurückgegeben wurden.

Das eigentliche Problem, das Sie haben, ist jedoch, dass Sie empty() Sie glauben fälschlicherweise, dass der Wert "leer" etwas anderes ist als "falsch".

Empty ist nur ein Alias für !isset($thing) || !$thing . Wenn die Sache, die Sie überprüfen, immer existiert (in PHP existieren die Ergebnisse von Funktionsaufrufen immer), ist die empty() Funktion ist nichts anderes als ein Negationsoperator .

PHP hat kein Konzept der Leere . Werte, die als falsch ausgewertet werden, sind leer, Werte, die als wahr ausgewertet werden, sind nicht-leer. Das ist das Gleiche. Dieser Code:

$x = something();
if (empty($x)) …

und dies:

$x = something();
if (!$x) …

hat immer das gleiche Ergebnis, in allen Fällen, für alle Datentypen (weil $x ist definiert empty() ist überflüssig).

Der Rückgabewert der Methode ist immer vorhanden (auch wenn Sie nicht über return Anweisung, Rückgabewert existiert und enthält null ). Deshalb:

if (!empty($r->getError()))

ist logisch äquivalent zu:

if ($r->getError())

331voto

Peter Bailey Punkte 103278

Nota: Dies ist eine sehr hoch bewertete Antwort mit einer hohen Sichtbarkeit, aber bitte beachten Sie, dass sie schlechte, unnötige Kodierungspraktiken fördert! Siehe @Kornel's Antwort für den richtigen Weg.

Anmerkung #2: Ich schließe mich den Vorschlägen zur Verwendung von @Kornel's Antwort . Als ich diese Antwort vor drei Jahren schrieb, wollte ich lediglich die Art des Fehlers erklären, nicht unbedingt die Alternative befürworten. Der nachstehende Codeschnipsel wird nicht empfohlen.


Es ist eine Einschränkung der leer() in PHP-Versionen unter 5.5.

Anmerkung: empty() prüft nur Variablen als alles andere führt zu einem Parse Fehler führt. Mit anderen Worten, die folgende wird nicht funktionieren: empty(trim($name)).

Sie müssten dies ändern

// Not recommended, just illustrates the issue
$err = $r->getError();
if (!empty($err))

38voto

George Claghorn Punkte 25699

Vor PHP 5.5 wurde die die PHP-Dokumente pflegte zu sagen:

empty() prüft nur Variablen, alles andere führt zu einem Parse-Fehler

In PHP < 5.5 war es nicht möglich, die Funktion empty() direkt auf den Rückgabewert einer Funktion. Stattdessen können Sie den Rückgabewert von getError() in eine Variable und führen Sie empty() auf die Variable.

In PHP >= 5.5 ist dies nicht mehr notwendig.

19voto

Luke P M Punkte 558

Normalerweise erstelle ich eine globale Funktion namens is_empty(), nur um dieses Problem zu umgehen

function is_empty($var)
{ 
 return empty($var);
}

Dann verwende ich überall dort, wo ich normalerweise empty() verwendet hätte, einfach is_empty()

4voto

Jani Hartikainen Punkte 41573

Wie bereits von anderen erwähnt, ist dies eine (merkwürdige) Einschränkung von empty().

Für die meisten Geldbörsen ist dies gleichbedeutend mit einem Leerruf, aber es funktioniert:

if ($r->getError() != '')

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