奇妙な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 2009年

また、ifステートメントのelse句は必要ありません。$state変更されませんNOTHING_SUBMITED。すでにその値である場合は、リセットする必要はありません。
Glenn Dayton

未来の人々は、メッセージが実際に何を意味するのか誰でも説明できますか?
OGHaza 2017年

回答:


111

もしかして

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

偶然にもあなたは本当に意味します

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

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

私が直面している問題の解決策も見つけたので、参考までに-これは$ _REQUEST(ページのURLのパラメーター)にも当てはまります。
TheCuBeMan 2015

5
私はこれに超遅れていることに気づきましたが、それはPHPのバージョンにも依存していますよね?それが5.6のような最新のPHPバージョンでは合法であると確信していますが、5.3ではそうではないと思います
UnsettlingTrend

490

これは、関数の戻りでemptyを使用した場合にも発生します。

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

emptyは関数ではなく言語構造体(不明)であり、変数のみを受け取るためです。

正しい:

empty($someVar)

違う:

empty(someFunc())

PHP 5.5以降では、変数以外のものもサポートしています。ただし、5.5より前のバージョンで必要な場合は、を使用してくださいtrim($name) == false空のドキュメントから。


ダン、私もちょうどこのエラーが出て、あなたの正確な例を実行しています(空の中でトリム)。ありがとうx3。なんと奇妙なエラー..私はまだ完全に理解していません:/ empty()は文字列を取ることができます...そしてtrim()は文字列を返します..だからwth?
Nick Rolando

15
@シュレッダー-それempty()は実際には関数ではないからです。それはのような言語構造echoです。PHPパーサーは、言語構造を異なる方法で処理します。の場合empty、パラメータは評価されるものではなく変数と見なされるため、関数を渡そうとすると壊れます。少なくともそれは私の理解です。詳細はこちらこちら
付与

1
これも私が遭遇した正確なエラーです。なぜこれが一番の答えではないのですか?
アダムF

2
私の同僚ではなかったときに、私の同僚がこのエラーを受け取りました。私がドキュメントを確認するまで、混乱が続きました-PHP 5.5以降、empty()は関数からの戻り値と変数を受け入れます。us3.php.net/empty
James Alday、2014

1
Horray for 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
+句の数十億のクールポイント「括弧を使用していますが、角かっこが必要です」これが私の問題(この質問につながった)でした
Kevin Horn

1
ふew、男よ!さて、パーサーが「配列変数の名前の後に角かっこが必要だと思います!」と言った場合、「関数の戻り値を書き込みコンテキストで使用できません」よりも格好良く聞こえます。私はそれをPHPの連中に提案として提出するかもしれません。
JoeVölker、

13

以下のためのWORDPRESS

の代わりに:

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

でなければなりません:

if (!get_option('smth'))

11

正しい構文(最後に括弧が欠落していた):

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

== 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++)、カウンターをインクリメントしてからその値を評価するよりも短く見えるかもしれませんが、バグが発生すると頭痛の種になります。編集:それはあなたがそれを行うことを意味するのではなく、答えを読んで新しいプログラマにそれを指摘し、これがきちんとしたものだと考えて、インクリメントされているものを計算または評価するときに値をインクリメントします。
ビクターD.

@VictorD。私は、そのような状況でエラーが発生する可能性があることを言っているだけです。
Mehdi Karamosly 2014年

もう1つ提案できますか?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

このエラーは完全に正しいものであり、コンテキスト構文の問題を浮き彫りにします。あらゆる種類の「割り当て不可」の構文を実行することで再現できます。例えば:

function Syntax($ hello){....次に、プロパティのように関数を呼び出し、値を割り当てます。...$ this-> Syntax( 'Hello')= 'World';

構文的にステートメントが間違っているため、上記のエラーがスローされます。'World'の正しい割り当ては、使用したコンテキストでは記述できません(つまり、このコンテキストでは構文的に正しくありません)。「関数の戻り値を使用できません」または「読み取り専用であるため、関数に右側の値を割り当てることができません」と読み取ることができます

OPコードの特定のエラーは、角括弧の代わりに角括弧を使用して強調表示されています。


-1

==であるはずの演算子=の誤りが原因である可能性があります

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

このコードはこのエラーをスローします

=は代入演算子であり、比較演算子ではないことに注意してください。修正は、=を==に変更することです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.