奇怪的 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 语句