내 클래스의 정의 된 필드에 php의 __get () 및 __set ()을 어떻게 사용합니까?
-
19-09-2019 - |
문제
나는 잘 읽었습니다 과부하시 PHP 사양, 그리고 대부분의 예제는 단순히 사용자 정의 필드 (stdClass와 유사)를 정의하는 것을 허용하는 것으로 보입니다.
그러나 수업에서 정의 된 개인 분야는 어떻습니까? 이것들은 어떻게 검색/할당되어야합니까? 가능한 값을 켜고 특정 값에 따라 행동 할 수 있습니다.
class A
{
private $name;
private $age;
public function __get( $var )
{
switch ( $var )
{
case 'name':
return $this->name;
break;
case 'age':
return $this->age+10; // just to do something different ;)
break;
default:
break;
}
}
}
이것이 최선의 방법입니까, 아니면 일반적으로 인정되는 모범 사례가 있습니까? (클래스 내부의 클래스 변수를 루프 할 수 있는지는 모르겠지만 대부분의 상황에서는 모든 것을 반환하고 싶지 않기 때문에 적절하지 않습니다.)
해결책
이로 인해 효과적으로 공개적으로 공개되며 일반적으로 공개 속성을 사용하는 것보다 아무것도 얻지 못합니다 (그러나 성과 페널티를 지불하고 더 많은 코드, 위험 버그를 작성해야합니다).
공공 속성을 사용하는 기존 코드가 있고 갑자기 getter/setter가 필요한 경우에만 사용하십시오 (예 : 예 : age
).
속성을 읽거나 작성할 때 일부 코드를 실행 해야하는 경우 (예 : 데이터베이스에서 읽기 전용 또는 게으르게 가져 오는 경우) 일반적인 getters/setters를 사용해야합니다 (getAge()
/setAge()
).
다른 팁
나는 광범위한 사용을한다 __get()
그리고 __set()
그리고 내 속성을 선언했습니다 public
. 나는 두 세계의 최고를 원했기 때문에 IDE가 클래스 인스턴스의 이름을 입력 할 때 나에게 공개 속성을 나열 할 수있었습니다. 속성이 공개적이고 클래스 외부에 보이지만 PHP 인터셉터 방법을 어떻게 작동 시켰습니까?
unset () 속성 원해요 __get()
그리고 __set()
수업 시간에 사용됩니다 __construct()
.
이 방법을 알아 내면 몇 번의 좌절감이 필요했습니다 :-)
나는 많은 사람들이 그들을 사용하는 것을 보지 못하지만 여기에 내가 생각하는 것이 있습니다.
개인 변수를 검색하려면 외부에서 액세스 할 수있는 정의 된 변수 목록을 제공하려고합니다. 그런 다음 요청 된 변수가 해당 배열에 있는지 확인하십시오. 그렇다면 변경/받을 수 있습니다. 그렇지 않은 경우 오류 또는 반환 NULL.
솔직히, 이에 대한 구현은 실제로 사례 별입니다. 모든 정보를 단일 배열로 저장 한 사용자 클래스가있는 경우 $ user-> name을 $ user-> account [ 'name']에서 가져올 수 있습니다.
또한 더 많은 사례별로 비밀번호를 해싱과 같은 값을 제공하기 전에 수정을 할 수 있습니다.