2012-04-28 3 views
0

올바르게 이해하면 __set()을 사용하여 공개/비공개 속성에 액세스 할 수있는 클래스 변수를 즉시 만들 수 있습니다.속성별로 유효성 검사가 다른 마법과 __set()을 사용하는 방법은 무엇입니까? (PHP)

그것은 사용하는 것 같다 :

__set($name,$value) { 
    $this->data[$name] = $value; 
} 

OR :

__set($name,$value) { 
    $this->$name = $value; 
} 

을 ... 것 안팎 쓰레기의 모든 종류의 두 결과.

개별 설정자 (변경자)를 사용하여 보호 된/개인 속성마다 1 개씩 개별 유효성 검사 컨트롤이 있지만 설정자를 많이 작성해야합니다.

매직 __set()을 활용하고 속성에 따라 유효성을 검사 할 수있는 방법이 있습니까?

예. 예를 들어

class stuff { 

    private $name; // alphabet, limit 10 chars 
    private $size; // integers 1 - 10; 
    private $price; // decimals 0.000 - 999.999 

    __set($property,$value) { 
    $this->$property = $value; 
    } 

} 

$thing = new stuff(); 
$thing->name = 1234; 
$thing->size = 'b'; 
$thing->price = -40; 

나쁜 할당을 어떻게 확인 하시겠습니까?

+1

내가 백업 할 수있는 것보다 의견이 있지만, 나는 마술 방법을 피하려고합니다. 또한 속성에 대한 사용자 지정 논리가 필요한 경우 세터를 만들 수도 있습니다. 이는 로직에 편리한 위치를 제공합니다. – Corbin

+0

나는 setter를 비공개로 만들고 __set()을 사용하여 액세스하고 반환 값을 얻을 수 있다고 생각했다. 그렇게하면 $ thing-> name = 1234를 사용할 수 있습니다. 여전히 개별적인 설정 기능이 있습니다. –

+0

그래, 내가 그렇게한다면 세터를 공개적으로 남겨 둘 것이다. (그리고 다시, 나는 __set과 __get에 대해 크게 편파적이다. 그들이 제공하는 '마법'은 명시 적 문서가 없어도 외부에서 클래스의 구조를 이해하는 것을 어렵게 만든다.) – Corbin

답변

0

배열을 만들어 유효성 검사기로 각 속성을 매핑 한 다음 __set 메서드에서 해당 속성 및 값에 대해 지정된 유효성 검사기를 실행할 수 있습니다.

1

그건 너에게 달렸어. 객체의 속성을 설정하는 마법 메서드를 사용하려면 클래스가 데이터 유효성 검사를 담당하는지 또는 다른 객체 (또는 객체 집합) 작업인지 여부를 결정해야합니다.

+0

다른 객체 이 물체에 들어가는 것을 확인해 주시겠습니까? 다른 객체가이 객체의 속성에 대해 너무 많이 알고 있어야합니까? –

+0

그것은 논쟁의 여지가 있습니다. 유효성 검사를 특별히 처리하는 객체를 가지면 IMHO가 좋지 않을 것입니다. 다른 옵션을 만들 때 특정 선택 항목에 들어가야합니다 (예 : __set()을 사용하도록 선택). –