mirror of
https://github.com/php/php-src.git
synced 2026-03-24 00:02:20 +01:00
Implement ReflectionProperty::hasHook[s]
Closes GH-15844
This commit is contained in:
3
NEWS
3
NEWS
@@ -2,6 +2,9 @@ PHP NEWS
|
||||
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||
?? ??? ????, PHP 8.4.0RC1
|
||||
|
||||
- Core:
|
||||
. Add missing ReflectionProperty::hasHook[s]() methods. (ilutov)
|
||||
|
||||
- DOM:
|
||||
. Fix XML serializer errata: xmlns="" serialization should be allowed.
|
||||
(nielsdos)
|
||||
|
||||
@@ -6509,6 +6509,18 @@ ZEND_METHOD(ReflectionProperty, getDefaultValue)
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
ZEND_METHOD(ReflectionProperty, hasHooks)
|
||||
{
|
||||
reflection_object *intern;
|
||||
property_reference *ref;
|
||||
|
||||
ZEND_PARSE_PARAMETERS_NONE();
|
||||
|
||||
GET_REFLECTION_OBJECT_PTR(ref);
|
||||
|
||||
RETURN_BOOL(ref->prop && ref->prop->hooks);
|
||||
}
|
||||
|
||||
ZEND_METHOD(ReflectionProperty, getHooks)
|
||||
{
|
||||
reflection_object *intern;
|
||||
@@ -6538,6 +6550,29 @@ ZEND_METHOD(ReflectionProperty, getHooks)
|
||||
}
|
||||
}
|
||||
|
||||
ZEND_METHOD(ReflectionProperty, hasHook)
|
||||
{
|
||||
|
||||
reflection_object *intern;
|
||||
property_reference *ref;
|
||||
zend_object *type;
|
||||
|
||||
ZEND_PARSE_PARAMETERS_START(1, 1)
|
||||
Z_PARAM_OBJ_OF_CLASS(type, reflection_property_hook_type_ptr)
|
||||
ZEND_PARSE_PARAMETERS_END();
|
||||
|
||||
GET_REFLECTION_OBJECT_PTR(ref);
|
||||
|
||||
zend_property_hook_kind kind;
|
||||
if (zend_string_equals_literal(Z_STR_P(zend_enum_fetch_case_name(type)), "Get")) {
|
||||
kind = ZEND_PROPERTY_HOOK_GET;
|
||||
} else {
|
||||
kind = ZEND_PROPERTY_HOOK_SET;
|
||||
}
|
||||
|
||||
RETURN_BOOL(ref->prop && ref->prop->hooks && ref->prop->hooks[kind]);
|
||||
}
|
||||
|
||||
ZEND_METHOD(ReflectionProperty, getHook)
|
||||
{
|
||||
reflection_object *intern;
|
||||
|
||||
@@ -557,9 +557,13 @@ class ReflectionProperty implements Reflector
|
||||
|
||||
public function getAttributes(?string $name = null, int $flags = 0): array {}
|
||||
|
||||
public function hasHooks(): bool {}
|
||||
|
||||
/** @return array<string, ReflectionMethod> */
|
||||
public function getHooks(): array {}
|
||||
|
||||
public function hasHook(PropertyHookType $type): bool {}
|
||||
|
||||
public function getHook(PropertyHookType $type): ?ReflectionMethod {}
|
||||
}
|
||||
|
||||
|
||||
12
ext/reflection/php_reflection_arginfo.h
generated
12
ext/reflection/php_reflection_arginfo.h
generated
@@ -1,5 +1,5 @@
|
||||
/* This is a generated file, edit the .stub.php file instead.
|
||||
* Stub hash: 8faf835d31acf3ae3e12a0dfca56f0744b95831b */
|
||||
* Stub hash: 83e9d4a4b2f49739af3e7faa3037df13e779bb8b */
|
||||
|
||||
ZEND_BEGIN_ARG_WITH_TENTATIVE_RETURN_TYPE_INFO_EX(arginfo_class_Reflection_getModifierNames, 0, 1, IS_ARRAY, 0)
|
||||
ZEND_ARG_TYPE_INFO(0, modifiers, IS_LONG, 0)
|
||||
@@ -448,8 +448,14 @@ ZEND_END_ARG_INFO()
|
||||
|
||||
#define arginfo_class_ReflectionProperty_getAttributes arginfo_class_ReflectionFunctionAbstract_getAttributes
|
||||
|
||||
#define arginfo_class_ReflectionProperty_hasHooks arginfo_class_ReflectionFunctionAbstract_hasTentativeReturnType
|
||||
|
||||
#define arginfo_class_ReflectionProperty_getHooks arginfo_class_ReflectionFunctionAbstract_getClosureUsedVariables
|
||||
|
||||
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_ReflectionProperty_hasHook, 0, 1, _IS_BOOL, 0)
|
||||
ZEND_ARG_OBJ_INFO(0, type, PropertyHookType, 0)
|
||||
ZEND_END_ARG_INFO()
|
||||
|
||||
ZEND_BEGIN_ARG_WITH_RETURN_OBJ_INFO_EX(arginfo_class_ReflectionProperty_getHook, 0, 1, ReflectionMethod, 1)
|
||||
ZEND_ARG_OBJ_INFO(0, type, PropertyHookType, 0)
|
||||
ZEND_END_ARG_INFO()
|
||||
@@ -858,7 +864,9 @@ ZEND_METHOD(ReflectionProperty, hasType);
|
||||
ZEND_METHOD(ReflectionProperty, hasDefaultValue);
|
||||
ZEND_METHOD(ReflectionProperty, getDefaultValue);
|
||||
ZEND_METHOD(ReflectionProperty, getAttributes);
|
||||
ZEND_METHOD(ReflectionProperty, hasHooks);
|
||||
ZEND_METHOD(ReflectionProperty, getHooks);
|
||||
ZEND_METHOD(ReflectionProperty, hasHook);
|
||||
ZEND_METHOD(ReflectionProperty, getHook);
|
||||
ZEND_METHOD(ReflectionClassConstant, __construct);
|
||||
ZEND_METHOD(ReflectionClassConstant, __toString);
|
||||
@@ -1152,7 +1160,9 @@ static const zend_function_entry class_ReflectionProperty_methods[] = {
|
||||
ZEND_ME(ReflectionProperty, hasDefaultValue, arginfo_class_ReflectionProperty_hasDefaultValue, ZEND_ACC_PUBLIC)
|
||||
ZEND_ME(ReflectionProperty, getDefaultValue, arginfo_class_ReflectionProperty_getDefaultValue, ZEND_ACC_PUBLIC)
|
||||
ZEND_ME(ReflectionProperty, getAttributes, arginfo_class_ReflectionProperty_getAttributes, ZEND_ACC_PUBLIC)
|
||||
ZEND_ME(ReflectionProperty, hasHooks, arginfo_class_ReflectionProperty_hasHooks, ZEND_ACC_PUBLIC)
|
||||
ZEND_ME(ReflectionProperty, getHooks, arginfo_class_ReflectionProperty_getHooks, ZEND_ACC_PUBLIC)
|
||||
ZEND_ME(ReflectionProperty, hasHook, arginfo_class_ReflectionProperty_hasHook, ZEND_ACC_PUBLIC)
|
||||
ZEND_ME(ReflectionProperty, getHook, arginfo_class_ReflectionProperty_getHook, ZEND_ACC_PUBLIC)
|
||||
ZEND_FE_END
|
||||
};
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
--TEST--
|
||||
ReflectionClass::get{Get,Set}() inheritance
|
||||
ReflectionClass::getHook() inheritance
|
||||
--FILE--
|
||||
<?php
|
||||
|
||||
|
||||
@@ -12,13 +12,16 @@ class Test {
|
||||
|
||||
for ($i = 1; $i <= 4; $i++) {
|
||||
$rp = new ReflectionProperty(Test::class, 'prop' . $i);
|
||||
var_dump($rp->hasHooks());
|
||||
var_dump($rp->getHooks());
|
||||
}
|
||||
|
||||
?>
|
||||
--EXPECT--
|
||||
bool(false)
|
||||
array(0) {
|
||||
}
|
||||
bool(true)
|
||||
array(2) {
|
||||
["get"]=>
|
||||
object(ReflectionMethod)#1 (2) {
|
||||
@@ -35,6 +38,7 @@ array(2) {
|
||||
string(4) "Test"
|
||||
}
|
||||
}
|
||||
bool(true)
|
||||
array(1) {
|
||||
["get"]=>
|
||||
object(ReflectionMethod)#2 (2) {
|
||||
@@ -44,6 +48,7 @@ array(1) {
|
||||
string(4) "Test"
|
||||
}
|
||||
}
|
||||
bool(true)
|
||||
array(1) {
|
||||
["set"]=>
|
||||
object(ReflectionMethod)#3 (2) {
|
||||
|
||||
@@ -10,6 +10,8 @@ class Test {
|
||||
get { echo "get\n"; }
|
||||
set { echo "set($value)\n"; }
|
||||
}
|
||||
public $prop5 { get { echo "get\n"; } }
|
||||
public $prop6 { set { echo "set($value)\n"; } }
|
||||
}
|
||||
abstract class Test2 {
|
||||
abstract public $prop4 { get; set; }
|
||||
@@ -27,13 +29,17 @@ function dumpFlags(ReflectionProperty $rp) {
|
||||
$test = new Test;
|
||||
|
||||
$rp1 = new ReflectionProperty(Test::class, 'prop1');
|
||||
var_dump($rp1->hasHook(PropertyHookType::Get));
|
||||
var_dump($rp1->getHook(PropertyHookType::Get));
|
||||
var_dump($rp1->hasHook(PropertyHookType::Set));
|
||||
var_dump($rp1->getHook(PropertyHookType::Set));
|
||||
dumpFlags($rp1);
|
||||
echo "\n";
|
||||
|
||||
$rp2 = new ReflectionProperty(Test::class, 'prop2');
|
||||
var_dump($rp2->hasHook(PropertyHookType::Get));
|
||||
var_dump($g = $rp2->getHook(PropertyHookType::Get));
|
||||
var_dump($rp2->hasHook(PropertyHookType::Set));
|
||||
var_dump($s = $rp2->getHook(PropertyHookType::Set));
|
||||
var_dump($g->invoke($test));
|
||||
try {
|
||||
@@ -48,7 +54,9 @@ dumpFlags($rp2);
|
||||
echo "\n";
|
||||
|
||||
$rp3 = new ReflectionProperty(Test::class, 'prop3');
|
||||
var_dump($rp3->hasHook(PropertyHookType::Get));
|
||||
var_dump($g = $rp3->getHook(PropertyHookType::Get));
|
||||
var_dump($rp3->hasHook(PropertyHookType::Set));
|
||||
var_dump($s = $rp3->getHook(PropertyHookType::Set));
|
||||
$g->invoke($test);
|
||||
$s->invoke($test, 42);
|
||||
@@ -57,19 +65,34 @@ echo "\n";
|
||||
|
||||
$rp4 = new ReflectionProperty(Test2::class, 'prop4');
|
||||
dumpFlags($rp4);
|
||||
echo "\n";
|
||||
|
||||
$rp5 = new ReflectionProperty(Test::class, 'prop5');
|
||||
var_dump($rp5->hasHook(PropertyHookType::Get));
|
||||
var_dump($rp5->hasHook(PropertyHookType::Set));
|
||||
echo "\n";
|
||||
|
||||
$rp6 = new ReflectionProperty(Test::class, 'prop6');
|
||||
var_dump($rp6->hasHook(PropertyHookType::Get));
|
||||
var_dump($rp6->hasHook(PropertyHookType::Set));
|
||||
echo "\n";
|
||||
|
||||
?>
|
||||
--EXPECT--
|
||||
bool(false)
|
||||
NULL
|
||||
bool(false)
|
||||
NULL
|
||||
Abstract: false false
|
||||
|
||||
bool(true)
|
||||
object(ReflectionMethod)#6 (2) {
|
||||
["name"]=>
|
||||
string(11) "$prop2::get"
|
||||
["class"]=>
|
||||
string(4) "Test"
|
||||
}
|
||||
bool(true)
|
||||
object(ReflectionMethod)#7 (2) {
|
||||
["name"]=>
|
||||
string(11) "$prop2::set"
|
||||
@@ -80,12 +103,14 @@ NULL
|
||||
NULL
|
||||
Abstract: false false
|
||||
|
||||
bool(true)
|
||||
object(ReflectionMethod)#9 (2) {
|
||||
["name"]=>
|
||||
string(11) "$prop3::get"
|
||||
["class"]=>
|
||||
string(4) "Test"
|
||||
}
|
||||
bool(true)
|
||||
object(ReflectionMethod)#6 (2) {
|
||||
["name"]=>
|
||||
string(11) "$prop3::set"
|
||||
@@ -97,3 +122,9 @@ set(42)
|
||||
Abstract: false false
|
||||
|
||||
Abstract: true true
|
||||
|
||||
bool(true)
|
||||
bool(false)
|
||||
|
||||
bool(false)
|
||||
bool(true)
|
||||
|
||||
Reference in New Issue
Block a user