Дивна помилка 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

Крім того, інше застереження про оператор if не потрібне. $stateне буде змінено, не потрібно скидати його, NOTHING_SUBMITEDякщо це вже це значення.
Гленн Дейтон

Люди майбутнього, хтось може пояснити, що насправді означає повідомлення?
OGHaza

Відповіді:


111

Ти маєш на увазі

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

хоча до речі, ти насправді маєш на увазі

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

3
... або if (isset($_POST['sms_code']) === TRUE ) {:-)
клавіатураМошер

Я також знайшов рішення проблеми, з якою я стикався, тому FYI - це також стосується $ _REQUEST (параметри в URL-адресі сторінки).
TheCuBeMan

5
Я розумію, що я дуже пізно до цього, але це також залежить від PHP-версії, правда? Я впевнений, що це законно в наступних версіях PHP, як 5.6, але я думаю, що це не в 5.3
UnsettlingTrend

490

Це також відбувається при використанні порожнього при поверненні функції:

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

оскільки порожній - це не функція, а мовна конструкція (не впевнений), і він бере лише змінні:

Право:

empty($someVar)

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

empty(someFunc())

Оскільки PHP 5.5, він підтримує більше, ніж змінних. Але якщо вам це потрібно до 5,5, використовуйте trim($name) == false. З порожньої документації .


Данг, я також отримав цю помилку, роблячи ваш точний приклад (обрізка всередині порожня). Дякую x3 Яка дивна помилка .. Я досі не повністю розумію: / empty () може взяти рядок .. і trim () повертає рядок .. так wth?
Нік Роландо

15
@Shredder - Це тому empty(), що насправді це не функція; це мовна конструкція, як echo. PHP-аналізатор обробляє мову, побудовану по-різному. У випадку empty, коли він розглядає параметр як змінну, а не те, що слід оцінювати, тому, якщо ви спробуєте передати функцію, вона порушується. Принаймні, це моє розуміння цього. Більше інформації тут і тут .
грант

1
Це точна помилка, в яку я зіткнувся. Чому це не найкраща відповідь !?
Адам Ф

2
Мій колега отримував цю помилку, поки я не був. Виникла плутанина, поки я не перевірив документи - станом на PHP 5.5, порожній () прийме повернення функції, а також змінну. 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 (справжнє / хибне) вже повернене.


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 :)
киває

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;, то покажіть вам нове присвоєне значення.
kip

0

Я також зіткнувся з цією проблемою через синтаксичну помилку. Використання "(" замість "[" в індексі масиву:

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

0

Ця помилка цілком правильна і підкреслює проблему контекстного синтаксису. Можна відтворити, виконавши будь-який синтаксис "неприсвоєного". Наприклад:

функція Syntax ($ hello) {.... тоді намагаються викликати функцію як би властивість та призначити значення .... $ this-> Syntax ('Hello') = 'World';

Вищенаведена помилка буде викинута, оскільки синтаксично твердження неправильне. Правильне призначення "Світу" не може бути записане у використаному вами контексті (тобто синтаксично неправильному для цього контексту). "Неможливо використати функцію повернення значення", або він міг би читати "Неможливо призначити праворуч значення функції, оскільки її лише для читання"

Конкретна помилка в коді ОП настільки ж виділена, використовуючи дужки замість квадратних дужок.


-1

Може бути причиною неправильним оператором, =, коли це має бути ==

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

Цей код видаляє цю помилку

Зауважте, що = - оператор присвоєння, а не оператор порівняння. Виправити - змінити = на ==.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.