2010-12-03 8 views
0

이미 설정 한 매개 변수의 get 및 set 메서드를 재정의 할 수 있습니까? 그래서 내가 param을 설정할 때마다 나는 그것과 함께 작업 할 수있는/유효성을 검사 할 수 있습니까?PHP override get set methods

class User { 

    public $username; 

    function custom_set($name, $value) { 
     if(strlen($value) < 5) { 
     return "not long enough"; 
     } else { 
     $this->$name = $value; 
     } 

    } 
} 

$u = new User(); 
$u->username = "ted"; 
echo $u->username; 

출력 : "충분히하지"

이 내가 그냥 쓴 아주 간단한 예이며, 아마 내가 뭘하려고 오전 전달하기 위해 단지, 오류가 있습니다.

기본적으로 $u->username = "anything";을 호출 할 때마다 custom_set 메서드를 호출하려고합니다.

내가 생성자에서 검증을하고 싶지 않아 내가 $u->setVal("ted");

같은 별도의 방법을 만들려고하지 않는이 가능합니까?

+1

* 매개 변수 *를 저장하는 데 간단한 배열을 사용하지 않고 실제 * 개체 속성 *을 사용하지 않는 이유는 무엇입니까? 이런 식으로 여러분의'__set'과'__get' 매직 메소드는 항상 – dcestari

답변

2

해당 속성을 protected 또는 private으로 변경 한 다음 __get__set을 호출하면 원하는 논리로 위임 할 수 있습니다.

개인적으로 나는 아직 public 속성을 사용하는 것을 고려해야 할 경우가 있습니다.

+0

DTO도 있습니다. 적절한 코딩의 세계에 오신 것을 환영합니다. – Andrew

+0

DTO/VO는 적절한 사용법이지만'StdClass','SoapVar','SoapParam'과 같은 내부 클래스를 세지 않으면 PHP에서 사용 된 패턴을 거의 볼 수 없습니다. – prodigitalson

+0

그리고 저는 이것이 슬픈 것 (희귀 한 것에 대해)이라고 말하고 싶습니다. 사람들은 데이터 저장과 데이터 조작을 혼합하는 것을 중단해야하며 이러한 것들을 다른 객체로 분리해야합니다. – Andrew

0

Magic Methods에 대해 이야기하고 있습니까?

+0

이라고 불립니다. 정의되지 않은 속성에 대해서만 호출되기 때문에 "이 메소드는 정의되지 않은 속성의 데이터를 가져 오려고하면 자동으로 호출됩니다". 나는 위의 예제에서'$ username'과 같이 이미 정의한 속성에 대해 이야기하고 있습니다. – imns

3

__set 메소드를 구현하십시오. 액세스 할 수없는 속성에 액세스하려고 시도 할 때 호출됩니다. 이 private 또는 protected를 선언하지 않는 한이 작동하지 않도록

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

참고 그러나, $username는 공공 재산이다.

+0

__get – Webnet