Fixes in the dependency injection engine for PHP 8 compatibility
- One dummy class used for tests had a 'final private' method, this is not allowed in PHP 8 and so the method is now just 'private'. - The AbstractServiceProvider class was using ReflectionParameter::getClass. This is deprecated in PHP8 and thus that usage has been replaced with an utility method that uses the recommended replacement.
This commit is contained in:
parent
51912c659d
commit
042e2cd0bb
|
@ -45,7 +45,7 @@ abstract class AbstractServiceProvider extends \Automattic\WooCommerce\Vendor\Le
|
|||
$default_value = $argument->getDefaultValue();
|
||||
$definition->addArgument( new RawArgument( $default_value ) );
|
||||
} else {
|
||||
$argument_class = $argument->getClass();
|
||||
$argument_class = $this->get_class( $argument );
|
||||
if ( is_null( $argument_class ) ) {
|
||||
throw new ContainerException( "Argument '{$argument->getName()}' of class '$class_name' doesn't have a type hint or has one that doesn't specify a class." );
|
||||
}
|
||||
|
@ -61,6 +61,22 @@ abstract class AbstractServiceProvider extends \Automattic\WooCommerce\Vendor\Le
|
|||
return $definition;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the class of a parameter.
|
||||
*
|
||||
* This method is a replacement for ReflectionParameter::getClass,
|
||||
* which is deprecated as of PHP 8.
|
||||
*
|
||||
* @param \ReflectionParameter $parameter The parameter to get the class for.
|
||||
*
|
||||
* @return \ReflectionClass|null The class of the parameter, or null if it hasn't any.
|
||||
*/
|
||||
private function get_class( \ReflectionParameter $parameter ) {
|
||||
return $parameter->getType() && ! $parameter->getType()->isBuiltin()
|
||||
? new \ReflectionClass( $parameter->getType()->getName() )
|
||||
: null;
|
||||
}
|
||||
|
||||
/**
|
||||
* 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).
|
||||
|
|
|
@ -94,7 +94,7 @@ class AbstractServiceProviderTest extends \WC_Unit_Test_Case {
|
|||
*/
|
||||
public function test_add_with_auto_arguments_throws_on_class_private_method_injection() {
|
||||
$this->expectException( ContainerException::class );
|
||||
$this->expectExceptionMessage( "Method '" . Definition::INJECTION_METHOD . "' of class '" . ClassWithPrivateInjectionMethod::class . "' isn't 'public', instances can't be created." );
|
||||
$this->expectExceptionMessage( "Method '" . Definition::INJECTION_METHOD . "' of class '" . ClassWithPrivateInjectionMethod::class . "' isn't 'final public', instances can't be created." );
|
||||
|
||||
$this->sut->add_with_auto_arguments( ClassWithPrivateInjectionMethod::class );
|
||||
}
|
||||
|
@ -114,7 +114,7 @@ class AbstractServiceProviderTest extends \WC_Unit_Test_Case {
|
|||
*/
|
||||
public function test_add_with_auto_arguments_throws_on_concrete_private_method_injection() {
|
||||
$this->expectException( ContainerException::class );
|
||||
$this->expectExceptionMessage( "Method '" . Definition::INJECTION_METHOD . "' of class '" . ClassWithPrivateInjectionMethod::class . "' isn't 'public', instances can't be created." );
|
||||
$this->expectExceptionMessage( "Method '" . Definition::INJECTION_METHOD . "' of class '" . ClassWithPrivateInjectionMethod::class . "' isn't 'final public', instances can't be created." );
|
||||
|
||||
$this->sut->add_with_auto_arguments( ClassWithDependencies::class, ClassWithPrivateInjectionMethod::class );
|
||||
}
|
||||
|
|
|
@ -12,13 +12,15 @@ namespace Automattic\WooCommerce\Tests\Internal\DependencyManagement\ExampleClas
|
|||
*/
|
||||
class ClassWithPrivateInjectionMethod {
|
||||
|
||||
// phpcs:disable WooCommerce.Functions.InternalInjectionMethod.MissingPublic
|
||||
// phpcs:disable WooCommerce.Functions.InternalInjectionMethod.MissingPublic, WooCommerce.Functions.InternalInjectionMethod.MissingFinal
|
||||
|
||||
/**
|
||||
* Initialize the class instance.
|
||||
*
|
||||
* @internal
|
||||
*/
|
||||
final private function init() {
|
||||
private function init() {
|
||||
}
|
||||
|
||||
// phpcs:enable
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue