소개
오버로딩에 대한 해석은 C++ 또는 Java와 같은 다른 객체 지향 언어와 비교하여 PHP에서 다릅니다. 여기서 이 용어는 동일한 이름의 메서드가 두 번 이상 있지만 인수 및/또는 반환 유형이 다른 클래스를 가질 수 있는 능력을 의미합니다. 반면에 PHP에서는 속성과 메서드를 동적으로 생성하는 기능을 오버로딩이라고 합니다. PHP의 마법의 방법 (이중 밑줄로 시작하는 메서드 이름)은 동적 속성 및 메서드를 설정하는 데 사용됩니다.
속성 오버로딩을 위해 다음과 같은 마법의 방법이 사용됩니다 -
구문
public __set ( string $name , mixed $value ) : void public __get ( string $name ) : mixed public __isset ( string $name ) : bool public __unset ( string $name ) : void
__set()은 보호되거나 비공개이거나 존재하지 않는 액세스할 수 없는 속성에 데이터를 쓰기 위해 실행됩니다.
__get()은 액세스할 수 없는 속성에서 데이터를 읽습니다.
__isset()은 접근할 수 없는 속성에 대해 isset() 또는 empty()를 호출합니다.
__unset()은 액세스할 수 없는 속성에서 unset()이 호출될 때 호출됩니다.
다음 코드에서 myprop이라는 동적 속성은 설정, 검색 및 설정 해제됨
예시
<?php class myclass{ public function __set($name, $value){ echo "setting $name property to $value \n"; $this->$name = $value; } public function __get($name){ echo "value of $name property is "; return $this->$name; } public function __isset($name){ return isset($this->$name); } public function __unset($name){ unset($this->$name); } } $obj = new myclass(); $obj->myprop="test"; echo $obj->myprop . "\n"; var_dump (isset($obj->myprop)); unset($obj->myprop); var_dump (isset($obj->myprop)); ?>
출력
출력은 아래와 같습니다 -
setting myprop property to test test bool(true) bool(false)
메서드 오버로딩
메소드를 동적으로 설정하는 데 사용되는 두 가지 매직 메소드는 __call() 및 __callStatic()
입니다.public __call ( string $name , array $arguments ) : mixed public static __callStatic ( string $name , array $arguments ) : mixed
__call()은 개체 컨텍스트에서 액세스할 수 없는 메서드를 호출할 때 트리거됩니다.
__callStatic()은 정적 컨텍스트에서 액세스할 수 없는 메서드를 호출할 때 트리거됩니다.
다음 예제는 PHP에서 메소드 오버로딩을 보여줍니다.
예시
<?php class myclass{ public function __call($name, $args){ // Note: value of $name is case sensitive. echo "Calling object method $name with " . implode(" ", $args). "\n"; } public static function __callStatic($name, $args){ echo "Calling static method $name with " . implode(" ", $args). "\n"; } } $obj = new myclass(); $obj->mymethod("Hello World!"); myclass::mymethod("Hello World!"); ?>
출력
위의 코드는 다음과 같은 결과를 생성합니다.
Calling object method mymethod with Hello World! Calling static method mymethod with Hello World!