객체 지향편집 중인 객체에는 성찰하는 능력이 부여되는데, 이 성찰 과정이 성찰입니다.
성찰, 직관적 이해는 도착지에 따라 출발점과 출처를 알아내야 합니다. bare Object, 이 객체를 통해서만 그것이 속한 클래스와 어떤 메소드를 가지고 있는지 알 수 있습니다.
Reflection은 PHP가 실행 중인 상태에서 PHP 프로그램을 확장하여 클래스, 메소드에 대한 세부 정보를 내보내거나 추출하는 것을 말합니다. annotations를 포함한 속성, 매개변수 등을 포함합니다. 동적으로 정보를 얻고 객체 메서드를 동적으로 호출하는 이 기능을 리플렉션 API라고 합니다
다음 코드를 예로 들어보세요
class HandsonBoy { public $name = 'chenqionghe'; public $age = 18; public function set($name,$value) { echo '您正在设置私有属性'.$name.'<br >值为'.$value.'<br>'; $this->$name = $value; } public function get($name) { if(!isset($this->$name)) { echo '未设置'.$name; $this->$name = "正在为你设置默认值".'<br>'; } return $this->$name; } } $boy = new HandsonBoy(); echo $boy->name.'<br />'; $boy->hair = 'short';
이 학생 개체의 메서드를 가져오고 속성 목록을 만드는 방법은 무엇입니까? 리플렉션을 사용하여 이를 달성할 수 있습니다. 코드는 다음과 같습니다
$reflect = new ReflectionObject($boy); $props = $reflect->getProperties(); //获取属性的名字 foreach($props as $prop) { print $prop->getName().PHP_EOL; } //获取对象方法列表 $methos = $reflect->getMethods(); foreach($methos as $method) { print $method->getName().PHP_EOL; }
리플렉션 API 없이 클래스 함수를 사용하여 개체 속성의 연관 배열을 반환할 수도 있습니다. 추가 정보: (공개 속성 및):
//返回对象属性的关联数组 var_dump(get_object_vars($boy)); //类属性 var_dump(get_class_vars(get_class($boy))); //返回由类的属性的方法名组成的数组 var_dump(get_class_methods(get_class($boy)));
리플렉션 API의 기능은 확실히 더 강력하며 메서드의 액세스 권한을 포함하여 이 클래스의 프로토타입을 복원할 수도 있습니다. 다음은 코드를 간단히 캡슐화한 것입니다. of a Printing class
/** * @param $classObject 对象或者类名 */ function getClass($classObject) { $object = new ReflectionClass($classObject); $className = $object->getName(); $Methods = $Properties = array(); foreach($object->getProperties() as $v) { $Properties[$v->getName()] = $v; } foreach($object->getMethods() as $v) { $Methods[$v->getName()] = $v; } echo "class {$className}\n{\n"; is_array($Properties) && ksort($Properties); foreach($Properties as $k=>$v) { echo "\t"; echo $v->isPublic() ? 'public' : '',$v->isPrivate() ? 'private' :'',$v->isProtected() ? 'protected' : ''; $v->isStatic() ? 'static' : ''; echo "\t{$k}\n"; } echo "\n"; if(is_array($Methods)) ksort($Methods); foreach($Methods as $k=>$v) { echo "\tfunction {$k}()\n"; } echo "}\n"; }
그뿐만 아니라 PHP 매뉴얼에 리플렉션 API에 대한 몇 가지 세부 정보가 있습니다. 10, 리플렉션은 클래스나 객체의 프로토타입을 완벽하게 설명한다고 말할 수 있습니다. 클래스 및 객체뿐만 아니라 함수, 확장 모듈, 예외 등에 대해서도 사용할 수 있습니다.
Reflection 문서 생성에 사용할 수 있으므로 파일의 클래스를 스캔하고 설명 문서를 하나씩 생성합니다. 리플렉션은 클래스의 내부 구조를 감지할 수 있으므로 플러그인 기능을 구현하는 데 사용할 수 있습니까? 아니면 동적 목적으로 사용할 수 있습니까? 다음은 간단한 예입니다. 는 간단한 예입니다
<?php class mysql { function connect($db) { echo "连接到数据库{$db[0]}".PHP_EOL; } } class sqlproxy { private $target; public function construct($tar) { $this->target[] = new $tar; } public function call($name,$args) { foreach($this->target as $obj) { $r = new ReflectionClass($obj); if($method = $r->getMethod($name)) { if($method->isPublic() && !$method->isAbstract()) { echo "方法前拦截记录LOG".PHP_EOL; $method->invoke($obj,$args); echo "方法后拦截".PHP_EOL; } } } } } $obj = new sqlproxy('mysql'); $obj->connect('chenqionghe');
여기서 실제 동작 클래스는 mysql 클래스인데, sqlproxy는 실제 클래스 연산이 아닌 동적으로 전달된 매개변수를 구현하고, 메서드 실행 전후를 가로채서 동적으로 변경해 줍니다. 이것은 단순한 동적 프록시입니다.
일반적인 개발에서 리플렉션을 사용하는 곳은 많지 않습니다. 하나는 객체를 디버깅하는 것이고, 다른 하나는 MVC 및 플러그인 개발에서 클래스 정보를 얻는 것입니다. 리플렉션의 사용은 매우 일반적이지만 리플렉션도 매우 비쌉니다. 대안을 찾을 수 있다면 남용하지 마세요.
PHP에는 이 메커니즘을 통해 일부 리플렉션 기능을 구현할 수 있습니다. 많은 경우 리플렉션을 잘 활용하면 코드를 우아하고 간결하게 유지할 수 있지만, 리플렉션을 사용하면 클래스의 캡슐화가 파괴될 수도 있습니다. 또는 노출되어서는 안 되는 메소드 속성이 강제로 노출된다는 점은 장점이기도 하고 단점이기도 합니다.
위 내용은 PHP에서 리플렉션이란 무엇입니까? Reflection 사용 예시에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!