Dziwny błąd PHP: „Nie można użyć zwracanej wartości funkcji w kontekście zapisu”


178

Pojawia się ten błąd i nie mogę zrobić z niego głowy ani ogona.

Dokładny komunikat o błędzie to:

Błąd krytyczny: nie można użyć zwracanej wartości funkcji w kontekście zapisu w /home/curricle/public_html/descarga/index.php w linii 48

Linia 48 to:

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

Co tu się dzieje?

Oto pełna funkcja:

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
Nawiasem mówiąc, $ _POST ('sms_code') powinien być $ _POST ['sms_code'].
davidtbernal

Również klauzula else w instrukcji if nie jest potrzebna. $statenie zostanie zmodyfikowany, nie trzeba go resetować, NOTHING_SUBMITEDjeśli jest to już ta wartość.
Glenn Dayton,

Ludzie przyszłości, czy ktoś może wyjaśnić, co tak naprawdę oznacza wiadomość?
OGHaza

Odpowiedzi:


111

Masz na myśli

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

chociaż nawiasem mówiąc, naprawdę masz na myśli

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

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

Znalazłem również rozwiązanie problemu, z którym miałem do czynienia, więc FYI - dotyczy to również $ _REQUEST (parametry w adresie URL strony).
TheCuBeMan

5
Zdaję sobie sprawę, że jestem bardzo spóźniony, ale zależy to również od wersji PHP, prawda? Jestem pewien, że jest to legalne w późniejszych wersjach PHP, takich jak 5.6, ale myślę, że tak nie jest w 5.3
UnsettlingTrend

490

Dzieje się tak również w przypadku używania pustego przy zwrocie funkcji:

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

ponieważ pusty nie jest funkcją, ale konstrukcją języka (nie jestem pewien) i przyjmuje tylko zmienne:

Dobrze:

empty($someVar)

Źle:

empty(someFunc())

Od PHP 5.5 obsługuje więcej niż zmienne. Ale jeśli potrzebujesz go przed 5.5, użyj trim($name) == false. Z pustej dokumentacji .


Dang, właśnie dostałem ten błąd, podając dokładny przykład (wykończenie wewnątrz puste). Dzięki x3. Co za dziwny błąd .. Nadal nie do końca rozumiem: / empty () może pobrać ciąg .. a trim () zwraca ciąg .. więc wth?
Nick Rolando

15
@Shredder - To dlatego, że empty()tak naprawdę nie jest funkcją; to konstrukcja językowa echo. Parser PHP obsługuje konstrukcje językowe inaczej. W przypadku emptypatrzy na parametr jako zmienną, a nie na coś do oceny, więc jeśli spróbujesz przekazać funkcję, psuje się. Przynajmniej tak to rozumiem. Więcej informacji tutaj i tutaj .
przyznają

1
To jest dokładnie ten błąd, na który wpadłem. Dlaczego nie jest to najlepsza odpowiedź !?
Adam F

2
Mój kolega dostał ten błąd, a ja nie. Nastąpiło zamieszanie, dopóki nie sprawdziłem dokumentów - od PHP 5.5, empty () zaakceptuje zwrot zarówno z funkcji, jak i zmiennej. us3.php.net/empty
James Alday

1
Horray za 5.5! Do czasu aktualizacji możesz wrzucić coś takiego do swojej głównej funkcji zawierającej plik:function mTEE($val){ return empty($val); }
TecBrat

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

zmień ten wiersz na

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

Używasz nawiasów (), $_POSTale chcesz nawiasów kwadratowych []

:)

LUB

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

