Seltsamer PHP-Fehler: 'Funktionsrückgabewert kann im Schreibkontext nicht verwendet werden'


178

Ich erhalte diesen Fehler und kann weder Kopf noch Schwanz daraus machen.

Die genaue Fehlermeldung lautet:

Schwerwiegender Fehler: Der Funktionsrückgabewert kann im Schreibkontext in /home/curricle/public_html/descarga/index.php in Zeile 48 nicht verwendet werden

Zeile 48 lautet:

if (isset($_POST('sms_code') == TRUE ) {

Was könnte hier los sein?

Hier ist die volle Funktion:

function validate_sms_code() {

    $state = NOTHING_SUBMITED;

    if (isset($_POST('sms_code') == TRUE ) {
        $sms_code = clean_up($_POST('sms_code'));
        $return_code = get_sepomo_code($sms_code);

        switch($return_code) {

          case 1:
            //no error
            $state = CORRECT_CODE;
            break;

          case 2:
            // code already used
            $state = CODE_ALREADY_USED;
            break;

          case 3:
            // wrong code
            $state = WRONG_CODE;
            break;

          case 4:
            // generic error
            $state = UNKNOWN_SEPOMO_CODE;
            break;

          default:
            // unknown error
            $state = UNKNOWN_SEPOMO_CODE;
            throw new Exception('Unknown sepomo code: ' . $return_code);
            break;
        }

    } else {
        $state = NOTHING_SUBMITED;
    }
    dispatch_on_state($state);
}

22
$ _POST ('sms_code') sollte übrigens $ _POST ['sms_code'] sein.
Davidtbernal

Außerdem wird die else-Klausel in der if-Anweisung nicht benötigt. $statewird nicht geändert, es muss nicht zurückgesetzt werden, NOTHING_SUBMITEDwenn es bereits dieser Wert ist.
Glenn Dayton

Menschen der Zukunft, kann jemand erklären, was die Botschaft tatsächlich bedeutet?
OGHaza

Antworten:


111

Was meinen Sie

if (isset($_POST['sms_code']) == TRUE ) {

obwohl du übrigens wirklich meinst

if (isset($_POST['sms_code'])) {

3
... oder if (isset($_POST['sms_code']) === TRUE ) {:-)
KeyboardSmasher

Ich habe auch die Lösung für das Problem gefunden, mit dem ich konfrontiert war, also zu Ihrer Information - dies gilt auch für $ _REQUEST (Parameter in der URL der Seite).
TheCuBeMan

5
Mir ist klar, dass ich sehr spät dran bin, aber es hängt auch von der PHP-Version ab, oder? Ich bin mir ziemlich sicher, dass dies in späteren PHP-Versionen wie 5.6 legal ist, aber ich denke, dass dies in 5.3
UnsettlingTrend

490

Dies geschieht auch, wenn bei einer Funktionsrückgabe leer verwendet wird:

!empty(trim($someText)) and doSomething()

weil leer keine Funktion, sondern ein Sprachkonstrukt ist (nicht sicher) und nur Variablen benötigt:

Richtig:

empty($someVar)

Falsch:

empty(someFunc())

Seit PHP 5.5 werden mehr als nur Variablen unterstützt. Wenn Sie es jedoch vor 5.5 benötigen, verwenden Sie trim($name) == false. Aus leerer Dokumentation .


Dang, ich habe gerade auch diesen Fehler bekommen, als ich dein genaues Beispiel gemacht habe (innen leer schneiden). Danke x3. Was für ein seltsamer Fehler. Ich verstehe immer noch nicht ganz: / empty () kann eine Zeichenfolge aufnehmen. Trim () gibt eine Zeichenfolge zurück. Also wth?
Nick Rolando

15
@Shredder - Es ist, weil empty()es eigentlich keine Funktion ist; Es ist ein Sprachkonstrukt wie echo. Der PHP-Parser behandelt Sprachkonstrukte unterschiedlich. Im Fall von emptywird der Parameter als eine Variable betrachtet, die nicht ausgewertet werden muss. Wenn Sie also versuchen, eine Funktion zu übergeben, wird sie unterbrochen. Zumindest verstehe ich das so. Mehr Infos hier und hier .
gewähren

1
Dies ist genau der Fehler, auf den ich ebenfalls gestoßen bin. Warum ist das nicht die beste Antwort?
Adam F

2
Mein Kollege hat diesen Fehler erhalten, während ich es nicht war. Es kam zu Verwirrung, bis ich die Dokumente überprüft habe - ab PHP 5.5 akzeptiert empty () die Rückgabe einer Funktion sowie einer Variablen. us3.php.net/empty
James Alday

1
Horray für 5.5! Bis Sie aktualisieren, könnten Sie so etwas in Ihre Hauptfunktions-Include-Datei werfen:function mTEE($val){ return empty($val); }
TecBrat

22
if (isset($_POST('sms_code') == TRUE ) {

Ändern Sie diese Zeile in

if (isset($_POST['sms_code']) == TRUE ) {

Sie verwenden parentheseis () für, $_POSTaber Sie wollten eckige Klammern []

:) :)

ODER

if (isset($_POST['sms_code']) && $_POST['sms_code']) { 
//this lets in this block only if $_POST['sms_code'] has some value 

1
Nein, Sie können nicht "if (isset ($ _ POST ['sms_code'] == TRUE) {" schreiben, es fehlt ein ")".
Middus

1
+ mehrere Milliarden coole Punkte für die Phrae "Sie verwenden Klammern ... aber Sie wollten eckige Klammern", was mein Problem war (das mich zu dieser Frage führte)
Kevin Horn

1
Puh, danke Mann! Wenn der Parser nun sagen würde "Ich habe eckige Klammern nach dem Namen einer Arrayvariablen erwartet, duh!", Klingt dies viel cooler als "Kann den Funktionsrückgabewert im Schreibkontext nicht verwenden." Ich könnte das den PHP-Leuten als Vorschlag vorlegen.
Joe Völker

13

für WORDPRESS :

anstatt:

if (empty(get_option('smth')))

sollte sein:

if (!get_option('smth'))

11

Richtige Syntax (am Ende fehlten Klammern):

if (isset($_POST['sms_code']) == TRUE ) {
                            ^

ps du brauchst keinen == TRUE teil, da BOOLEAN (true / false) bereits zurückgegeben wird.


4

Dies kann in mehr als einem Szenario vorkommen. Nachfolgend finden Sie eine Liste bekannter Szenarien:

// calling empty on a function 
empty(myFunction($myVariable)); // the return value of myFunction should be saved into a variable
// then you can use empty on your variable

// Verwenden von Klammern für den Zugriff auf ein Element eines Arrays. Klammern werden zum Aufrufen einer Funktion verwendet

if (isset($_POST('sms_code') == TRUE ) { ...
// that should be if(isset($_POST['sms_code']) == TRUE)

Dies könnte auch ausgelöst werden, wenn wir versuchen, das Ergebnis einer Funktion wie folgt zu erhöhen:

$myCounter = '356';

$myCounter = intVal($myCounter)++; // we try to increment the result of the intVal...
// like the first case, the ++ needs to be called on a variable, a variable should hold the the return of the function then we can call ++ operator on it.

Möchten Sie Fehler bekommen? Denn so bekommt man Fehler. Nein, aber im Ernst, tu das niemals. Es ist wie zu tun if(i++), kann es aussehen kürzer als der Zähler erhöht wird und dann seinen Wert bewerten, aber es wird Sie Kopfschmerzen , wenn es jemals Fehler verursachen aus. Bearbeiten: Ich impliziere nicht, dass Sie es tun, sondern nur neue Programmierer darauf hinweisen, die die Antwort lesen und denken, dass dies eine nette Sache ist, um Werte zu erhöhen, während Sie das berechnen oder bewerten, was erhöht wird.
Victor D.

@ VictorD. Ich sage nur, dass in dieser Situation ein Fehler auftreten kann, was bedeutet, dass es nicht gut ist, dies zu tun.
Mehdi Karamosly

Kann ich noch einen vorschlagen? Sie tun dies =anstelle ==einer if-Anweisung.
Josiah

Für mich war es PHP-Version, Upgrade auf 7.0 :)
Nodws

3

Das Problem ist, dass ()Sie gehen müssen[]

if (isset($_POST('sms_code') == TRUE)

durch

if (isset($_POST['sms_code'] == TRUE)

3

Ich hatte auch ein ähnliches Problem wie deins. Das Problem ist, dass Sie eine alte PHP-Version verwenden. Ich habe ein Upgrade auf PHP 5.6 durchgeführt und das Problem besteht nicht mehr.


1

Ein weiteres Szenario, in dem dieser Fehler aufgrund eines Syntaxfehlers ausgelöst wird:

ucwords($variable) = $string;

1
Liegt daran, ucwordsdass eine Zeichenfolge zurückgegeben wird und der Kontext des Aufrufs falsch ist. Wenn Sie beispielsweise versuchen, mit $Test = ''; ${ucwords('test')} = 'String new !'; echo $Test;, zeigen Sie den neuen zugewiesenen Wert an.
Kip

0

Ich bin auch auf dieses Problem aufgrund eines Syntaxfehlers gestoßen. Verwenden von "(" anstelle von "[" im Array-Index:

   foreach($arr_parameters as $arr_key=>$arr_value) {
        $arr_named_parameters(":$arr_key") = $arr_value;
    }

0

Dieser Fehler ist völlig richtig und weist auf ein Problem mit der Kontextsyntax hin. Kann reproduziert werden, indem eine beliebige "nicht zuweisbare" Syntax ausgeführt wird. Zum Beispiel:

Funktion Syntax ($ hello) {.... dann versuchen Sie, die Funktion wie eine Eigenschaft aufzurufen und einen Wert zuzuweisen .... $ this-> Syntax ('Hello') = 'World';

Der obige Fehler wird ausgelöst, da die Anweisung syntaktisch falsch ist. Die richtige Zuordnung von 'Welt' kann nicht in dem von Ihnen verwendeten Kontext geschrieben werden (dh für diesen Kontext syntaktisch falsch). 'Funktionsrückgabewert kann nicht verwendet werden' oder es könnte lauten: 'Der Funktion kann der rechte Wert nicht zugewiesen werden, da er schreibgeschützt ist.'

Der spezifische Fehler im OP-Code wird hervorgehoben, wobei Klammern anstelle von eckigen Klammern verwendet werden.


-1

Kann durch einen falschen Operator verursacht werden, =, wenn es == sein sollte

if(mysql_num_rows($result) = 1)
    return $result;
else
    return false;

Dieser Code löst diesen Fehler aus

Beachten Sie, dass = Zuweisungsoperator und kein Vergleichsoperator ist. Fix ist zu ändern = zu ==.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.