Document change to ReflectionMethod->isConstructor/isDestructor

See https://externals.io/message/109377
This prevented PHPUnit's test doubles from being created for interfaces.

The reason this changed is
https://github.com/php/php-src/pull/3846/files#diff-3a8139128d4026ce0cb0c86beba4e6b9L5549-R5605
(ReflectionMethod::isConstruct checks if the method is the zend_class_entry's
constructor, etc.)
This commit is contained in:
Tyson Andre 2020-04-21 19:19:53 -04:00 committed by Christoph M. Becker
parent c33e5043a8
commit 630897f996
2 changed files with 132 additions and 1 deletions

View file

@ -192,7 +192,7 @@ PHP 8.0 UPGRADE NOTES
- dom: - dom:
. Remove unimplemented classes from ext/dom that had no behavior and contained . Remove unimplemented classes from ext/dom that had no behavior and contained
test data. These classes have also been removed in the latest version of DOM test data. These classes have also been removed in the latest version of DOM
standard: standard:
* DOMNameList * DOMNameList
* DomImplementationList * DomImplementationList
@ -325,6 +325,9 @@ PHP 8.0 UPGRADE NOTES
ReflectionParameter::getDefaultValue() ReflectionParameter::getDefaultValue()
ReflectionParameter::isDefaultValueConstant() ReflectionParameter::isDefaultValueConstant()
ReflectionParameter::getDefaultValueConstantName() ReflectionParameter::getDefaultValueConstantName()
. ReflectionMethod::isConstructor() and ReflectionMethod::isDestructor() now
also return true for `__construct` and `__destruct` in methods of interfaces.
Previously, this would only be true in methods of classes and traits.
- Socket: - Socket:
. The deprecated AI_IDN_ALLOW_UNASSIGNED and AI_IDN_USE_STD3_ASCII_RULES . The deprecated AI_IDN_ALLOW_UNASSIGNED and AI_IDN_USE_STD3_ASCII_RULES

View file

@ -49,6 +49,14 @@ class DerivedClass extends TestClass {}
interface TestInterface { interface TestInterface {
public function int(); public function int();
public function __construct($arg);
public function __destruct();
}
trait TestTrait {
public abstract function __construct();
public function __destruct() {
}
} }
reflectMethod("DerivedClass", "foo"); reflectMethod("DerivedClass", "foo");
@ -59,6 +67,10 @@ reflectMethod("DerivedClass", "prot");
reflectMethod("TestInterface", "int"); reflectMethod("TestInterface", "int");
reflectMethod("ReflectionProperty", "__construct"); reflectMethod("ReflectionProperty", "__construct");
reflectMethod("TestClass", "__destruct"); reflectMethod("TestClass", "__destruct");
reflectMethod("TestInterface", "__construct");
reflectMethod("TestInterface", "__destruct");
reflectMethod("TestTrait", "__construct");
reflectMethod("TestTrait", "__destruct");
?> ?>
--EXPECT-- --EXPECT--
@ -269,6 +281,122 @@ bool(false)
Reflecting on method TestClass::__destruct() Reflecting on method TestClass::__destruct()
isFinal():
bool(false)
isAbstract():
bool(false)
isPublic():
bool(true)
isPrivate():
bool(false)
isProtected():
bool(false)
isStatic():
bool(false)
isConstructor():
bool(false)
isDestructor():
bool(true)
**********************************
**********************************
Reflecting on method TestInterface::__construct()
isFinal():
bool(false)
isAbstract():
bool(true)
isPublic():
bool(true)
isPrivate():
bool(false)
isProtected():
bool(false)
isStatic():
bool(false)
isConstructor():
bool(true)
isDestructor():
bool(false)
**********************************
**********************************
Reflecting on method TestInterface::__destruct()
isFinal():
bool(false)
isAbstract():
bool(true)
isPublic():
bool(true)
isPrivate():
bool(false)
isProtected():
bool(false)
isStatic():
bool(false)
isConstructor():
bool(false)
isDestructor():
bool(true)
**********************************
**********************************
Reflecting on method TestTrait::__construct()
isFinal():
bool(false)
isAbstract():
bool(true)
isPublic():
bool(true)
isPrivate():
bool(false)
isProtected():
bool(false)
isStatic():
bool(false)
isConstructor():
bool(true)
isDestructor():
bool(false)
**********************************
**********************************
Reflecting on method TestTrait::__destruct()
isFinal(): isFinal():
bool(false) bool(false)