1
Nie, nie możesz napisać „if (isset ($ _ POST ['sms_code'] == TRUE) {”, brakuje „”).
middus

1
+ kilka miliardów fajnych punktów dla wyrażenia „używasz nawiasów ... ale chciałeś nawiasów kwadratowych”, a moim problemem (który doprowadził mnie do tego pytania) był
Kevin Horn

1
Uff, stary! Teraz, jeśli parser powie „Spodziewałem się nawiasów kwadratowych po nazwie zmiennej tablicowej, duh!”, Zabrzmiałoby to znacznie fajniej niż „Nie można użyć wartości zwracanej przez funkcję w kontekście zapisu”. Mogę to przesłać do facetów PHP jako sugestię.
Joe Völker,

13

dla WORDPRESS :

zamiast:

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

Powinien być:

if (!get_option('smth'))

11

Prawidłowa składnia (na końcu brakowało nawiasów):

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

ps nie potrzebujesz == TRUE części, ponieważ BOOLEAN (prawda / fałsz) jest już zwracany.


4

Może się to zdarzyć w więcej niż jednym scenariuszu, poniżej znajduje się lista dobrze znanych scenariuszy:

// 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

// używając nawiasu, aby uzyskać dostęp do elementu tablicy, nawiasy są używane do wywoływania funkcji

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

Można to również uruchomić, gdy próbujemy zwiększyć wynik funkcji takiej jak poniżej:

$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.

Czy chcesz dostać błędy? Ponieważ w ten sposób dostajesz błędy. Nie, ale poważnie, nigdy tego nie rób. To jak robienie if(i++), może wyglądać krócej niż zwiększanie licznika, a następnie ocena jego wartości, ale spowoduje bóle głowy, jeśli kiedykolwiek się zepsuje. Edycja: Nie sugeruję, że to robisz, po prostu wskazując go nowym programistom czytającym odpowiedź i myślącym, że to fajna rzecz, zwiększać wartości podczas obliczania lub oceny tego, co jest zwiększane.
Victor D.

@VictorD. Mówię tylko, że w tej sytuacji może wystąpić błąd, co oznacza, że ​​nie warto tego robić.
Mehdi Karamosly

Czy mogę zasugerować jeszcze jedną? Robisz =zamiast ==w instrukcji if.
Josiah

Dla mnie była to wersja PHP, aktualizacja do 7.0 :)
nodws

3

Problem polega na tym, ()że musisz iść[]

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

przez

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

3

Miałem również podobny problem jak twój. Problem polega na tym, że używasz starej wersji php. Uaktualniłem do PHP 5.6 i problem już nie istnieje.


1

Kolejny scenariusz, w którym ten błąd jest wywoływany z powodu błędu składniowego:

ucwords($variable) = $string;

1
Jest tak, ponieważ ucwordszwraca łańcuch, a kontekst wywołania jest niepoprawny, jeśli spróbujesz na przykład za pomocą $Test = ''; ${ucwords('test')} = 'String new !'; echo $Test;, to pokaże ci nową przypisaną wartość.
kip

0

napotkałem również ten problem z powodu błędu składniowego. Używanie „(” zamiast „[” w indeksie tablic:

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

0

Ten błąd ma rację i podkreśla problem składni kontekstowej. Można go odtworzyć, wykonując dowolną składnię „nieprzypisywalną”. Na przykład:

funkcja Składnia ($ hello) {...., a następnie spróbuj wywołać funkcję jak właściwość i przypisz wartość .... $ this-> Składnia ('Hello') = 'World';

Powyższy błąd zostanie zgłoszony, ponieważ składnia jest niepoprawna. Właściwe przypisanie „Świata” nie może być zapisane w kontekście, który wykorzystałeś (tj. Niepoprawnie składniowo w tym kontekście). „Nie można użyć wartości zwracanej przez funkcję” lub może on odczytać „Nie można przypisać funkcji po prawej stronie, ponieważ jest ona tylko do odczytu”

Konkretny błąd w kodzie OP jest podświetlony, przy użyciu nawiasów zamiast nawiasów kwadratowych.


-1

Może być spowodowany niewłaściwym operatorem, =, kiedy powinno być ==

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

Ten kod zgłasza ten błąd

Zauważ, że = jest operatorem przypisania, a nie operatorem porównania. Naprawieniem jest zmiana = na ==.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.