我收到了这个错误,我无法做出它的头或尾。
确切的错误消息是:
Fatal error: Can't use function return
value in write context in
/home/curricle/public_html/descarga/index.php
on line 48
第48行是:
if (isset($_POST('sms_code') == TRUE ) {
谁知道发生了什么?
PS这是完整的功能,如果有帮助:
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。
未来的人们,任何人都可以解释这些信息的实际含义吗?
在函数返回上使用empty时也会发生这种情况:
!empty(trim($someText)) and doSomething()
因为empty不是一个函数而是一个语言构造(不确定),它只需要变量:
对:
empty($someVar)
错误:
empty(someFunc())
从PHP 5.5开始,它支持的不仅仅是变量。但如果您在5.5之前需要它,请使用trim($name) == false。从空文档。
Dang,我也得到了这个错误,做了你的确切示例(修剪为空)。谢谢x3。多么奇怪的错误..我仍然不完全理解:/ empty()可以接受一个字符串..而trim()返回一个字符串..所以wth?
@Shredder - 因为empty()实际上不是一个函数;它是一种语言结构,如echo。 PHP解析器以不同方式处理语言结构。在empty的情况下,它将参数视为变量,而不是要评估的内容,因此如果您尝试传递函数,它会中断。至少这是我对它的理解。更多信息在这里和这里。
这也是我遇到的确切错误。为什么这不是最佳答案!?
做出这个最佳答案或在接受的答案上添加一个参考。
我没有,我的同事得到了这个错误。随后出现了混乱,直到我检查了文档 - 从PHP 5.5开始,empty()将接受函数和变量的返回。 us3.php.net/empty
霍瑞为5.5!在升级之前,您可以将这样的内容扔到主函数包含文件中:function mTEE($val){ return empty($val); }
就像@JamesAlday所说,来自文档Prior to PHP 5.5, empty() only supports variables; anything else will result in a parse error. In other words, the following will not work: empty(trim($name)). Instead, use trim($name) == false.。
非常感谢!我升级到PHP 5.5,它解决了我的问题。
谢谢!非常重要的事情要知道! :)虽然这个错误没有出现在5.4以上的版本中我认为!但仍然是非常好的注意事项。
我知道它迟到但是谢谢,这是我的问题,欣赏修复:)。我一直在努力,因为它在本地工作但不在我们的服务器上。
我知道这是一个老问题,但我遇到了同样的事情,它是内联trim()导致5.4.x上的问题。
你的意思是
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中没有
if (isset($_POST('sms_code') == TRUE ) {
将此行更改为
if (isset($_POST['sms_code']) == TRUE ) {
你正在使用parentheseis()为$_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){",theres a missing")"。
纠正:P ..
+你使用括号的几十个酷点...但你想要方括号,这就是我的问题(这导致我这个问题)是
呃,呃,伙计!现在,如果解析器会说"我期望在数组变量名称之后使用方括号,呃!",它听起来会比"在写上下文中使用函数返回值"更酷。我可能会向PHP人员提交这个建议。
对于WORDPRESS:
代替:
if (empty(get_option('smth')))
应该:
if (!get_option('smth'))
谢谢Tazo!
正确的语法(最后你的括号丢失):
if (isset($_POST['sms_code']) == TRUE ) {
^
附:你不需要== TRUE部分,因为已经返回了BOOLEAN(true / false)。
这可能发生在多个场景中,下面是一个众所周知的场景列表:
// 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 :)
我也有类似你的问题。问题是你使用的是旧的PHP版本。我已升级到PHP 5.6,问题不再存在。
问题出在()你必须去[]
if (isset($_POST('sms_code') == TRUE)
通过
if (isset($_POST['sms_code'] == TRUE)
由于语法错误导致此错误被触发的另一种情况:
ucwords($variable) = $string;
是因为ucwords返回一个字符串并且调用的上下文不正确,如果您尝试使用$Test = ; ${ucwords(test)} = String new !; echo $Test;,则显示分配的新值。
由于语法错误,我也遇到了这个问题。在数组索引中使用"("而不是"[":
foreach($arr_parameters as $arr_key=>$arr_value) {
$arr_named_parameters(":$arr_key") = $arr_value;
}