이상한 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.