奇怪的PHP错误:“无法在写入上下文中使用函数返回值”


178

我收到此错误,无法显示它的开头或结尾。

确切的错误消息是:

致命错误:在第48行的/home/curricle/public_html/descarga/index.php中的写入上下文中无法使用函数返回值

第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语句上的else子句。$state将不会被修改,NOTHING_SUBMITED如果已经是该值,则无需将其重置为。
格伦·代顿

未来的人们,谁能解释这个消息的实际含义?
OGHaza

Answers:


111

你的意思是

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

虽然顺带一提,您的意思是

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

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

我还找到了我所面临问题的解决方案,因此仅供参考-$ _REQUEST(页面URL中的参数)也是如此。
TheCuBeMan 2015年

5
我意识到我对此事迟到了,但是它也取决于PHP版本,对吗?我很确定这在更高版本的PHP(如5.6)中是合法的,但我认为在5.3中不
合法

490

在函数返回上使用空时,也会发生这种情况:

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

因为empty不是函数,而是语言构造(不确定),并且只接受变量:

对:

empty($someVar)

错误:

empty(someFunc())

从PHP 5.5开始,它不仅仅支持变量。但是,如果您在5.5之前需要它,请使用trim($name) == false。从空文档


当,我也遇到了这个错误,做了你的例子(修剪里面是空的)。谢谢x3。什么奇怪的错误..我仍然不完全理解:/ empty()可以接受字符串.. trim()返回字符串..那么吗?
尼克·罗兰多

15
@Shredder-这是因为它empty()实际上不是一个函数;这是一种语言构造,例如echo。PHP解析器以不同的方式处理语言构造。对于empty,它将参数视为变量,而不是要求值的变量,因此,如果尝试传递函数,则会中断。至少那是我的理解。更多信息在这里这里
授予

1
这也是我遇到的确切错误。为什么这不是最佳答案!?
亚当F

2
我的同事没有收到此错误。随之而来的是混乱,直到我检查了文档-从PHP 5.5开始,empty()将接受来自函数以及变量的返回。us3.php.net/empty
James Alday

1
霍雷5.5版!在升级之前,您可以向主函数包含文件中添加以下内容:function mTEE($val){ return empty($val); }
TecBrat 2014年

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
不会,您不能写“如果(isset($ _ POST ['sms_code'] == TRUE){”,则缺少“)”。
middus

1
+短语的数十亿个冷静点“您正在使用括号...但您想要方括号”,这就是我的问题(导致我提出这个问题)是
Kevin Horn

1
ew,老兄!现在,如果解析器说“我希望在数组变量的名称后面加上方括号,啊!”,这听起来比“在写上下文中不能使用函数返回值”要酷得多。我可能会将其作为建议提交给PHP专家。
JoeVölker'12

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++),它看起来比增加计数器然后评估其值的时间要短,但是如果它出错,将使您头疼。编辑:我并不是在暗示您这样做,只是将其指出给新程序员,使他们阅读答案并认为这是一件很整洁的事情,可以在计算或评估要递增的值时增加值。
维克多(Victor D.)

@VictorD。我只是说在这种情况下可能会发生错误,这意味着这样做是不好的。
Mehdi Karamosly 2014年

我可以再建议一个吗?您可以使用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;,然后向您显示分配的新值。
kip

0

由于语法错误,我也遇到了这个问题。在数组索引中使用“(”代替“ [”:

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

0

此错误是正确的,并突出显示了上下文语法问题。可以通过执行任何一种“不可分配”的语法来复制。例如:

function Syntax($ hello){....然后尝试像调用属性一样调用该函数并分配一个值...。$ this-> Syntax('Hello')='World';

因为语法上该语句是错误的,所以将引发以上错误。不能在您使用的上下文中编写“世界”的正确分配(即,对于该上下文在语法上不正确)。“无法使用函数返回值”,或者它可能显示为“由于该函数为只读,因此无法为该函数分配右侧值”

使用括号而不是方括号突出显示了OPs代码中的特定错误。


-1

可能是由错误的运算符=引起的,应为==

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

此代码引发此错误

请注意,=是赋值运算符,而不是比较运算符。解决方法是将=更改为==。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.