내 수업에서 속성 값을 설정하고 싶습니다. 나는 setter와 getter없이이 작업을 수행 할 수 있지만이 작업에 "올바른"방법을 알고 싶습니다. 이것은 로그인 스크립트 용이므로 등록 정보와 설정자는 모두 개인용입니다.클래스 내에서 설정자를 사용하여 속성을 설정해야합니까?
속성을 직접 설정하거나 setter 및 getter를 사용해야합니까?
내 수업에서 속성 값을 설정하고 싶습니다. 나는 setter와 getter없이이 작업을 수행 할 수 있지만이 작업에 "올바른"방법을 알고 싶습니다. 이것은 로그인 스크립트 용이므로 등록 정보와 설정자는 모두 개인용입니다.클래스 내에서 설정자를 사용하여 속성을 설정해야합니까?
속성을 직접 설정하거나 setter 및 getter를 사용해야합니까?
이 personnal 취향의 주로 문제 ... 당신은 클래스의 방법에서 개인 속성을 설정해야하는 경우
, 당신이 직접 그 속성에 액세스 할 수있는 말을 아마입니다.
그런 상황에서 setter/getter를 사용하는 이유는 속성이 설정 될 때마다 데이터에서 일부 조건 또는 계산이 수행되도록하려는 경우입니다. (!) 참고로
의견의 문제입니다. 전통적인 객체 지향 프로그래밍 원리는 예이라고 말합니다.하지만 실제로는 여러분에게 달려 있습니다.
속성을 private
으로 설정하는 경우 setter 메서드를 사용해야합니다. setter는 항상 public이어야하므로 다른 클래스와 메서드가 해당 속성에서 작동 할 수 있습니다. 클래스 외부에서 부동산에 액세스 할 이유가 없으면 설정자를 만들지 마십시오. 실제로는 중요하지 않으므로 설정하지 마십시오. 클래스 내에서 private 멤버 변수/속성에 항상 액세스 할 수 있습니다.
예, 사실입니다. 지적 해 주셔서 감사합니다. 좋아, 아마도 나는 setter와 getter와 함께있을 것 같다. getter가 필요하기 때문에 클래스 외부에서 값을 반향시켜야합니다. – jim
+1 이유는 setter를 사용하기 때문입니다. -1 세터의 공개 필요성에 대한 -1 (속성을 할당하기 전에 데이터를 조작/유효화하는 필터 일뿐입니다.) – chelmertz
chelmertz, 나는 당신과 동의해야 할 것입니다. 현재 저는 세터를 비공개로 설정했습니다. 나는 그것을 필요로하고 외부에서 바뀔 수는 없다. – jim
"마법"__get/__set 메서드는 모든 것을 위해 getter 및 setter를 만들 필요없이 사용할 수 있다는 것을 잊지 마십시오.
편집 : 멤버 변수 개인 또는 보호 된 경우는 getter 및 setter를 사용해야합니다. 그들이 공개적이라면 스타일의 문제입니다.하지만 나머지 수업과 일관성을 가져야합니다.
Setter/Getters를 사용하면 파생 클래스가 개체의 상태와 동작을보다 쉽게 수정/제한/향상 할 수 있습니다. 하지만 세터/게터를 너무 많이 할 수 있습니다. 그러면 약간 짜증이납니다. (특히 그들을 숨기지 않는 언어에서).
class Foo {
protected $x;
public function __construct($x) {
$this->setX($x);
}
public function setX($x) {
$this->x = $x;
}
public function something($y) {
// not using a getter here, it's only an example
echo $this->x * $y;
}
}
class DoubleFoo extends Foo {
public function setX($x) {
parent::setX($x*2);
}
}
$df = new DoubleFoo(1);
$df->something(5);
파스칼 없음, 실제로 내가하려는 일입니다. 속성을 설정하고 수업 외부에서 읽어야합니다. 나는 현재 setter를 비공개로하고 getter를 공개한다. – jim
그러나 모든 데이터 유형에 대한 계산 유형을 제공하지는 않지만 속성의 out 값만 필요합니다. – jim
오, 나는 그 질문을 올바르게 이해하지 못했을 것으로 생각한다. ;; 여전히, 내가 말한 것은 사실입니다. 클래스 내부에서 직접 속성에 액세스 할 것입니다. (물론 클래스 외부에서 액세스하려면 public getter를 사용하십시오.) *. –