Странная ошибка PHP: «Невозможно использовать возвращаемое значение функции в контексте записи»


178

Я получаю эту ошибку, и я не могу сделать ни голову, ни хвост.

Точное сообщение об ошибке:

Неустранимая ошибка: невозможно использовать возвращаемое значение функции в контексте записи в /home/curricle/public_html/descarga/index.php в строке 48

Строка 48:

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

Что здесь может происходить?

Вот полная функция:

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') должно быть $ _POST ['sms_code'].
davidtbernal

Кроме того, предложение else в операторе if не требуется. $stateне будет изменено, нет необходимости сбрасывать его, NOTHING_SUBMITEDесли это уже то значение.
Гленн Дейтон

Люди будущего, кто-нибудь может объяснить, что на самом деле означает сообщение?
О.Г.Хаза

Ответы:


111

Ты имеешь в виду

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

хотя кстати ты действительно имеешь ввиду

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

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

Я также нашел решение проблемы, с которой столкнулся, так что, к вашему сведению, это касается и $ _REQUEST (параметры в URL страницы).
TheCuBeMan

5
Я понимаю, что опоздал, но это также зависит от версии PHP, верно? Я уверен, что это допустимо в более поздних версиях PHP, таких как 5.6, но я думаю, что это не так в 5.3
UnsettlingTrend

490

Это также происходит при использовании empty в функции return:

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

потому что empty - это не функция, а языковая конструкция (не уверен), и она принимает только переменные:

Правильно:

empty($someVar)

Неправильно:

empty(someFunc())

Начиная с PHP 5.5, он поддерживает больше, чем переменные. Но если вам нужно до 5.5, используйте trim($name) == false. Из пустой документации .


Черт, я только что получил эту ошибку, делая ваш точный пример (обрезать внутри пусто). Спасибо х3. Что за странная ошибка ... Я до сих пор не до конца понимаю: / empty () может взять строку ... а trim () возвращает строку ... так что?
Ник Роландо

15
@Shredder - Это потому, что на empty()самом деле это не функция; это языковая конструкция, как echo. Парсер PHP обрабатывает языковые конструкции по-разному. В случае empty, он смотрит на параметр как на переменную, а не на то, что нужно оценивать, поэтому, если вы попытаетесь передать функцию, она сломается. По крайней мере, это мое понимание этого. Больше информации здесь и здесь .
Грант

1
Это именно та ошибка, с которой я столкнулся. Почему это не лучший ответ !?
Адам Ф

2
Мой коллега получал эту ошибку, а я нет. Путаница продолжалась, пока я не проверил документы - начиная с PHP 5.5, empty () будет принимать возврат как функции, так и переменной. us3.php.net/empty
Джеймс Олдей

1
Ура за 5.5! До тех пор, пока вы не обновитесь, вы можете добавить что-то подобное в основной файл включения функции:function mTEE($val){ return empty($val); }
TecBrat

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

изменить эту строку на

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

Вы используете круглые скобки () для, $_POSTно вы хотели квадратные скобки []

:)

ИЛИ

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

1
Нет, вы не можете написать "if (isset ($ _ POST ['sms_code'] == TRUE) {", отсутствует ")".
середина

1
+ несколько миллиардов интересных моментов для фразы «вы используете круглые скобки ... но вы хотели квадратные скобки», в чем заключалась моя проблема (которая привела меня к этому вопросу)
Кевин Хорн,

1
Фу, спасибо мужчина! Теперь, если синтаксический анализатор скажет: «Я ожидал квадратных скобок после имени переменной массива, дух!», Это звучало бы намного круче, чем «Невозможно использовать возвращаемое значение функции в контексте записи». Я мог бы представить это парням PHP как предложение.
Джо Фёлькер

13

для WORDPRESS :

вместо того:

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

должно быть:

if (!get_option('smth'))

11

Правильный синтаксис (в конце у вас не было скобок):

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

ps вам не нужна == TRUE часть, потому что BOOLEAN (true / false) уже возвращается.


4

Это может произойти в более чем одном сценарии, ниже приведен список хорошо известных сценариев:

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

// используя круглые скобки для доступа к элементу массива, круглые скобки используются для вызова функции

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

Это также может быть вызвано, когда мы пытаемся увеличить результат функции, как показано ниже:

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

Вы хотите получать ошибки? Потому что именно так вы получаете ошибки. Нет, но серьезно, никогда не делай этого. Это все равно что делать if(i++), это может выглядеть короче, чем увеличивать счетчик и затем оценивать его значение, но это вызовет у вас головную боль, если он когда-нибудь выйдет из строя. Редактировать: Я не имею в виду, что вы делаете это, просто указываю на это новым программистам, читающим ответ и думающим, что это изящная вещь, чтобы увеличивать значения при вычислении или оценке того, что увеличивается.
Виктор Д.

@VictorD. Я просто говорю, что в такой ситуации может произойти ошибка, а это значит, что делать это нехорошо.
Мехди Карамосли,

Могу ли я предложить еще один? Вы делаете это =вместо ==оператора if.
Иосия

Для меня это была версия PHP, обновление до 7.0 :)
nodws

3

Проблема в том, что ()вам нужно идти[]

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

по

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

3

У меня тоже была похожая проблема, как у тебя. Проблема в том, что вы используете старую версию php. Я обновил до PHP 5.6 и проблема больше не существует.


1

Другой сценарий, где эта ошибка вызвана синтаксической ошибкой:

ucwords($variable) = $string;

1
Это потому, что ucwordsвозвращают строку и контекст вызова неверен, если вы попытаетесь, например, с помощью $Test = ''; ${ucwords('test')} = 'String new !'; echo $Test;, а затем показать вам новое назначенное значение.
тыс.фунтов

0

Я также столкнулся с этой проблемой из-за синтаксической ошибки. Использование "(" вместо "[" в индексе массива:

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

0

Эта ошибка совершенно правильная и подчеркивает проблему контекстного синтаксиса. Может быть воспроизведен путем выполнения любого вида «не присваиваемого» синтаксиса. Например:

Синтаксис функции ($ hello) {.... затем попытайтесь вызвать функцию как свойство и присвоить значение .... $ this-> Syntax ('Hello') = 'World';

Вышеуказанная ошибка будет выдана, потому что синтаксически утверждение неверно. Правильное назначение «Мир» не может быть написано в контексте, который вы использовали (т.е. синтаксически неверно для этого контекста). «Невозможно использовать возвращаемое значение функции» или может прочитать «Невозможно назначить правое значение функции, потому что она доступна только для чтения»

Конкретная ошибка в коде OP является выделенной, используя квадратные скобки вместо квадратных.


-1

Может быть вызвано неправильным оператором =, когда это должно быть ==

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

Этот код выдает эту ошибку

Обратите внимание, что = является оператором присваивания, а не оператором сравнения. Исправить это изменить = на ==.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.