Skip to content

Commit 9a2b506

Browse files
committed
Basics of ReflectionAttribute support.
1 parent 32df5b7 commit 9a2b506

File tree

4 files changed

+87
-4
lines changed

4 files changed

+87
-4
lines changed

ext/reflection/php_reflection.c

Lines changed: 42 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ PHPAPI zend_class_entry *reflection_class_constant_ptr;
8484
PHPAPI zend_class_entry *reflection_extension_ptr;
8585
PHPAPI zend_class_entry *reflection_zend_extension_ptr;
8686
PHPAPI zend_class_entry *reflection_reference_ptr;
87+
PHPAPI zend_class_entry *reflection_attribute_ptr;
8788

8889
/* Exception throwing macro */
8990
#define _DO_THROW(msg) \
@@ -6275,6 +6276,27 @@ ZEND_METHOD(reflection_reference, getId)
62756276
}
62766277
/* }}} */
62776278

6279+
/* {{{ proto public string ReflectionAttribute::getName()
6280+
* Returns the name of the attribute */
6281+
ZEND_METHOD(reflection_attribute, getName)
6282+
{
6283+
}
6284+
/* }}} */
6285+
6286+
/* {{{ proto public string ReflectionAttribute::getArguments()
6287+
* Returns the arguments passed to the attribute */
6288+
ZEND_METHOD(reflection_attribute, getArguments)
6289+
{
6290+
}
6291+
/* }}} */
6292+
6293+
/* {{{ proto public string ReflectionAttribute::getAsObject()
6294+
* Returns the attribute as an object */
6295+
ZEND_METHOD(reflection_attribute, getAsObject)
6296+
{
6297+
}
6298+
/* }}} */
6299+
62786300
/* {{{ method tables */
62796301
static const zend_function_entry reflection_exception_functions[] = {
62806302
PHP_FE_END
@@ -6302,7 +6324,7 @@ static const zend_function_entry reflection_function_abstract_functions[] = {
63026324
ZEND_ME(reflection_function, getClosureThis, arginfo_class_ReflectionFunctionAbstract_getClosureThis, 0)
63036325
ZEND_ME(reflection_function, getClosureScopeClass, arginfo_class_ReflectionFunctionAbstract_getClosureScopeClass, 0)
63046326
ZEND_ME(reflection_function, getDocComment, arginfo_class_ReflectionFunctionAbstract_getDocComment, 0)
6305-
ZEND_ME(reflection_function, getAttributes, arginfo_class_ReflectionFunctionAbstract_getDocComment, 0)
6327+
ZEND_ME(reflection_function, getAttributes, arginfo_class_ReflectionFunctionAbstract_getAttributes, 0)
63066328
ZEND_ME(reflection_function, getEndLine, arginfo_class_ReflectionFunctionAbstract_getEndLine, 0)
63076329
ZEND_ME(reflection_function, getExtension, arginfo_class_ReflectionFunctionAbstract_getExtension, 0)
63086330
ZEND_ME(reflection_function, getExtensionName, arginfo_class_ReflectionFunctionAbstract_getExtensionName, 0)
@@ -6377,7 +6399,7 @@ static const zend_function_entry reflection_class_functions[] = {
63776399
ZEND_ME(reflection_class, getStartLine, arginfo_class_ReflectionClass_getStartLine, 0)
63786400
ZEND_ME(reflection_class, getEndLine, arginfo_class_ReflectionClass_getEndLine, 0)
63796401
ZEND_ME(reflection_class, getDocComment, arginfo_class_ReflectionClass_getDocComment, 0)
6380-
ZEND_ME(reflection_class, getAttributes, arginfo_class_ReflectionClass_getDocComment, 0)
6402+
ZEND_ME(reflection_class, getAttributes, arginfo_class_ReflectionClass_getAttributes, 0)
63816403
ZEND_ME(reflection_class, getConstructor, arginfo_class_ReflectionClass_getConstructor, 0)
63826404
ZEND_ME(reflection_class, hasMethod, arginfo_class_ReflectionClass_hasMethod, 0)
63836405
ZEND_ME(reflection_class, getMethod, arginfo_class_ReflectionClass_getMethod, 0)
@@ -6442,7 +6464,7 @@ static const zend_function_entry reflection_property_functions[] = {
64426464
ZEND_ME(reflection_property, getModifiers, arginfo_class_ReflectionProperty_getModifiers, 0)
64436465
ZEND_ME(reflection_property, getDeclaringClass, arginfo_class_ReflectionProperty_getDeclaringClass, 0)
64446466
ZEND_ME(reflection_property, getDocComment, arginfo_class_ReflectionProperty_getDocComment, 0)
6445-
ZEND_ME(reflection_property, getAttributes, arginfo_class_ReflectionProperty_getDocComment, 0)
6467+
ZEND_ME(reflection_property, getAttributes, arginfo_class_ReflectionProperty_getAttributes, 0)
64466468
ZEND_ME(reflection_property, setAccessible, arginfo_class_ReflectionProperty_setAccessible, 0)
64476469
ZEND_ME(reflection_property, getType, arginfo_class_ReflectionProperty_getType, 0)
64486470
ZEND_ME(reflection_property, hasType, arginfo_class_ReflectionProperty_hasType, 0)
@@ -6463,7 +6485,7 @@ static const zend_function_entry reflection_class_constant_functions[] = {
64636485
ZEND_ME(reflection_class_constant, getModifiers, arginfo_class_ReflectionClassConstant_getModifiers, 0)
64646486
ZEND_ME(reflection_class_constant, getDeclaringClass, arginfo_class_ReflectionClassConstant_getDeclaringClass, 0)
64656487
ZEND_ME(reflection_class_constant, getDocComment, arginfo_class_ReflectionClassConstant_getDocComment, 0)
6466-
ZEND_ME(reflection_class_constant, getAttributes, arginfo_class_ReflectionClassConstant_getDocComment, 0)
6488+
ZEND_ME(reflection_class_constant, getAttributes, arginfo_class_ReflectionClassConstant_getAttributes, 0)
64676489
PHP_FE_END
64686490
};
64696491

@@ -6549,6 +6571,17 @@ static const zend_function_entry reflection_reference_functions[] = {
65496571
ZEND_ME(reflection_reference, __construct, arginfo_class_ReflectionReference___construct, ZEND_ACC_PRIVATE)
65506572
PHP_FE_END
65516573
};
6574+
6575+
static const zend_function_entry reflection_attribute_functions[] = {
6576+
ZEND_ME(reflection_attribute, getName, arginfo_class_ReflectionAttribute_getName, ZEND_ACC_PUBLIC)
6577+
ZEND_ME(reflection_attribute, getArguments, arginfo_class_ReflectionAttribute_getArguments, ZEND_ACC_PUBLIC)
6578+
ZEND_ME(reflection_attribute, getAsObject, arginfo_class_ReflectionAttribute_getAsObject, ZEND_ACC_PUBLIC)
6579+
6580+
/* Always throwing dummy methods */
6581+
ZEND_ME(reflection, __clone, arginfo_class_ReflectionReference___clone, ZEND_ACC_PRIVATE)
6582+
ZEND_ME(reflection_reference, __construct, arginfo_class_ReflectionReference___construct, ZEND_ACC_PRIVATE)
6583+
PHP_FE_END
6584+
};
65526585
/* }}} */
65536586

65546587
static const zend_function_entry reflection_ext_functions[] = { /* {{{ */
@@ -6699,6 +6732,11 @@ PHP_MINIT_FUNCTION(reflection) /* {{{ */
66996732
_reflection_entry.ce_flags |= ZEND_ACC_FINAL;
67006733
reflection_reference_ptr = zend_register_internal_class(&_reflection_entry);
67016734

6735+
INIT_CLASS_ENTRY(_reflection_entry, "ReflectionAttribute", reflection_attribute_functions);
6736+
reflection_init_class_handlers(&_reflection_entry);
6737+
_reflection_entry.ce_flags |= ZEND_ACC_FINAL;
6738+
reflection_attribute_ptr = zend_register_internal_class(&_reflection_entry);
6739+
67026740
REFLECTION_G(key_initialized) = 0;
67036741

67046742
return SUCCESS;

ext/reflection/php_reflection.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ extern PHPAPI zend_class_entry *reflection_property_ptr;
4242
extern PHPAPI zend_class_entry *reflection_extension_ptr;
4343
extern PHPAPI zend_class_entry *reflection_zend_extension_ptr;
4444
extern PHPAPI zend_class_entry *reflection_reference_ptr;
45+
extern PHPAPI zend_class_entry *reflection_attribute_ptr;
4546

4647
PHPAPI void zend_reflection_class_factory(zend_class_entry *ce, zval *object);
4748

ext/reflection/php_reflection.stub.php

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,9 @@ public function hasReturnType() {}
9494

9595
/** @return ?ReflectionType */
9696
public function getReturnType() {}
97+
98+
/** @return ReflectionAttribute[] */
99+
public function getAttributes($name = null) {}
97100
}
98101

99102
class ReflectionFunction extends ReflectionFunctionAbstract
@@ -353,6 +356,9 @@ public function getNamespaceName() {}
353356

354357
/** @return string|false */
355358
public function getShortName() {}
359+
360+
/** @return ReflectionAttribute[] */
361+
public function getAttributes($name = null) {}
356362
}
357363

358364
class ReflectionObject extends ReflectionClass
@@ -418,6 +424,9 @@ public function hasDefaultValue(): bool {}
418424

419425
/** @return mixed */
420426
public function getDefaultValue() {}
427+
428+
/** @return ReflectionAttribute[] */
429+
public function getAttributes($name = null) {}
421430
}
422431

423432
class ReflectionClassConstant implements Reflector
@@ -452,6 +461,9 @@ public function getDeclaringClass() {}
452461

453462
/** @return string|false */
454463
public function getDocComment() {}
464+
465+
/** @return ReflectionAttribute[] */
466+
public function getAttributes($name = null) {}
455467
}
456468

457469
class ReflectionParameter implements Reflector
@@ -625,3 +637,14 @@ private function __clone() {}
625637

626638
private function __construct() {}
627639
}
640+
641+
final class ReflectionAttribute
642+
{
643+
public function getName(): string {}
644+
public function getArguments(): array {}
645+
public function getAsObject(): object {}
646+
647+
private function __clone() {}
648+
649+
private function __construct() {}
650+
}

