2015-01-20 5 views
-1

속성을 개인으로 설정하는 동안 데이터를 생성자에 간단하게 전달할 수있는 경우 Setter를 사용하는 이유는 무엇입니까?생성자를 통해 인수를 전달하는 대신 setter를 사용하는 것은 무엇입니까?

예 :

class recover_password{ 
    private $password; 

    function __construct($password){ 
     $this->password = $password; 
     $this->show_pass(); 
    } 

    function show_pass(){ 
     echo $this->password; 
    }  
} 

class recover_password{ 
    private $password; 

    function set_pass($password){ 
     $this->password = $password; 
     $this->show_pass(); 
    } 

    function show_pass(){ 
     echo $this->password; 
    }  
} 

//First object 
$rec_pass = new recover_password(12345); 

//Second object 
$rec_pass = new recover_password(); 
$rec_pass->set_pass(12345); 
+0

또한 함수를 public 또는 private으로 설정해야합니다. – Daan

+1

그리고'__construct'를 호출 한 후에'$ this-> password'를 변경해야한다면? –

+0

코딩 스타일 (또는 코딩 스타일)의 문제 일뿐입니다. 인터넷에서 검색하고'도메인 중심 디자인 '에 대해 읽어보십시오. 당신은 올바른 길을 가고 있습니다. 생성자에 의해 초기화되고'getters 만 '갖는 불변 객체는'값 객체 '라고 불리우며'DDD '에서 중요한 개념입니다. – axiac

답변

2

는 ("? 세터의 포인트는 무엇인가") 처음 제목에 광범위한 질문에 대답하려면 :

당신은 세터 를 사용하여 직접 등록에 대한 액세스를 허용하기 위해 나란히 놓이는으로 ($obj->prop = 'foo')를 사용하면 개체에 설정할 수있는 속성의 종류와 설정할 수있는시기를보다 효과적으로 제어 할 수 있습니다. setter 함수는 설정하려고하는 값을 수정하거나 완전히 거부 할 수 있습니다. 이것은 간단한 속성 할당으로는 불가능합니다.

코드에서 질문에 대답하기 ("왜/대신 단지 __construct($foo) 외에 setFoo($foo) 방법을 추가?") : 그것은 당신이 생성 할 객체의 종류에 따라 달라집니다

. 개체를 인스턴스화 할 때 한 번 데이터를 가져 와서 해당 값을 수정할 수 없게하는 것이 절대적으로 합리적입니다. 인스턴스 생성 후 언제든지 값을 설정할 수있는 객체를 갖는 것도 절대적으로 합리적입니다. 두 경우 모두 다른 상황에서 유용합니다.

두 번 모두를 수행 할 수도 있습니다. 생성자에 인수를 요구하면 항상 객체가 항상 특정 값을 갖게됩니다. 그런 다음이 값을 설정자를 통해 수정할 수 있습니다. 두 항목을 함께 사용하면 객체가 항상 유효한 상태 인 것입니다.; 즉, 특정 값을 가지지 않고 객체의 인스턴스를 가질 수 없다는 것입니다. 예컨대 :

class Foo { 

    protected $bar; 

    public function __construct(Bar $bar) { 
     $this->bar = $bar; 
    } 

    public function setBar(Bar $bar) { 
     $this->bar = $bar; 
    } 

} 

이 클래스는 항상 올바른 유형의 $bar (Bar)의 값이 보장됩니다. 필요에 따라 값을 수정할 수 있지만 유효하지 않은 값을 설정하거나 값을 가지지 않는 것은 불가능합니다. 생성자를 떠나면 Bar없이 클래스를 인스턴스화 할 수 있다는 것을 의미합니다. 설정자를 생략하면 인스턴스화 후에 수정할 수 없다는 것을 의미합니다.

관련 문제