PHP 반사 원리 와 용법 깊이 분석
반사 라 고 하면 실제로 두 가지 개념 을 포함한다.
1.파라미터 검출
함수 에 들 어 오 는 매개 변수 유형 이 합 법 적 인지 판단 해 야 할 때 가 있 습 니 다.
이 때 is 사용 가능a、is_subclass_of 검 측.반사 와 결합 하여 더 많은 검 사 를 한다.
2.동적 호출
의존 주입 에서 흔히 볼 수 있 는 이런 용법,예 를 들 어 Laravel 5.5 중의Container.php
public function build($concrete)
{
// If the concrete type is actually a Closure, we will just execute it and
// hand back the results of the functions, which allows functions to be
// used as resolvers for more fine-tuned resolution of these objects.
if ($concrete instanceof Closure) {
return $concrete($this, $this->getLastParameterOverride());
}
$reflector = new ReflectionClass($concrete);
// If the type is not instantiable, the developer is attempting to resolve
// an abstract type such as an Interface of Abstract Class and there is
// no binding registered for the abstractions so we need to bail out.
if (! $reflector->isInstantiable()) {
return $this->notInstantiable($concrete);
}
$this->buildStack[] = $concrete;
$constructor = $reflector->getConstructor();
// If there are no constructors, that means there are no dependencies then
// we can just resolve the instances of the objects right away, without
// resolving any other types or dependencies out of these containers.
if (is_null($constructor)) {
array_pop($this->buildStack);
return new $concrete;
}
$dependencies = $constructor->getParameters();
// Once we have all the constructor's parameters we can create each of the
// dependency instances and then use the reflection instances to make a
// new instance of this class, injecting the created dependencies in.
$instances = $this->resolveDependencies(
$dependencies
);
array_pop($this->buildStack);
return $reflector->newInstanceArgs($instances);
}
상기 코드 는 먼저 패 킷 을 닫 았 는 지 여 부 를 판단 하고,만약 그렇다면 바로 되 돌려 줍 니 다.아니면 통과new ReflectionClass($concrete);
반사 류 의 인 스 턴 스 를 생 성 한 다음 에 이러한 구조 함수 와 파 라 메 터 를 가 져 와 초기 화 하 는 과정 을 진행 합 니 다.주의 하 다.
반사 에서 비교적 중요 한 용법 invoke
이 종 류 를 알 고 있 을 때 구조 ReflectionMethod 를 통 해 직접 호출 할 수 있 습 니 다.예 를 들 어:
class HelloWorld {
public function sayHelloTo($name) {
return 'Hello ' . $name;
}
}
$reflectionMethod = new ReflectionMethod('HelloWorld', 'sayHelloTo');
echo $reflectionMethod->invoke(new HelloWorld(), 'Mike');
이 클래스 를 모 를 때 클래스 를 아 는 대상 은 ReflectionObject 로 ReflectionMethod 를 가 져 와 서 호출 할 수 있 습 니 다.예 를 들 어:
class HelloWorld {
public function sayHelloTo($name) {
return 'Hello ' . $name;
}
}
$hello = new HelloWorld();
$refObj = new ReflectionObject($hello);
$refMethod = $refObj->getMethod('sayHelloTo');
echo $refMethod->invoke($hello,'Mike');
호출 프로 세 스 는 일반적으로 반사 류 ReflectionClass/반사 대상 ReflectionObject 의 인 스 턴 스 를 가 져 온 다음 ReflectionMethod 를 가 져 온 후 invoke 입 니 다.3.주석 가 져 오기,문서 생 성
예 를 들 어 PHPDoc.
4.주석,증강 판 주석,일정한 규칙 에 부합
예 를 들 어 어떤 프레임 의 길 은 바로 주 해 를 통 해 이 루어 진 것 이다.
5.반 사 를 위해 반사 하지 마라
PHP 는 동적 언어 로 문자열 을 통 해 클래스 나 함 수 를 직접 호출 할 수 있 습 니 다.다음 과 같 습 니 다.
class HelloWorld {
public function sayHelloTo($name) {
return 'Hello ' . $name;
}
}
$hello = 'HelloWorld';
$helloSay = 'sayHelloTo';
$helloIntance = new $hello;
echo $helloIntance->$helloSay('Mike');
그럼 왜 반사 가 필요 한 거 죠?더 많은 PHP 관련 내용 에 관심 이 있 는 독자 들 은 본 사이트 의 주 제 를 볼 수 있다.
본 논문 에서 말 한 것 이 여러분 의 PHP 프로 그래 밍 에 도움 이 되 기 를 바 랍 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
laravel에 yo에서 angularJs&coffeescript를 사용할 수 있도록 한다.먼저 yo 명령을 사용할 수 있어야하므로 아래에서 설치 global에 설치한 곳에서 laravel의 프로젝트 루트로 이동. 클라이언트 코드를 관리하는 디렉토리를 만들고 이동합니다. 클라이언트 환경 만들기 이것으로 히...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.