Erro estranho do PHP: 'Não é possível usar o valor de retorno da função no contexto de gravação'

178

Estou recebendo esse erro e não consigo entender.

A mensagem de erro exata é:

Erro fatal: não é possível usar o valor de retorno da função no contexto de gravação em /home/curricle/public_html/descarga/index.php na linha 48

A linha 48 é:

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

O que poderia estar acontecendo aqui?

Aqui está a função completa:

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);
}
cfischer
fonte
22
$ _POST ('sms_code') deve ser $ _POST ['sms_code'], a propósito.
Davidtbernal 7/10/09
Além disso, a cláusula else na instrução if não é necessária. $statenão será modificado, não há necessidade de redefini-lo NOTHING_SUBMITEDse já tiver esse valor.
Glenn Dayton
Pessoas do futuro, alguém pode explicar o que a mensagem realmente significa?
OGHaza

Respostas:

111

Você quer dizer

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

embora, aliás, você realmente queira dizer

if (isset($_POST['sms_code'])) {
caos
fonte
3
... ou if (isset($_POST['sms_code']) === TRUE ) {:-)
keyboardSmasher
Eu também encontrei a solução para o problema que estava enfrentando, então, para sua informação, isso também vale para $ _REQUEST (parâmetros no URL da página).
TheCuBeMan
5
Sei que estou muito atrasado para isso, mas também depende da versão do PHP, certo? Tenho certeza que é legal em versões do PHP posteriores como 5,6, mas acho que isso não acontece em 5,3
UnsettlingTrend
490

Isso também acontece ao usar vazio em um retorno de função:

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

porque vazio não é uma função, mas uma construção de linguagem (não tenho certeza) e leva apenas variáveis:

Certo:

empty($someVar)

Errado:

empty(someFunc())

Desde o PHP 5.5, ele suporta mais do que variáveis. Mas se você precisar antes do 5.5, use trim($name) == false. Da documentação vazia .

rolfen
fonte
Caramba, eu também recebi esse erro, fazendo o seu exemplo exato (apara o interior vazio). Obrigado x3. Que erro estranho .. Eu ainda não entendo completamente: / empty () pode pegar uma string .. e trim () retorna uma string .. então, qual?
Nick Rolando
15
@ Shredder - É porque empty()na verdade não é uma função; é uma construção de linguagem, como echo. O analisador PHP lida com construções de linguagem de maneira diferente. No caso de empty, ele analisa o parâmetro como uma variável, não como algo a ser avaliado; portanto, se você tentar passar uma função, ela será interrompida. Pelo menos essa é a minha compreensão. Mais informações aqui e aqui .
conceder
1
Este é o erro exato que eu encontrei também. Por que essa não é a melhor resposta?
Adam F
2
Meu colega estava recebendo esse erro enquanto eu não estava. Confusão se seguiu, até que eu verifiquei os documentos - a partir do PHP 5.5, empty () aceitará o retorno de uma função e também de uma variável. us3.php.net/empty
James Alday
1
Horray para 5.5! Até que você atualizar, você poderia jogar algo parecido com isso em sua função principal arquivo de inclusão:function mTEE($val){ return empty($val); }
TecBrat
22
if (isset($_POST('sms_code') == TRUE ) {

mude esta linha para

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

Você está usando parentheseis () para, $_POSTmas queria colchetes []

:)

OU

if (isset($_POST['sms_code']) && $_POST['sms_code']) { 
//this lets in this block only if $_POST['sms_code'] has some value 
TigerTiger
fonte
1
Não, você não pode escrever "if (isset ($ _ POST ['sms_code'] == TRUE) {", falta um ")".
Middus 7/10/09
1
+ vários bilhões de pontos frescos para a Phrae 'você está usando parênteses ... mas você queria colchetes', que era o meu problema (que me levou a esta pergunta) era
Kevin Chifre
1
Ufa, cara! Agora, se o analisador disser "Eu esperava colchetes após o nome de uma variável de matriz, duh!", Pareceria muito mais interessante do que "Não é possível usar o valor de retorno da função no contexto de gravação". Eu poderia enviar isso para os caras do PHP como uma sugestão.
Joe Völker
13

para WORDPRESS :

ao invés de:

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

deveria estar:

if (!get_option('smth'))
T.Todua
fonte
11

Sintaxe correta (faltam parênteses no final):

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

ps você não precisa de == TRUE parte, porque BOOLEAN (verdadeiro / falso) já foi retornado.

middus
fonte
4

Isso pode acontecer em mais de um cenário. Abaixo está uma lista de cenários conhecidos:

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

// usando parênteses para acessar um elemento de uma matriz, parênteses são usados ​​para chamar uma função

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

Isso também pode ser acionado quando tentamos incrementar o resultado de uma função como abaixo:

$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.
Mehdi Karamosly
fonte
Deseja obter erros? Porque é assim que você recebe bugs. Não, mas falando sério, nunca faça isso. É como fazer if(i++), pode parecer mais curto do que incrementar o contador e depois avaliar seu valor, mas causará dores de cabeça se ocorrer algum erro. Edit: Não estou sugerindo que você faça isso, apenas indique aos novos programadores que leem a resposta e acham que isso é uma coisa interessante, para incrementar valores enquanto calcula ou avalia o que está sendo incrementado.
Victor D.
@VictorD. Estou apenas dizendo que o erro pode ocorrer nessa situação, o que significa que não é bom fazê-lo.
Mehdi Karamosly
Posso sugerir mais um? Você faz isso em =vez de ==em uma instrução if.
1937 Josiah
Para mim, foi a versão PHP, upgrade para 7.0 :)
nodws
3

O problema está no que ()você tem que ir[]

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

de

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

Eu também tive um problema semelhante ao seu. O problema é que você está usando uma versão antiga do php. Eu atualizei para o PHP 5.6 e o ​​problema não existe mais.

husnixs
fonte
1

Outro cenário em que esse erro é trigerado devido a um erro de sintaxe:

ucwords($variable) = $string;
tomelin5
fonte
1
É porque ucwordsretorna uma string e o contexto da chamada está incorreto, se você tentar, por exemplo $Test = ''; ${ucwords('test')} = 'String new !'; echo $Test;, com , em seguida, mostrar o novo valor atribuído.
Kip
0

Também encontrei este problema devido a um erro de sintaxe. Usando "(" em vez de "[" no índice da matriz:

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

Este erro está correto e destaca um problema de sintaxe contextual. Pode ser reproduzido executando qualquer tipo de sintaxe "não atribuível". Por exemplo:

function Sintaxe ($ hello) {.... então tente chamar a função como se fosse uma propriedade e atribua um valor .... $ this-> Sintaxe ('Hello') = 'World';

O erro acima será gerado porque sintaticamente a instrução está errada. A atribuição correta de 'Mundo' não pode ser escrita no contexto que você usou (ou seja, sintaticamente incorreto para este contexto). 'Não é possível usar o valor de retorno da função' ou pode ler 'Não é possível atribuir o valor à direita para a função porque é somente leitura'

O erro específico no código de OP é destacado, usando colchetes em vez de colchetes.

user12845085
fonte
-1

Pode ser causado por operador errado, =, quando deveria ser ==

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

Este código gera este erro

Observe que = é operador de atribuição e não operador de comparação. Correção é alterar = para ==.

Hammad Khan
fonte