php5 이후에 저는 꽤 흥미로운 몇 가지 마법의 방법을 구현했습니다. 이전에는 프로세스 지향 프로그래밍 방법을 사용해 왔고 최근에는 oop에 대한 연구를 거의 하지 않았는데 꽤 흥미로웠습니다.
마법의 방법들 중 많은 것들이 단지 게으름을 위한 것 같아요. 제가 처음 PHP를 썼을 때, 블로그를 할 때 lifetype이라는 외국 오픈 소스 프레임워크를 사용했던 기억이 납니다. , 그러나 모든 개체는 프레임워크에서 구현되고 모든 데이터는 개체로 캡슐화됩니다.
그래서 DB에서 여러 가지를 선택한 후 루프에서 하나씩 객체로 캡슐화해야 하며 각 필드도 getField() 및 getField() 메서드를 구현해야 합니다. 작성하기가 정말 약간 번거롭습니다. , 반복적인 작업처럼 느껴집니다.
그런 다음 get(), set(), call(), callStatic()이라는 마법 메서드가 탄생하면서 이 문제가 완전히 해결되었습니다.
get() 및 set()은 클래스의 속성용이고, call()은 메서드용이며, callStatic()은 정적 클래스 메서드용입니다.
1. Get() 및 set() 매직 메서드:
객체를 인스턴스화한 후 클래스에 존재하지 않거나 액세스 권한이 없는 속성을 호출하면 PHP는 다음과 같이 get() 메서드를 호출합니다. 이런 방식으로 많은 코드를 절약하고 구조를 더 명확하게 만들 수 있을 뿐만 아니라 외부에서 클래스의 전용 멤버에 액세스할 수 있는 방법도 제공합니다.
예:
<?php class testGet { private $name = 'test'; } $test = new testGet(); $test->name;
위 코드를 실행하면 오류가 보고됩니다. PHP 치명적인 오류: /Library/WebServer/Documents/workspace/learn/call의 개인 속성 testGet::$name에 액세스할 수 없습니다. / a.php 7행
하지만 get() 메소드를 통해 접근할 수 있도록 수정해보겠습니다
<?php class testGet { private $name = 'test'; function get($property) { if ( isset($this->$property) ) return $this->$property; else return NULL; } } $test = new testGet(); echo $test->name . PHP_EOL;
이렇게 코드를 변경한 후 다시 접근하면 문제가 없을 것입니다.
참고: 속성이 정적으로 정의된 경우 get()을 통해 액세스할 때 오류도 보고됩니다. 그 이유는 정적 멤버가 클래스 자체에 속하고 인스턴스화로 인해 변경되지 않으므로 직접 테스트할 수 있기 때문입니다.
set() 메서드를 사용하면 클래스 속성의 동적 생성을 금지할 수 있어 후속 개발자나 프로그램 유지관리자가 불필요한 문제를 피할 수 있습니다.
funciton set($property) {
//$property는 속성의 이름을 받습니다
}
솔직히 oop의 디자인에는 많은 디자이너들이 직접 참여하게 됩니다. 문서가 없으면 후발자가 코드를 읽는 것은 여전히 매우 어려울 것입니다. 물론 후발자의 수준과 관련이 많습니다.
다음은 get과 set을 함께 사용하는 예입니다.
<?php class testGet { private $name = 'test'; function get($property) { if ( isset($this->$property) ) return $this->$property; else return NULL; } public function set($property, $value) { if ( isset($this->$property) ) $this->$property = $value; else return NULL; } } $test = new testGet(); $test->name = 'my test name'; echo $test->name . PHP_EOL;
function set($property, $value) {
//$property
에서 받은 속성의 이름//The $value가 받은 속성 이름
}
의 값입니다. 2. call() 및 callStatic() 메서드:
객체가 존재하지 않는 클래스의 메서드를 호출하는 경우 또는 액세스 권한이 없으면 call() 메소드가 자동으로 호출됩니다.
전에 동료가 나에게 왜 TP 프레임워크에는 사용할 수 없지만 상위 계층에서는 호출할 수 있는 하위 수준 메서드가 많이 있는지 물었던 것이 기억납니다. 실제로 작동하는 것은 call() 메서드입니다.
이 방법을 모르면 확실히 혼란스럽고 문제를 찾기 어려울 것입니다.
<?php abstract class Obj { private $objData = array(); /** * call魔术方法,如果对象请求的方法不存在或者没有权限访问的时候 * 调用魔术方法 */ public function call($name, $args) { $field = preg_match('/^get(\w+)/', $name, $matches); if ( $field && $matches[1] ) return $this->objData[strtolower($matches[1])]; $field = preg_match('/^set(\w+)/', $name, $matches); if ( $field && $matches[1] ) { return $this->objData[strtolower($matches[1])] = $args[0]; } } } class User extends Obj { } $user = new User(); $user->setName('test'); echo $user->getName();
User 클래스는 아무 작업도 수행하지 않지만 상속된 클래스의 call() 메서드를 통해 모든 작업(getName 및 setName)을 수행합니다.
함수 호출($methodName, $args) {
//$methodName
에서 호출한 메서드 이름//$argsarray
}
에서 전달한 매개변수 call()은 정적 클래스의 정적 메서드를 제공하는 callStatic() 메서드에 해당합니다.
예:
<?php abstract class Obj { private static $objData = array(); /** * call魔术方法,如果对象请求的方法不存在或者没有权限访问的时候 * 调用魔术方法 */ public static function callStatic($name, $args) { $field = preg_match('/^get(\w+)/', $name, $matches); if ( $field && $matches[1] ) return self::$objData[strtolower($matches[1])]; $field = preg_match('/^set(\w+)/', $name, $matches); if ( $field && $matches[1] ) { return self::$objData[strtolower($matches[1])] = $args[0]; } } } class User extends Obj { } User::setName('test'); echo User::getName() . PHP_EOL;
3. 지연된 정적 바인딩: 정적 개체
위 내용은 PHP의 매직 메소드인 __get(), __set(), __call(), __callStatic() 및 정적 사용법에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!