이상한 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이미 해당 값인 경우 다시 설정할 필요가 없습니다 .
Glenn Dayton

미래의 사람들, 누구나이 메시지가 실제로 무엇을 의미하는지 설명 할 수 있습니까?
OGHaza 2016 년

답변:


111

네 말 뜻은

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

우연히 당신은 정말 의미

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

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

또한 내가 직면 한 문제에 대한 해결책을 찾았으므로 FYI-$ _REQUEST (페이지 URL의 매개 변수)에도 적용됩니다.
TheCuBeMan

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. 에서 빈 문서 .


Dang, 나는이 오류가 발생하여 정확한 예 (내부 트림)를하고 있습니다. 감사합니다 x3. 무슨 이상한 오류가 있습니다. 나는 여전히 완전히 이해하지 못합니다 : / empty ()는 문자열을 취할 수 있습니다. 그리고 trim ()은 문자열을 반환합니다. 그래서 wth?
Nick Rolando

15
@Shredder- empty()실제로 함수가 아니기 때문 입니다. 와 같은 언어 구성 echo입니다. PHP 파서는 언어 구성을 다르게 처리합니다. 의 경우 empty평가 대상이 아닌 변수로 매개 변수를 확인하므로 함수를 전달하려고하면 매개 변수가 중단됩니다. 적어도 그것은 내 이해입니다. 여기여기에 더 많은 정보가 있습니다 .
부여하십시오

1
이것은 내가 만난 정확한 오류입니다. 이것이 왜 최고 답이 아닌가!?
Adam F

2
내가없는 동안 동료가이 오류를 겪고있었습니다. 혼란스러워서 문서를 확인할 때까지-PHP 5.5부터 empty ()는 변수뿐만 아니라 함수의 반환을 허용합니다. us3.php.net/empty
James Alday

1
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) {"인 경우 누락 된 ")"를 작성할 수 없습니다.
middus

1
+를 프에 대한 수십억 멋진 포인트 '는 괄호를 사용하고 ...을하지만 당신은 원 대괄호'내 문제가 (이 문제를 알려준 것을) 무엇이고,
케빈 혼

1
휴, 남자! 이제 파서가 "배열 변수 이름 뒤에 대괄호를 기대했습니다, 어!"라고 말하면 "쓰기 컨텍스트에서 함수 반환 값을 사용할 수 없습니다"보다 훨씬 멋지게 들립니다. PHP 사람들에게 제안으로 제출할 수 있습니다.
Joe Völker

13

를위한 워드 프레스 :

대신에:

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

하나 더 제안해도 될까요? if 문 =대신에 수행하십시오 ==.
Josiah

나를 위해 그것은 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';

문법적으로 문장이 잘못되어 위의 오류가 발생합니다. 'World'의 올바른 할당은 사용한 컨텍스트에서 작성할 수 없습니다 (즉,이 컨텍스트에서는 구문 상 올바르지 않습니다). '함수 반환 값을 사용할 수 없습니다'또는 '읽기 전용이기 때문에 오른쪽 값을 함수에 할당 할 수 없습니다'를 읽을 수 있습니다.

OP 코드의 특정 오류는 대괄호 대신 대괄호를 사용하여 강조 표시됩니다.


-1

==이어야 할 때 잘못된 연산자 =로 인해 발생할 수 있습니다.

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

이 코드는이 오류를 발생시킵니다

=는 대입 연산자이며 비교 연산자가 아닙니다. 수정은 =를 ==로 변경하는 것입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.