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


465

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

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

어디 getError()단순히 :

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

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

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

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


2
아마도 PHP 5.5에서는 다음과 같은 표현식을 전달할 수 있습니다 empty: wiki.php.net/rfc/empty_isset_exprs
Carlos Campderrós


좋아, porneL의 답변if ( !$e->find('div') ) 현재 HTML DOM 요소가 비어 있는지 여부를 확인하는 내 코드도 정확하다는 것을 알았 습니다 . 내부 루프를 사용하여 내부 Div없이 단일 Div 만 인쇄합니다.
Salem

답변:


769

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())

29
이것은 현재 선택된 것보다 훨씬 나은 답변입니다.
SystemParadox

20
@gcb : 아니오, PHP 매뉴얼은 명시 적으로 동일하다고 말합니다 : "empty ()는 (boolean) var변수가 설정되지 않은 경우 경고가 발생하지 않는다는 점을 제외하고 는 반대입니다 ."
Kornel

16
경고 부분을 생성하지 않는 것은 매우 중요합니다. empty ($ var)는 0, '', array (), NULL 또는 정의되지 않은 경우 true를 반환합니다. 특히 파일을 채우지 않고도 실제 경고를 기록 할 수있는 좋은 방법입니다.
landons

3
좋아, 좋은 대답이지만 이것을 피하는 올바른 방법은 무엇입니까?
Javatar

3
일반적으로 @EugenMihailescu 괜찮아,하지만 그것 때문에 엄격하게 () 비워 해당 아니다 "", 0널 (null) 등 "빈"하지만,하지.
Kornel

330

참고 : 이것은 높은 가시성으로 투표율이 높은 답변이지만, 불필요하고 불필요한 코딩 관행을 조장합니다! 올바른 방법은 @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))

156
이것은 대단히 비생산적입니다.
David Murdoch

47
참고 :도 마찬가지입니다 isset(). 즉 : isset($this->foo->getBar())같은 문제가 발생합니다.
catchdave

7
porneL의 답변은 더 나은 솔루션으로이를 자세히 설명합니다
SystemParadox

5
@SystemParadox- "더 나은"의 의미에 따라 다릅니다. porneL의 대답은 아마도 "깨끗한"해결책으로 더 철저하지만, 실제로 오류의 원인도 설명하지는 않습니다.
피터 베일리

4
잘못이 아니기 때문에 @deceze. 가장 좋은 대답은 아닙니다. 당신은 저에게서 아무런 주장도 얻지 못할 것입니다. 나는 심지어 자신의 포르노를 투표했다. 그것은이다 아주 오래된 대답하지만 그렇지 않아 잘못된 . 높은 투표에 관해서는 : porneL 은이 투표 후 거의 17 개월 만에 도착했습니다.
피터 베일리

37

PHP 문서 에 따르면 :

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

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


19

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

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

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


2
이 작업을 수행하지 말고 표준을 고수하는 것이 좋습니다.
tonyhb

1
@ dynamism 당신은 왜 안 설명 할 수 있습니까?
Janis Veinbergs

1
편의 기능은 다른 사람의 코드를 읽기가 어려울 수 있기 때문입니다. 또한 MVC / HMVC 아키텍처에서는 구조를 망칠 수 있습니다. 하루가 끝나면 PHP 코더는 그 한계를 알고 편의 기능없이 작은 해결 방법을 이해할 수 있어야합니다.
tonyhb

14
와우, 당신은 방금 부정 함수를 발명했습니다 . PHP !에이 연산자 가 있다는 것을 알고 있습니까? :)
Kornel

4

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

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

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

5
이것은 사실이 아닙니다- empty()단지 빈 줄보다 더 많은 가능성을 다룹니다
Robbie Averill

3
그렇기 때문에 " 대부분의 목적을 위해 " 전부
Jani Hartikainen

2

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

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();
}

-3

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

count($array)>0

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

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