ext/reflection/php_reflection_arginfo.h

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,10 @@ ZEND_END_ARG_INFO()
5959

6060
#define arginfo_class_ReflectionFunctionAbstract_getReturnType arginfo_class_Reflector___toString
6161

62+
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_ReflectionFunctionAbstract_getAttributes, 0, 0, 0)
63+
ZEND_ARG_INFO(0, name)
64+
ZEND_END_ARG_INFO()
65+
6266
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_ReflectionFunction___construct, 0, 0, 1)
6367
ZEND_ARG_INFO(0, name)
6468
ZEND_END_ARG_INFO()
@@ -268,6 +272,8 @@ ZEND_END_ARG_INFO()
268272

269273
#define arginfo_class_ReflectionClass_getShortName arginfo_class_Reflector___toString
270274

275+
#define arginfo_class_ReflectionClass_getAttributes arginfo_class_ReflectionFunctionAbstract_getAttributes
276+
271277
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_ReflectionObject___construct, 0, 0, 1)
272278
ZEND_ARG_TYPE_INFO(0, argument, IS_OBJECT, 0)
273279
ZEND_END_ARG_INFO()
@@ -321,6 +327,8 @@ ZEND_END_ARG_INFO()
321327

322328
#define arginfo_class_ReflectionProperty_getDefaultValue arginfo_class_Reflector___toString
323329

