Rückgabewert der Methode kann nicht im Schreibkontext verwendet werden

Lesezeit: 6 Minuten

Ruckgabewert der Methode kann nicht im Schreibkontext verwendet werden
Extrakun

Ich würde denken, dass das folgende Stück Code funktionieren sollte, aber es funktioniert nicht (Bearbeitet: Funktioniert jetzt in PHP 5.5+):

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

Woher getError() ist einfach:

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

Trotzdem lande ich bei diesem Fehler:

Rückgabewert der Methode kann nicht im Schreibkontext verwendet werden

Was bedeutet das? Ist das nicht nur gelesen?

  • Wahrscheinlich wird es Ihnen in PHP 5.5 erlaubt sein, Ausdrücke an zu übergeben empty: wiki.php.net/rfc/empty_isset_exprs

    – Carlos Campderros

    31. Juli 2012 um 7:44 Uhr

  • Der definitive Leitfaden für PHP isset und leer

    – verzeihen

    31. Juli 2012 um 8:04 Uhr

  • Ok, ich finde die Antwort von porneL auch richtig, das ist mein Code if ( !$e->find('div') ) die prüfen, ob das aktuelle HTML-DOM-Element leer ist oder nicht. Ich verwende es innerhalb der Schleife, um nur ein einzelnes Div ohne inneres Div darin auszudrucken.

    – Salem

    22. Juni 2015 um 18:17 Uhr


1646964248 461 Ruckgabewert der Methode kann nicht im Schreibkontext verwendet werden
Kornel

empty() auf den Wert per Referenz zugreifen muss (um zu prüfen, ob diese Referenz auf etwas Existierendes verweist), 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 es verwenden empty() überhaupt, fälschlicherweise zu glauben, dass “leerer” Wert sich von “falsch” unterscheidet.

Empty ist nur ein Alias ​​für !isset($thing) || !$thing. Wenn das, was Sie überprüfen, immer existiert (in PHP existieren immer Ergebnisse von Funktionsaufrufen), wird die empty() Funktion ist nichts 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 gleich. Dieser Code:

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

und das:

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

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

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

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

ist logisch äquivalent zu:

if ($r->getError())

  • Dies ist eine viel bessere Antwort als die derzeit ausgewählte.

    – SystemParadox

    9. September 2011 um 14:20 Uhr

  • @gcb: nein, das PHP-Handbuch sagt ausdrücklich, dass es identisch ist: “empty() ist das Gegenteil von (boolean) varaußer dass keine Warnung generiert wird, wenn die Variable nicht gesetzt ist.”

    – Körnel

    4. Oktober 2011 um 23:33 Uhr

  • Der Teil, der keine Warnung erzeugt, ist ziemlich wichtig … empty($var) gibt true zurück, wenn es 0, ”, array(), NULL oder nicht einmal definiert ist. Es ist eine gute Übung, besonders damit Sie Ihre protokollieren können Real Warnungen, ohne dass sich die Dateien füllen

    – landons

    15. November 2011 um 14:15 Uhr

  • Ok, tolle Antwort, aber was ist der richtige Weg, um dies zu vermeiden, weiß jemand?

    – Javatar

    20. Januar 2013 um 22:34 Uhr

  • @EugenMihailescu im Allgemeinen ist das in Ordnung, aber es ist nicht unbedingt äquivalent zu empty(), weil "", 0usw. sind “leer”, aber nicht null.

    – Körnel

    11. April 2014 um 11:19 Uhr

Ruckgabewert der Methode kann nicht im Schreibkontext verwendet werden
Peter Bailey

Notiz: Dies ist eine sehr hoch bewertete Antwort mit hoher Sichtbarkeit, aber bitte beachten Sie, dass sie schlechte, unnötige Codierungspraktiken fördert! Siehe die Antwort von @Kornel für den richtigen Weg.

Anmerkung 2: Ich unterstütze die Vorschläge zur Verwendung der Antwort von @ Kornel. Als ich diese Antwort vor drei Jahren schrieb, wollte ich lediglich die Art des Fehlers erklären, nicht unbedingt die Alternative unterstützen. Das folgende Code-Snippet wird nicht empfohlen.


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

Hinweis: empty() überprüft nur Variablen, da alles andere zu einem Parsing-Fehler führt. Mit anderen Worten, Folgendes funktioniert nicht: empty(trim($name)).

