mirror of
https://github.com/php/php-src.git
synced 2024-09-22 02:17:32 +00:00
Fixed bug #39884 (ReflectionParameter::getClass() throws exception for type
hint self).
This commit is contained in:
parent
f40ebf4171
commit
72895cda6d
2
NEWS
2
NEWS
@ -19,6 +19,8 @@ PHP NEWS
|
|||||||
- Fixed bug #39903 (Notice message when executing __halt_compiler() more than
|
- Fixed bug #39903 (Notice message when executing __halt_compiler() more than
|
||||||
once). (Tony)
|
once). (Tony)
|
||||||
- Fixed bug #39898 (FILTER_VALIDATE_URL validates \r\n\t etc). (Ilia)
|
- Fixed bug #39898 (FILTER_VALIDATE_URL validates \r\n\t etc). (Ilia)
|
||||||
|
- Fixed bug #39884 (ReflectionParameter::getClass() throws exception for type
|
||||||
|
hint self). (thekid at php dot net)
|
||||||
- Fixed bug #39873 (number_format() breaks with locale & decimal points).
|
- Fixed bug #39873 (number_format() breaks with locale & decimal points).
|
||||||
(Ilia)
|
(Ilia)
|
||||||
- Fixed bug #39869 (safe_read does not initialize errno).
|
- Fixed bug #39869 (safe_read does not initialize errno).
|
||||||
|
@ -1995,7 +1995,40 @@ ZEND_METHOD(reflection_parameter, getClass)
|
|||||||
GET_REFLECTION_OBJECT_PTR(param);
|
GET_REFLECTION_OBJECT_PTR(param);
|
||||||
|
|
||||||
if (param->arg_info->class_name) {
|
if (param->arg_info->class_name) {
|
||||||
if (zend_lookup_class(param->arg_info->class_name, param->arg_info->class_name_len, &pce TSRMLS_CC) == FAILURE) {
|
/* Class name is stored as a string, we might also get "self" or "parent"
|
||||||
|
* - For "self", simply use the function scope. If scope is NULL then
|
||||||
|
* the function is global and thus self does not make any sense
|
||||||
|
*
|
||||||
|
* - For "parent", use the function scope's parent. If scope is NULL then
|
||||||
|
* the function is global and thus parent does not make any sense.
|
||||||
|
* If the parent is NULL then the class does not extend anything and
|
||||||
|
* thus parent does not make any sense, either.
|
||||||
|
*
|
||||||
|
* TODO: Think about moving these checks to the compiler or some sort of
|
||||||
|
* lint-mode.
|
||||||
|
*/
|
||||||
|
if (0 == strncmp(param->arg_info->class_name, "self", sizeof("self")- 1)) {
|
||||||
|
zend_class_entry *ce= param->fptr->common.scope;
|
||||||
|
if (!ce) {
|
||||||
|
zend_throw_exception_ex(reflection_exception_ptr, 0 TSRMLS_CC,
|
||||||
|
"Parameter uses 'self' as type hint but function is not a class member!");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
pce= &ce;
|
||||||
|
} else if (0 == strncmp(param->arg_info->class_name, "parent", sizeof("parent")- 1)) {
|
||||||
|
zend_class_entry *ce= param->fptr->common.scope;
|
||||||
|
if (!ce) {
|
||||||
|
zend_throw_exception_ex(reflection_exception_ptr, 0 TSRMLS_CC,
|
||||||
|
"Parameter uses 'parent' as type hint but function is not a class member!");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (!ce->parent) {
|
||||||
|
zend_throw_exception_ex(reflection_exception_ptr, 0 TSRMLS_CC,
|
||||||
|
"Parameter uses 'parent' as type hint although class does not have a parent!");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
pce= &ce->parent;
|
||||||
|
} else if (zend_lookup_class(param->arg_info->class_name, param->arg_info->class_name_len, &pce TSRMLS_CC) == FAILURE) {
|
||||||
zend_throw_exception_ex(reflection_exception_ptr, 0 TSRMLS_CC,
|
zend_throw_exception_ex(reflection_exception_ptr, 0 TSRMLS_CC,
|
||||||
"Class %s does not exist", param->arg_info->class_name);
|
"Class %s does not exist", param->arg_info->class_name);
|
||||||
return;
|
return;
|
||||||
|
22
ext/reflection/tests/bug39884.phpt
Normal file
22
ext/reflection/tests/bug39884.phpt
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
--TEST--
|
||||||
|
Bug #39884 (ReflectionParameter::getClass() throws exception for type hint self)
|
||||||
|
--FILE--
|
||||||
|
<?php
|
||||||
|
class stubParamTest
|
||||||
|
{
|
||||||
|
function paramTest(self $param)
|
||||||
|
{
|
||||||
|
// nothing to do
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$test1 = new stubParamTest();
|
||||||
|
$test2 = new stubParamTest();
|
||||||
|
$test1->paramTest($test2);
|
||||||
|
$refParam = new ReflectionParameter(array('stubParamTest', 'paramTest'), 'param');
|
||||||
|
var_dump($refParam->getClass());
|
||||||
|
?>
|
||||||
|
--EXPECT--
|
||||||
|
object(ReflectionClass)#4 (1) {
|
||||||
|
["name"]=>
|
||||||
|
string(13) "stubParamTest"
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user