Automattic\WooCommerce\Internal\DependencyManagement

RuntimeContainer::instantiate_class_using_reflectionprivateWC 1.0

Get an instance of a class using reflection. This method recursively calls 'get_core' (which in turn calls this method) for each of the arguments in the 'init' method of the resolved class (if the method is public and non-static).

Method of the class: RuntimeContainer{}

No Hooks.

Returns

Object. The resolved object.

Usage

// private - for code of main (parent) class only
$result = $this->instantiate_class_using_reflection( $class_name, $resolve_chain ): object;
$class_name(string) (required)
The name of the class to resolve.
$resolve_chain(array) (required)
Classes already resolved in this resolution chain. Passed between recursive calls to the method in order to detect a recursive resolution condition.

RuntimeContainer::instantiate_class_using_reflection() code WC 9.9.4

private function instantiate_class_using_reflection( string $class_name, array &$resolve_chain ): object {
	$ref_class = new \ReflectionClass( $class_name );
	$instance  = $ref_class->newInstance();
	if ( ! $ref_class->hasMethod( 'init' ) ) {
		return $instance;
	}

	$init_method = $ref_class->getMethod( 'init' );
	if ( ! $init_method->isPublic() || $init_method->isStatic() ) {
		return $instance;
	}

	// phpcs:disable WordPress.Security.EscapeOutput.ExceptionNotEscaped

	$init_args          = $init_method->getParameters();
	$init_arg_instances = array_map(
		function ( \ReflectionParameter $arg ) use ( $class_name, &$resolve_chain ) {
			$arg_type = $arg->getType();
			if ( ! ( $arg_type instanceof \ReflectionNamedType ) ) {
				throw new ContainerException( "Error resolving '$class_name': argument '\${$arg->getName()}' doesn't have a type declaration." );
			}
			if ( $arg_type->isBuiltin() ) {
				throw new ContainerException( "Error resolving '$class_name': argument '\${$arg->getName()}' is not of a class type." );
			}
			if ( $arg->isPassedByReference() ) {
				throw new ContainerException( "Error resolving '$class_name': argument '\${$arg->getName()}' is passed by reference." );
			}
			return $this->get_core( $arg_type->getName(), $resolve_chain );
		},
		$init_args
	);

	// phpcs:enable WordPress.Security.EscapeOutput.ExceptionNotEscaped

	$init_method->invoke( $instance, ...$init_arg_instances );

	return $instance;
}