Automattic\WooCommerce\Internal\DependencyManagement

AbstractServiceProvider::reflect_class_or_callable()privateWC 1.0

Check if a combination of class name and concrete is valid for registration. Also return the class injection method if the concrete is either a class name or null (then use the supplied class name).

Method of the class: AbstractServiceProvider{}

No Hooks.

Return

\ReflectionFunctionAbstract|null. A reflection instance for the $class_name injection method or $concrete injection method or callable; null otherwise.

Usage

// private - for code of main (parent) class only
$result = $this->reflect_class_or_callable( $class_name, $concrete );
$class_name(string) (required)
The class name to check.
$concrete(mixed) (required)
The concrete to check.

AbstractServiceProvider::reflect_class_or_callable() code WC 8.7.0

private function reflect_class_or_callable( string $class_name, $concrete ) {
	if ( ! isset( $concrete ) || is_string( $concrete ) && class_exists( $concrete ) ) {
		$class = $concrete ?? $class_name;

		if ( ! method_exists( $class, Definition::INJECTION_METHOD ) ) {
			return null;
		}

		$method = new \ReflectionMethod( $class, Definition::INJECTION_METHOD );

		$missing_modifiers = array();
		if ( ! $method->isFinal() ) {
			$missing_modifiers[] = 'final';
		}
		if ( ! $method->isPublic() ) {
			$missing_modifiers[] = 'public';
		}
		if ( ! empty( $missing_modifiers ) ) {
			throw new ContainerException( "Method '" . Definition::INJECTION_METHOD . "' of class '$class' isn't '" . implode( ' ', $missing_modifiers ) . "', instances can't be created." );
		}

		return $method;
	} elseif ( is_callable( $concrete ) ) {
		try {
			return new \ReflectionFunction( $concrete );
		} catch ( \ReflectionException $ex ) {
			throw new ContainerException( "Error when reflecting callable: {$ex->getMessage()}" );
		}
	}

	return null;
}