From 19124ce4099896698313cb0a1cec65ee7d3249d3 Mon Sep 17 00:00:00 2001 From: Fabien Villepinte Date: Sat, 19 Oct 2019 21:27:37 +0200 Subject: [PATCH] Fix bug #78697: inaccurate error message ReflectionClass::implementsInterface - inaccurate error message with traits --- ext/reflection/php_reflection.c | 2 +- ...flectionClass_implementsInterface_001.phpt | 60 +++++++++---------- ext/reflection/tests/bug78697.phpt | 14 +++++ 3 files changed, 45 insertions(+), 31 deletions(-) create mode 100644 ext/reflection/tests/bug78697.phpt diff --git a/ext/reflection/php_reflection.c b/ext/reflection/php_reflection.c index 012f23982d9d9..fe5f2178c6eb9 100644 --- a/ext/reflection/php_reflection.c +++ b/ext/reflection/php_reflection.c @@ -5140,7 +5140,7 @@ ZEND_METHOD(reflection_class, implementsInterface) if (!(interface_ce->ce_flags & ZEND_ACC_INTERFACE)) { zend_throw_exception_ex(reflection_exception_ptr, 0, - "Interface %s is a Class", ZSTR_VAL(interface_ce->name)); + "%s is not an interface", ZSTR_VAL(interface_ce->name)); return; } RETURN_BOOL(instanceof_function(ce, interface_ce)); diff --git a/ext/reflection/tests/ReflectionClass_implementsInterface_001.phpt b/ext/reflection/tests/ReflectionClass_implementsInterface_001.phpt index 91398867ecd83..d1cbc8ae477a0 100644 --- a/ext/reflection/tests/ReflectionClass_implementsInterface_001.phpt +++ b/ext/reflection/tests/ReflectionClass_implementsInterface_001.phpt @@ -67,14 +67,14 @@ try { ?> --EXPECTF-- Does A implement A? - - Using object argument: Interface A is a Class - - Using string argument: Interface A is a Class + - Using object argument: A is not an interface + - Using string argument: A is not an interface Does A implement B? - - Using object argument: Interface B is a Class - - Using string argument: Interface B is a Class + - Using object argument: B is not an interface + - Using string argument: B is not an interface Does A implement C? - - Using object argument: Interface C is a Class - - Using string argument: Interface C is a Class + - Using object argument: C is not an interface + - Using string argument: C is not an interface Does A implement I1? - Using object argument: bool(true) - Using string argument: bool(true) @@ -82,14 +82,14 @@ Does A implement I2? - Using object argument: bool(false) - Using string argument: bool(false) Does B implement A? - - Using object argument: Interface A is a Class - - Using string argument: Interface A is a Class + - Using object argument: A is not an interface + - Using string argument: A is not an interface Does B implement B? - - Using object argument: Interface B is a Class - - Using string argument: Interface B is a Class + - Using object argument: B is not an interface + - Using string argument: B is not an interface Does B implement C? - - Using object argument: Interface C is a Class - - Using string argument: Interface C is a Class + - Using object argument: C is not an interface + - Using string argument: C is not an interface Does B implement I1? - Using object argument: bool(true) - Using string argument: bool(true) @@ -97,14 +97,14 @@ Does B implement I2? - Using object argument: bool(false) - Using string argument: bool(false) Does C implement A? - - Using object argument: Interface A is a Class - - Using string argument: Interface A is a Class + - Using object argument: A is not an interface + - Using string argument: A is not an interface Does C implement B? - - Using object argument: Interface B is a Class - - Using string argument: Interface B is a Class + - Using object argument: B is not an interface + - Using string argument: B is not an interface Does C implement C? - - Using object argument: Interface C is a Class - - Using string argument: Interface C is a Class + - Using object argument: C is not an interface + - Using string argument: C is not an interface Does C implement I1? - Using object argument: bool(true) - Using string argument: bool(true) @@ -112,14 +112,14 @@ Does C implement I2? - Using object argument: bool(true) - Using string argument: bool(true) Does I1 implement A? - - Using object argument: Interface A is a Class - - Using string argument: Interface A is a Class + - Using object argument: A is not an interface + - Using string argument: A is not an interface Does I1 implement B? - - Using object argument: Interface B is a Class - - Using string argument: Interface B is a Class + - Using object argument: B is not an interface + - Using string argument: B is not an interface Does I1 implement C? - - Using object argument: Interface C is a Class - - Using string argument: Interface C is a Class + - Using object argument: C is not an interface + - Using string argument: C is not an interface Does I1 implement I1? - Using object argument: bool(true) - Using string argument: bool(true) @@ -127,14 +127,14 @@ Does I1 implement I2? - Using object argument: bool(false) - Using string argument: bool(false) Does I2 implement A? - - Using object argument: Interface A is a Class - - Using string argument: Interface A is a Class + - Using object argument: A is not an interface + - Using string argument: A is not an interface Does I2 implement B? - - Using object argument: Interface B is a Class - - Using string argument: Interface B is a Class + - Using object argument: B is not an interface + - Using string argument: B is not an interface Does I2 implement C? - - Using object argument: Interface C is a Class - - Using string argument: Interface C is a Class + - Using object argument: C is not an interface + - Using string argument: C is not an interface Does I2 implement I1? - Using object argument: bool(true) - Using string argument: bool(true) diff --git a/ext/reflection/tests/bug78697.phpt b/ext/reflection/tests/bug78697.phpt new file mode 100644 index 0000000000000..b35d0f4d4ef64 --- /dev/null +++ b/ext/reflection/tests/bug78697.phpt @@ -0,0 +1,14 @@ +--TEST-- +Bug #78697: ReflectionClass::implementsInterface - inaccurate error message with traits +--FILE-- +implementsInterface(T::class); +} catch (ReflectionException $e) { + echo $e->getMessage(); +} +?> +--EXPECT-- +T is not an interface