奇怪的 PHP 错误:'不能在写上下文中使用函数返回值'

Posted

技术标签:

【中文标题】奇怪的 PHP 错误:\'不能在写上下文中使用函数返回值\'【英文标题】:Weird PHP error: 'Can't use function return value in write context'奇怪的 PHP 错误:'不能在写上下文中使用函数返回值' 【发布时间】:2010-12-04 16:45:42 【问题描述】:

我遇到了这个错误,我无法确定它的头或尾。

确切的错误信息是:

致命错误:无法使用函数返回 写入上下文中的值 /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);

【问题讨论】:

$_POST('sms_code') 应该是 $_POST['sms_code'],顺便说一下。 另外,不需要 if 语句中的 else 子句。 $state 不会被修改,如果已经是那个值,则无需将其重置为 NOTHING_SUBMITED 未来的人们,谁能解释一下这条信息的真正含义? 【参考方案1】:

你是说

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

虽然顺便说一句,你的意思是

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

【讨论】:

...或if (isset($_POST['sms_code']) === TRUE ) :-) 我还找到了解决我所面临问题的方法,所以仅供参考 - 这也适用于 $_REQUEST(页面 URL 中的参数)。 我意识到我已经很晚了,但这也取决于 PHP 版本,对吧?我很确定这在以后的 PHP 版本(如 5.6)中是合法的,但我认为它在 5.3 中不合法【参考方案2】:
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 

【讨论】:

不,你不能写“if (isset($_POST['sms_code'] == TRUE ) ", there's a missing ")”。 +数十亿个酷点用于短语“你正在使用括号......但你想要方括号”,这是我的问题(导致我提出这个问题)是 唷,谢谢你!现在,如果解析器会说“我希望在数组变量的名称后面加上方括号,呃!”,这听起来比“不能在写上下文中使用函数返回值”要酷得多。我可能会将其作为建议提交给 PHP 人员。【参考方案3】:

正确的语法(最后缺少括号):

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

附言您不需要 == TRUE 部分,因为 BOOLEAN (true/false) 已经返回。

【讨论】:

【参考方案4】:

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

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

因为 empty 不是函数而是语言结构(不确定),而且它只需要变量:

右:

empty($someVar)

错误:

empty(someFunc())

从 PHP 5.5 开始,它支持的不仅仅是变量。但是如果你在 5.5 之前需要它,请使用trim($name) == false。来自empty documentation。

【讨论】:

Dang,我也遇到了这个错误,正在做你的确切示例(修剪内部为空)。谢谢 x3。多么奇怪的错误..我仍然不完全理解:/ empty() 可以接受一个字符串.. 而 trim() 返回一个字符串.. 所以呢? @Shredder - 这是因为empty() 实际上不是一个函数;它是一种语言结构,例如 echo。 PHP 解析器以不同的方式处理语言结构。在empty 的情况下,它将参数视为一个变量,而不是要评估的东西,所以如果你尝试传递一个函数,它就会中断。至少这是我对它的理解。更多信息here 和 here。 这也是我遇到的确切错误。为什么这不是最佳答案!? 我的同事收到了这个错误,而我没有。混乱接踵而至,直到我检查了文档——从 PHP 5.5 开始,empty() 将接受函数和变量的返回。 us3.php.net/empty 5.5 万岁!在升级之前,您可以将这样的内容放入主函数包含文件中:function mTEE($val) return empty($val); 【参考方案5】:

这可能发生在多个场景中,下面列出了一些众所周知的场景:

// 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 :)【参考方案6】:

对于 WORDPRESS

代替:

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

应该是:

if (!get_option('smth'))

【讨论】:

【参考方案7】:

问题出在()你必须去[]

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

通过

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

【讨论】:

【参考方案8】:

我也遇到了和你一样的问题。问题是您使用的是旧的 php 版本。我已经升级到PHP 5.6,问题不再存在了。

【讨论】:

【参考方案9】:

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

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

【讨论】:

【参考方案10】:

由于语法错误而触发此错误的另一种情况:

ucwords($variable) = $string;

【讨论】:

是因为ucwords返回一个字符串并且调用的上下文不正确,如果您尝试使用$Test = ''; $ucwords('test') = 'String new !'; echo $Test;,然后显示分配给您的新值。【参考方案11】:

这个错误非常正确,突出了上下文语法问题。可以通过执行任何类型的“不可分配”语法来复制。例如:

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

上述错误将被抛出,因为在语法上该语句是错误的。 'World' 的正确赋值不能写在你使用过的上下文中(即这个上下文的语法不正确)。 '不能使用函数返回值' 或者它可以读取'不能将右侧值分配给函数,因为它是只读的'

OPs 代码中的特定错误已突出显示,使用方括号代替方括号。

【讨论】:

【参考方案12】:

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

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

此代码抛出此错误

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

【讨论】:

以上是关于奇怪的 PHP 错误:'不能在写上下文中使用函数返回值'的主要内容,如果未能解决你的问题,请参考以下文章

我在 onAttach(Context) 中遇到了这个奇怪的错误

TSQL 错误:不能在此上下文中使用具有返回值的 RETURN 语句

jquery的ajax提交后,会跳转页面

PHP:simplexml_load_file 从使用 UTF-8 编码的 XML 文件中获取奇怪的字符

PHP基础(简单)

PHP函数中的奇怪过滤结果