Darauf müsstest du umsteigen

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

  • Das ist wahnsinnig kontraproduktiv.

    – David Murdoch

    23. Dezember 2010 um 20:26 Uhr

  • Hinweis: Dasselbe gilt für isset(). dh: isset($this->foo->getBar()) wird zum gleichen Problem führen.

    – catchdave

    24. Juni 2011 um 23:45 Uhr

  • Die Antwort von porneL erklärt dies ausführlicher mit einer besseren Lösung

    – SystemParadox

    9. September 2011 um 14:21 Uhr

  • @SystemParadox – Hängt davon ab, was Sie unter “besser” verstehen. Die Antwort von porneL ist wohl gründlicher mit einer “saubereren” Lösung, erklärt aber auch nicht wirklich den Ursprung des Fehlers.

    – Peter Bailey

    12. September 2011 um 22:22 Uhr

  • Weil es nicht falsch ist, @deceze. Es ist nicht die beste Antwort, Sie werden dort kein Argument von mir bekommen. Ich habe sogar selbst für Pornos gestimmt. Es ist ein sehr alt Antwort, aber es ist nicht falsch. In Bezug auf die hohen Stimmen: Denken Sie daran, dass porneLs fast volle 17 Monate nach diesem hier ankamen.

    – Peter Bailey

    31. Juli 2012 um 20:30 Uhr


Vor PHP 5.5 war die die PHP-Dokumentation pflegte zu sagen:

empty() überprüft nur Variablen, da alles andere zu einem Parsing-Fehler führt

In PHP < 5.5 konnten Sie nicht verwenden empty() direkt auf den Rückgabewert einer Funktion. Stattdessen könnten Sie die Rückgabe von zuweisen getError() in eine Variable und ausführen empty() auf der Variable.

In PHP >= 5.5 ist dies nicht mehr notwendig.

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()

Wie von anderen betont, ist dies eine (seltsame) Einschränkung von empty().

Für die meisten Zwecke ist dies gleichbedeutend mit dem Aufrufen von empty, aber das funktioniert:

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

  • Das ist nicht wahr – empty() umfasst viel mehr Möglichkeiten als nur eine leere Zeichenfolge

    – Stalker

    7. April 2015 um 3:44 Uhr

  • Deshalb heißt es „für die meisten Zwecke“, nicht alle

    – Jani Hartikainen

    7. April 2015 um 6:49 Uhr


1646964249 521 Ruckgabewert der Methode kann nicht im Schreibkontext verwendet werden
Jean-Carlo Bambalan

Das Problem ist, dass Sie wissen möchten, ob der Fehler nicht leer ist.

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

Das Hinzufügen einer Methode isErrorSet() löst das Problem.

public function isErrorSet() {
    if (isset($this->error) && !empty($this->error)) {
        return true;
    } else {
        return false;
    }
}

Jetzt funktioniert dies mit diesem Code ohne Vorankündigung.

if (!($x->isErrorSet())) {
    echo $x->getError();
}

  • Das ist nicht wahr – empty() umfasst viel mehr Möglichkeiten als nur eine leere Zeichenfolge

    – Stalker

    7. April 2015 um 3:44 Uhr

  • Deshalb heißt es „für die meisten Zwecke“, nicht alle

    – Jani Hartikainen

    7. April 2015 um 6:49 Uhr


1646964250 690 Ruckgabewert der Methode kann nicht im Schreibkontext verwendet werden
Mike

Ich bin mir nicht sicher, ob dies ein häufiger Fehler wäre, aber wenn Sie so etwas tun:

$var="value" .= 'value2';

dies wird auch den gleichen Fehler erzeugen

Rückgabewert der Methode kann nicht im Schreibkontext verwendet werden

Du kannst keine haben = und ein .= in derselben Aussage. Sie können das eine oder das andere verwenden, aber nicht beide.

Beachten Sie, dass ich verstehe, dass dies nichts mit dem tatsächlichen Code in der Frage zu tun hat. Diese Frage ist jedoch das oberste Ergebnis bei der Suche nach der Fehlermeldung, daher wollte ich sie der Vollständigkeit halber hier posten.

989570cookie-checkRückgabewert der Methode kann nicht im Schreibkontext verwendet werden

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy