2013-10-18 2 views
1

인스턴스 변수가 할당 된 적이 없는지 확인하는 좋은 방법은 무엇입니까? 다음 예제를 고려하십시오. $this->foo은 시작할 때 null입니다. 데이터베이스에 $this->foo이 있으면 이후에 getFoo()을 호출해도 데이터베이스가 쿼리되지 않습니다. 그러나 데이터베이스에 반환 된 항목이 없으면 (null) 모든 후속 호출이 여전히 데이터베이스에 충돌합니다. 좋지 않습니다.PHP 인스턴스 변수가 선언되었지만 할당되지 않았는지 확인하십시오.

class FooBar 
{  
    protected $foo; 
    protected $db;  

    public function getFoo() 
    { 
    if (is_null($this->foo)) { 
     $this->foo = $this->db->getFooFromDatabase(); 
    } 

    return $this->foo; 
    } 
} 
+0

당신은 null 대신 dummy 값을 사용해야한다고 생각합니다. 그런 식으로 'not set'과 'null'을 구별 할 수 있습니다. – mpen

+0

@ 마크 당신이 옳다고 생각합니다. 이것을하는 대중적인 가치/객체/일정한 방법이 있는지 모르겠다. – David

답변

1

이것은 약간 해킹입니다.하지만 간단히 설정하지 않는 것이 어떻습니까? 그런 다음 객체에 해당 속성이 있는지 여부를 간단히 확인하십시오.

class FooBar 
{ 
    //REMOVED 
    //protected $foo; 
    protected $db;  

    public function getFoo() 
    { 
    if (! property_exists($this, 'foo')) { 
     $this->foo = $this->db->getFooFromDatabase(); 
    } 

    return $this->foo; 
    } 
} 
+0

'isset' 또한 null인지를 확인한다. 나는 이것이 효과가 있다고 생각하지 않는다. – mpen

+1

당신 말이 맞아요. 나는'property_exists'가 그것을위한 것이라고 믿습니다. 편집 됨. – SolarBear

1

별개의 "지금까지 할당 된"부울 플래그를 유지하는 것이 부족합니다. 대부분의 경우 기본값 (이 경우 대개 null)은 센티넬로서 적절하게 작용하며,이 예에서도 제공 할 수없는 이유는 없습니다. foo를 찾지 못하도록 쿼리 메소드 return false을 가질 수도 있고 그대로 둘 수 있으며 false을 속성의 초기 값으로 사용할 수 있습니다.

null 데이터베이스를 쿼리 한 후 대부분의 시간이 의미가 없으므로 null의 일반적인 의미는 "알 수 없음"입니다. 지식 데이터베이스가 "아무것도 없다"라고하더라도 데이터베이스에 방금 쿼리 한 결과 이됩니다.

+2

그는'foo'가 DB에 설정 될지도 모른다고하지만,'null'으로 설정되어 있다고 생각합니다. 그는 foo가 기본적으로 null이기 때문에 "not set"과 "foo is null"을 구분할 수 없습니다. – mpen

+0

@ 마크 : 다른 고정 값을 플레이스 홀더로 사용하면 다른 방법으로 처리 할 수 ​​있습니다. 그것은'거짓 '일 수 있으며'const UNKNOWN = false'와'protected $ foo = self :: UNKNOWN'으로 의미 론적으로 강화 될 수 있습니다. – Jon

+1

"false"도 알 수없는 것으로 사용하지 않을 것입니다. 나는 그것 자체의 타입을 가지도록 전체 더미 싱글 톤 클래스를 생성 할 것이다. 나는 ASP.NET MVC가 그들의'DbNull' 클래스와 함께한다고 생각한다. – mpen

관련 문제