오버로딩

오버로딩

■다형성

하나의 프로퍼티가 여러 가지 상태를 가질 수 있는 것을 의미한다.

PHP에서는 다형성을 오버로딩(overloading)과 지연 정적 바인딩(late static bindings)을 통해 구현한다.

■오버로딩(overloading)

PHP에서는 다른 언어와 달리 프로퍼티나 메소드를 동적으로 '생성한다'는 의미로 오버로딩을 사용한다.

이렇게 동적으로 생성된 멤버는 해당 클래스의 매직 메소드(magic method)를 통해 다양한 형태로 처리할 수 있다.

오버로딩되는 메소드는 반드시 public으로 정의되어야 한다.

※ 매직 메소드(magic method)란 특수한 기능을 위해 미리 정의된 메소드를 가리킨다. 메소드 이름과 매개변수, 반환 타입, 호출의 타이밍만이 정해져 있고, 내용은 사용자가 직접 작성하여 사용할 수 있다. PHP에서 모든 매직 메소드의 이름은 두 개의 언더스코어(__)로 시작한다.

■프로퍼티 오버로딩(property overloading)

PHP에서는 접근 불가 프로퍼티(inaccessible property)를 오버로딩하기 위해 매직 메소드를 구현해야 한다.

public void __set(string $name, mixed $value) public mixed __get(string $name) public bool __isset(string $name) public bool __unset(string $name)

__set() : 접근 불가 프로퍼티의 값을 설정할 때 호출된다.

__get() : 접근 불가 프로퍼티의 값을 읽을 때 호출된다.

__isset() : 접근 불가 프로퍼티에 대해 isset() 이나 empty()가 호출될 때 호출된다.

__unset() : 접근 불가 프로퍼티에 대해 unset()이 호출될 때 호출된다.

※ 접근불가 프로퍼티(inaccessible property)란 현재 영역에서는 정의되어 있지 않거나, 접근 제어로 인해 보이지 않는 프로퍼티를 의미한다.

class PropertyOverloading { private $data = array(); // 오버로딩된 변수가 저장될 배열 생성 public $declared = 10; // public으로 선언된 프로퍼티 private $hidden = 20; // private로 선언된 프로퍼티 public function __set($name, $value) { echo "$name 프로퍼티를 {$value}의 값으로 생성합니다!"; $this->data[$name] = $value; } public function __get($name) { echo "$name 프로퍼티의 값을 읽습니다!"; if (array_key_exists($name, $this->data)) { return $this->data[$name]; } else { return null; } } public function __isset($name) { echo "$name 프로퍼티가 설정되어 있는지 확인합니다!"; return isset($this->data[$name]); } public function __unset($name) { echo "$name 프로퍼티를 해지합니다!"; unset($this->data[$name]); } } $obj = new PropertyOverloading(); // PropertyOverloading 객체 생성 $obj->prop = 1; // 동적 프로퍼티 생성 echo $obj->prop; // 동적 프로퍼티에 접근 var_dump(isset($obj->prop)); // 동적 프로퍼티로 isset() 함수 호출 unset($obj->prop); // 동적 프로퍼티로 unset() 함수 호출 var_dump(isset($obj->prop)); // 동적 프로퍼티로 isset() 함수 호출 echo $obj->declared; // 선언된 프로퍼티는 오버로딩을 사용하지 않음. echo $obj->hidden; // private로 선언된 프로퍼티는 클래스 외부에서 접근할 수 없으므로, 오버로딩을 사용함.

■메소드 오버로딩(method overloading)

PHP에서는 접근불가 메소드(inaccessible method)를 오버로딩하기 위해 매직 메소드를 구현해야 한다.

public mixed __call(string $name, array $arguments) public static mixed __callStatic(string $name, array $arguments)

__call() : 클래스 영역에서 접근 불가 메소드를 호출할 때 호출된다.

__callStatic() : 정적 영역에서 접근 불가 메소드를 호출할 때 호출된다.

class MethodOverloading { public function __call($name, $arguments) { echo join(", ", $arguments)."에서 접근 불가 메소드를 호출합니다!"; } public static function __callStatic($name, $arguments) { echo join(", ", $arguments)."에서 접근 불가 메소드를 호출합니다!"; } } $obj = new MethodOverloading(); // MethodOverloading 객체 생성 $obj->testMethod("클래스 영역"); // 클래스 영역에서 접근 불가 메소드 호출 MethodOverloading::testMethod("정적 영역"); // 정적 영역에서 접근 불가 메소드 호출

$obj->testMethod("클래스 영역") 에서 동적으로 testMethod()를 생성하고, 바로 그 값에 접근한다.

이때 클래스 영역에서 생성된 동적 메소드에 접근하므로, 사용자가 구현한 __call()이 호출된다.

MethodOverloading::testMethod("정적 영역") 에서 MethodOverloading 클래스의 정적 영역에서 동적 메소드에 접근한다. 정적 영역에서 생성된 동적 메소드에 접근하므로, 사용자가 구현한 __callStatic()이 호출된다.

from http://woong971.tistory.com/55 by ccl(A) rewrite - 2021-11-01 13:26:52