* @var obj => $ReflectionObject = propriedade que representa o objeto $ReflectionObject
* @var obj => $ReflectionProperty = propriedade que representa o objeto $ReflectionProperty
* @var obj => $ReflectionMethod = propriedade que representa o objeto $ReflectionMethod
* @var obj => $ReflectionParameter = propriedade que representa o objeto $ReflectionParameter
* @var bol => $reflect_object = true se o método object() for invocado
* @var bol => $reflect_property = true se o método property() for invocado
* @var bol => $reflect_method = true se o método method() for invocado
* @var bol => $reflect_parameter = true se o método parameter() for invocado
*/private$ReflectionObject;
private$ReflectionProperty;
private$ReflectionMethod;
private$ReflectionParameter;
private$reflect_object=false;
private$reflect_property=false;
private$reflect_method=false;
private$reflect_parameter=false;/**
* @param obj => $object = objeto a ser refletido
*/public functionobject(object $object) :object{$this->reflect_object=true;$this->ReflectionObject= new \ReflectionObject($object);
return$this;
}/**
* @param str => $class_name = nome da classe o qual a properiedade ser refletida pertence
* @param str => $property = nome da properiedade a ser refletida
*/public functionproperty(string $class_name,string $property) :object{$this->reflect_property=true;$this->ReflectionProperty= new \ReflectionProperty($class_name,$property);
return$this;
}/**
* @param str => $class_name = nome da classe o qual o método ser refletido pertence
* @param str => $method = nome do método a ser refletido
*/public functionmethod(string $class_name,string $method) :object{$this->reflect_method=true;$this->ReflectionMethod= new \ReflectionMethod($class_name,$method);
return$this;
}/**
* @param str => $class_name = nome da classe o qual o parametro a ser refletido pertence
* @param str => $method = nome do método o qual o parametro a ser refletido pertence
* @param str => $parameter = nome do parametro a ser refletido
*/public functionparameter(string $class_name,string $method,string $parameter) :object{$this->reflect_parameter=true;$this->ReflectionParameter= new \ReflectionParameter(array($class_name,$method),$parameter);
return$this;
}
public function__call($methodName,$args){
if($this->reflect_object){
returncall_user_func_array(array($this->ReflectionObject,$methodName),$args);
}
if($this->reflect_property){
returncall_user_func_array(array($this->ReflectionProperty,$methodName),$args);
}
if($this->reflect_method){
returncall_user_func_array(array($this->ReflectionMethod,$methodName),$args);
}
if($this->reflect_parameter){
returncall_user_func_array(array($this->ReflectionParameter,$methodName),$args);
}
}
}// Digamos que você tenha no seu projeto a classe Client do pacote Guzzle$FullReflectionObject= newFullReflectionObject;var_dump($FullReflectionObject->object(newGuzzleHttp\Client)->getMethods());var_dump($FullReflectionObject->property('GuzzleHttp\Client','config')->isPrivate());var_dump($FullReflectionObject->method('GuzzleHttp\Client','buildUri')->isPrivate());var_dump($FullReflectionObject->parameter('GuzzleHttp\Client','send','options')->getDefaultValue());