Reflection은 클래스의 내부 구조를 감지할 수 있으며 플러그인 기능을 구현하기 위한 후크 또는 동적 프록시로 사용될 수 있습니다.
Reflection 관련 API
클래스 및 객체 관련 함수
get_object_vars get_class_methods get_class_vars get_class get_parent_class method_exists property_exists trait_exists
Reflection 관련 API 클래스#🎜🎜 #
reflectiontype reflectionproperty reflectionobject reflectionfunction reflectionmethod reflectionexception reflectionextension reflectionparameter reflectionfunctionabstract reflectiongenerator reflectionclass reflectionclassconstant reflectionzendextension리플렉션 API는 더욱 강력하며 메서드 액세스 권한 등을 포함하여 이 클래스의 프로토타입을 복원할 수도 있습니다.
애플리케이션 시나리오#🎜🎜 ##🎜 🎜#하나는 객체를 디버깅하는 것이고, 다른 하나는 클래스 정보를 얻는 것입니다. 일반적으로 다음과 같은 응용 방법이 있습니다.
문서 생성에서는 이를 사용하여 클래스를 스캔합니다. 파일 및 설명 문서 생성# 🎜🎜#MVC 및 플러그인 개발에서는 리플렉션이 일반적으로 사용됩니다. 일반적으로
을 사용하지 마십시오. 이는 클래스의 캡슐화를 파괴합니다. 리플렉션은 노출되어서는 안 되는 메서드나 속성을 강제로 노출시킬 수 있기 때문입니다.
#🎜 🎜#Example
다음은 다음을 사용하여 구현된 간단한 데이터베이스 동적 프록시입니다. 리플렉션 기능
동적 프록시를 기반으로 인터셉터 구현, 속성 메서드 추가, 클리핑 등 상상의 여지가 더 많습니다.class Mysql { function connect($db){ echo "connecting database ${db[0]}\r\n"; } } class SqlProxy { private $target; function __construct($tar){ $this->target[] = new $tar(); } function __call($name, $args){ if($method = $r->getMethod($name)){ if($method->isPublic() && !$method->isAbstract()){ echo "method before record \r\n"; $method->invoke($obj,$args); echo "method after record\r\n"; } } } } } $obj = new SqlProxy('Mysql'); $obj->connect('member');
Others# 🎜🎜#
echo와 print는 모두 언어 구조이지만 후자는 반환 값을 갖습니다.print_r과 var_dump는 여러 유형의 데이터를 인쇄할 수 있는 일반 함수이지만 후자는 데이터 유형을 출력합니다. 전자의 두 번째 매개변수는
Recommended: 《
PHP tutorial》
을 반환하도록 출력을 변경할 수 있습니다.위 내용은 PHP 반사 동적 프록시의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!