[php] 쓰기 컨텍스트에서 메소드 리턴 값을 사용할 수 없습니다.

다음 코드는 작동해야한다고 생각하지만 작동하지 않습니다 (편집 : 이제 PHP 5.5 이상에서 작동합니다) .

if (!empty($r->getError()))

어디 getError()단순히 :

public function getError()
{
    return $this->error;
}

그러나 나는이 오류로 끝납니다.

쓰기 컨텍스트에서 메서드 반환 값을 사용할 수 없습니다

이것은 무엇을 의미 하는가? 이 책은 읽지 않습니까?



답변

empty() (참조가 존재하는 것을 가리키는 지 확인하기 위해) 참조로 값에 액세스해야하며 5.5 이전의 PHP는 함수에서 반환 된 임시 값에 대한 참조를 지원하지 않았습니다.

그러나 실제 문제는 empty()“빈”값이 “거짓”과 다르다고 잘못 생각하는 것입니다.

빈은에 대한 별칭입니다 !isset($thing) || !$thing. 당신이 확인하고있는 것이 항상 존재할 때 (PHP에서 함수 호출의 결과는 항상 존재합니다), empty()함수는 부정 연산자 일뿐입니다 .

PHP 에는 공허함 개념이 없습니다 . false로 평가되는 값은 비어 있고 true로 평가되는 값은 비어 있지 않습니다. 그건 같은거야. 이 코드는 :

$x = something();
if (empty($x)) 

이:

$x = something();
if (!$x) 

항상 같은 결과, 모든 경우에, 모든 데이터 유형을 위해 (때문에 $x정의 empty()중복).

메서드의 반환 값은 항상 존재합니다 ( return구문 이 없거나 반환 값이 존재하고 포함 null). 따라서:

if (!empty($r->getError()))

논리적으로 다음과 같습니다.

if ($r->getError())


답변

참고 : 이것은 높은 가시성으로 투표율이 높은 답변이지만, 불필요하고 불필요한 코딩 관행을 조장합니다! 올바른 방법은 @Kornel의 답변 을 참조하십시오 .

참고 # 2 : @ Kornel ‘s answer 사용 제안을 승인합니다 . 3 년 전에이 답변을 썼을 때, 나는 단지 대안을 보증 할 필요는 없으며 단지 오류의 본질을 설명하기위한 것일뿐입니다. 아래 코드 스 니펫은 권장되지 않습니다.


5.5 이하의 PHP 버전에서는 empty () 의 한계입니다 .

참고 : empty ()는 변수를 검사하여 구문 분석 오류가 발생합니다. 즉, empty (trim ($ name))는 작동하지 않습니다.

당신은 이것으로 변경해야 할 것입니다

// Not recommended, just illustrates the issue
$err = $r->getError();
if (!empty($err))


답변

PHP 문서 에 따르면 :

empty ()는 변수를 검사하여 구문 분석 오류가 발생합니다.

empty()함수의 반환 값에는 직접 사용할 수 없습니다 . 대신 반환 getError()값을 변수 로 설정하고 변수에서 실행 empty()하십시오.


답변

나는 보통이 문제를 해결하기 위해 is_empty ()라는 전역 함수를 만듭니다.

function is_empty($var)
{
 return empty($var);
}

그런 다음 일반적으로 empty ()을 사용한 곳은 is_empty ()


답변

다른 사람들이 지적했듯이, empty ()의 (이상한) 한계입니다.

대부분의 purproses의 경우이를 수행하는 것은 empty를 호출하는 것과 동일하지만 작동합니다.

if ($r->getError() != '')


답변

문제는 이것입니다. 오류가 비어 있지 않은지 알고 싶습니다.

public function getError() {
    return $this->error;
}

isErrorSet () 메소드를 추가하면 문제가 해결됩니다.

public function isErrorSet() {
    if (isset($this->error) && !empty($this->error)) {
        return true;
    } else {
        return false;
    }
}

이제 이것은 통지 없이이 코드에서 잘 작동합니다.

if (!($x->isErrorSet())) {
    echo $x->getError();
}


답변

배열이 비어 있는지 확인하는 다른 방법은 다음과 같습니다.

count($array)>0

그 오류없이 저에게 효과적입니다.