330+
#define arginfo_class_ReflectionProperty_getAttributes arginfo_class_ReflectionFunctionAbstract_getAttributes
331+
324332
#define arginfo_class_ReflectionClassConstant___clone arginfo_class_Reflector___toString
325333

326334
#define arginfo_class_ReflectionClassConstant___construct arginfo_class_ReflectionProperty___construct
@@ -343,6 +351,8 @@ ZEND_END_ARG_INFO()
343351

344352
#define arginfo_class_ReflectionClassConstant_getDocComment arginfo_class_Reflector___toString
345353

354+
#define arginfo_class_ReflectionClassConstant_getAttributes arginfo_class_ReflectionFunctionAbstract_getAttributes
355+
346356
#define arginfo_class_ReflectionParameter___clone arginfo_class_Reflector___toString
347357

348358
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_ReflectionParameter___construct, 0, 0, 2)
@@ -456,3 +466,14 @@ ZEND_END_ARG_INFO()
456466
#define arginfo_class_ReflectionReference___clone arginfo_class_Reflector___toString
457467

458468
#define arginfo_class_ReflectionReference___construct arginfo_class_Reflector___toString
469+
470+
#define arginfo_class_ReflectionAttribute_getName arginfo_class_ReflectionReference_getId
471+
472+
#define arginfo_class_ReflectionAttribute_getArguments arginfo_class_ReflectionUnionType_getTypes
473+
474+
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_ReflectionAttribute_getAsObject, 0, 0, IS_OBJECT, 0)
475+
ZEND_END_ARG_INFO()
476+
477+
#define arginfo_class_ReflectionAttribute___clone arginfo_class_Reflector___toString
478+
479+
#define arginfo_class_ReflectionAttribute___construct arginfo_class_Reflector___toString

0 commit comments

Comments
 (0)