}
/* }}} */
-ZEND_API const zend_function *zend_get_closure_method_def(zval *obj) /* {{{ */
+ZEND_API const zend_function *zend_get_closure_method_def(zend_object *obj) /* {{{ */
{
- zend_closure *closure = (zend_closure *)Z_OBJ_P(obj);
+ zend_closure *closure = (zend_closure *) obj;
return &closure->func;
}
/* }}} */
ZEND_API void zend_create_closure(zval *res, zend_function *op_array, zend_class_entry *scope, zend_class_entry *called_scope, zval *this_ptr);
ZEND_API void zend_create_fake_closure(zval *res, zend_function *op_array, zend_class_entry *scope, zend_class_entry *called_scope, zval *this_ptr);
ZEND_API zend_function *zend_get_closure_invoke_method(zend_object *obj);
-ZEND_API const zend_function *zend_get_closure_method_def(zval *obj);
+ZEND_API const zend_function *zend_get_closure_method_def(zend_object *obj);
ZEND_API zval* zend_get_closure_this_ptr(zval *obj);
END_EXTERN_C()
ZEND_METHOD(ReflectionFunction, __construct)
{
zval *object;
- zval *closure = NULL;
+ zend_object *closure_obj = NULL;
reflection_object *intern;
zend_function *fptr;
zend_string *fname, *lcname;
object = ZEND_THIS;
intern = Z_REFLECTION_P(object);
- if (zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET, ZEND_NUM_ARGS(), "O", &closure, zend_ce_closure) == SUCCESS) {
- fptr = (zend_function*)zend_get_closure_method_def(closure);
- } else {
- ALLOCA_FLAG(use_heap)
-
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "S", &fname) == FAILURE) {
- RETURN_THROWS();
- }
+ ZEND_PARSE_PARAMETERS_START(1, 1)
+ Z_PARAM_STR_OR_OBJ_OF_CLASS(fname, closure_obj, zend_ce_closure)
+ ZEND_PARSE_PARAMETERS_END();
+ if (closure_obj) {
+ fptr = (zend_function*)zend_get_closure_method_def(closure_obj);
+ } else {
if (UNEXPECTED(ZSTR_VAL(fname)[0] == '\\')) {
/* Ignore leading "\" */
+ ALLOCA_FLAG(use_heap)
ZSTR_ALLOCA_ALLOC(lcname, ZSTR_LEN(fname) - 1, use_heap);
zend_str_tolower_copy(ZSTR_VAL(lcname), ZSTR_VAL(fname) + 1, ZSTR_LEN(fname) - 1);
fptr = zend_fetch_function(lcname);
ZVAL_STR_COPY(reflection_prop_name(object), fptr->common.function_name);
intern->ptr = fptr;
intern->ref_type = REF_TYPE_FUNCTION;
- if (closure) {
- ZVAL_OBJ_COPY(&intern->obj, Z_OBJ_P(closure));
+ if (closure_obj) {
+ ZVAL_OBJ_COPY(&intern->obj, closure_obj);
} else {
ZVAL_UNDEF(&intern->obj);
}
}
GET_REFLECTION_OBJECT();
if (!Z_ISUNDEF(intern->obj)) {
- closure_func = zend_get_closure_method_def(&intern->obj);
+ closure_func = zend_get_closure_method_def(Z_OBJ(intern->obj));
if (closure_func && closure_func->common.scope) {
zend_reflection_class_factory(closure_func->common.scope, return_value);
}
ce = Z_OBJCE_P(reference);
if (instanceof_function(ce, zend_ce_closure)) {
- fptr = (zend_function *)zend_get_closure_method_def(reference);
+ fptr = (zend_function *)zend_get_closure_method_def(Z_OBJ_P(reference));
Z_ADDREF_P(reference);
is_closure = 1;
} else if ((fptr = zend_hash_find_ptr(&ce->function_table, ZSTR_KNOWN(ZEND_STR_MAGIC_INVOKE))) == NULL) {
object = ZEND_THIS;
intern = Z_REFLECTION_P(object);
- /* Find the class entry */
switch (Z_TYPE_P(classname)) {
case IS_STRING:
if ((ce = zend_lookup_class(Z_STR_P(classname))) == NULL) {
/* {{{ Constructor. Throws an Exception in case the given class constant does not exist */
ZEND_METHOD(ReflectionClassConstant, __construct)
{
- zval *classname, *object;
+ zval *object;
+ zend_string *classname_str;
+ zend_object *classname_obj;
zend_string *constname;
reflection_object *intern;
zend_class_entry *ce;
zend_class_constant *constant = NULL;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "zS", &classname, &constname) == FAILURE) {
- RETURN_THROWS();
+ ZEND_PARSE_PARAMETERS_START(2, 2)
+ Z_PARAM_STR_OR_OBJ(classname_str, classname_obj)
+ Z_PARAM_STR(constname)
+ ZEND_PARSE_PARAMETERS_END();
+
+ if (classname_obj) {
+ ce = classname_obj->ce;
+ } else {
+ if ((ce = zend_lookup_class(classname_str)) == NULL) {
+ zend_throw_exception_ex(reflection_exception_ptr, 0, "Class \"%s\" does not exist", ZSTR_VAL(classname_str));
+ RETURN_THROWS();
+ }
}
object = ZEND_THIS;
intern = Z_REFLECTION_P(object);
- /* Find the class entry */
- switch (Z_TYPE_P(classname)) {
- case IS_STRING:
- if ((ce = zend_lookup_class(Z_STR_P(classname))) == NULL) {
- zend_throw_exception_ex(reflection_exception_ptr, 0,
- "Class \"%s\" does not exist", Z_STRVAL_P(classname));
- RETURN_THROWS();
- }
- break;
-
- case IS_OBJECT:
- ce = Z_OBJCE_P(classname);
- break;
-
- default:
- zend_argument_error(reflection_exception_ptr, 1, "must be of type object|string, %s given", zend_zval_type_name(classname));
- RETURN_THROWS();
- }
-
if ((constant = zend_hash_find_ptr(&ce->constants_table, constname)) == NULL) {
zend_throw_exception_ex(reflection_exception_ptr, 0, "Constant %s::%s does not exist", ZSTR_VAL(ce->name), ZSTR_VAL(constname));
RETURN_THROWS();
GET_REFLECTION_OBJECT_PTR(ce);
if (UNEXPECTED(zend_update_class_constants(ce) != SUCCESS)) {
- return;
+ RETURN_THROWS();
}
if (ce->default_static_members_count && !CE_STATIC_MEMBERS(ce)) {
GET_REFLECTION_OBJECT_PTR(ce);
if (UNEXPECTED(zend_update_class_constants(ce) != SUCCESS)) {
- return;
+ RETURN_THROWS();
}
old_scope = EG(fake_scope);
GET_REFLECTION_OBJECT_PTR(ce);
if (UNEXPECTED(zend_update_class_constants(ce) != SUCCESS)) {
- return;
+ RETURN_THROWS();
}
old_scope = EG(fake_scope);
EG(fake_scope) = ce;
GET_REFLECTION_OBJECT_PTR(ce);
array_init(return_value);
if (UNEXPECTED(zend_update_class_constants(ce) != SUCCESS)) {
- return;
+ RETURN_THROWS();
}
add_class_vars(ce, 1, return_value);
add_class_vars(ce, 0, return_value);
{
reflection_object *intern, *argument;
zend_class_entry *ce, *class_ce;
- zval *class_name;
+ zend_string *class_str;
+ zend_object *class_obj;
- GET_REFLECTION_OBJECT_PTR(ce);
+ ZEND_PARSE_PARAMETERS_START(1, 1)
+ Z_PARAM_STR_OR_OBJ_OF_CLASS(class_str, class_obj, reflection_class_ptr)
+ ZEND_PARSE_PARAMETERS_END();
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "z", &class_name) == FAILURE) {
- RETURN_THROWS();
- }
+ if (class_obj) {
+ argument = reflection_object_from_obj(class_obj);
+ if (argument->ptr == NULL) {
+ zend_throw_error(NULL, "Internal error: Failed to retrieve the argument's reflection object");
+ RETURN_THROWS();
+ }
- switch (Z_TYPE_P(class_name)) {
- case IS_STRING:
- if ((class_ce = zend_lookup_class(Z_STR_P(class_name))) == NULL) {
- zend_throw_exception_ex(reflection_exception_ptr, 0,
- "Class \"%s\" does not exist", Z_STRVAL_P(class_name));
- RETURN_THROWS();
- }
- break;
- case IS_OBJECT:
- if (instanceof_function(Z_OBJCE_P(class_name), reflection_class_ptr)) {
- argument = Z_REFLECTION_P(class_name);
- if (argument->ptr == NULL) {
- zend_throw_error(NULL, "Internal error: Failed to retrieve the argument's reflection object");
- RETURN_THROWS();
- }
- class_ce = argument->ptr;
- break;
- }
- /* no break */
- default:
- zend_argument_error(reflection_exception_ptr, 1, "must be of type ReflectionClass|string, %s given", zend_zval_type_name(class_name));
+ class_ce = argument->ptr;
+ } else {
+ if ((class_ce = zend_lookup_class(class_str)) == NULL) {
+ zend_throw_exception_ex(reflection_exception_ptr, 0, "Class \"%s\" does not exist", ZSTR_VAL(class_str));
RETURN_THROWS();
+ }
}
+ GET_REFLECTION_OBJECT_PTR(ce);
+
RETURN_BOOL((ce != class_ce && instanceof_function(ce, class_ce)));
}
/* }}} */
ZEND_METHOD(ReflectionClass, implementsInterface)
{
reflection_object *intern, *argument;
+ zend_string *interface_str;
zend_class_entry *ce, *interface_ce;
- zval *interface;
+ zend_object *interface_obj;
- GET_REFLECTION_OBJECT_PTR(ce);
+ ZEND_PARSE_PARAMETERS_START(1, 1)
+ Z_PARAM_STR_OR_OBJ_OF_CLASS(interface_str, interface_obj, reflection_class_ptr)
+ ZEND_PARSE_PARAMETERS_END();
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "z", &interface) == FAILURE) {
- RETURN_THROWS();
- }
+ if (interface_obj) {
+ argument = reflection_object_from_obj(interface_obj);
+ if (argument->ptr == NULL) {
+ zend_throw_error(NULL, "Internal error: Failed to retrieve the argument's reflection object");
+ RETURN_THROWS();
+ }
- switch (Z_TYPE_P(interface)) {
- case IS_STRING:
- if ((interface_ce = zend_lookup_class(Z_STR_P(interface))) == NULL) {
- zend_throw_exception_ex(reflection_exception_ptr, 0,
- "Interface \"%s\" does not exist", Z_STRVAL_P(interface));
- RETURN_THROWS();
- }
- break;
- case IS_OBJECT:
- if (instanceof_function(Z_OBJCE_P(interface), reflection_class_ptr)) {
- argument = Z_REFLECTION_P(interface);
- if (argument->ptr == NULL) {
- zend_throw_error(NULL, "Internal error: Failed to retrieve the argument's reflection object");
- RETURN_THROWS();
- }
- interface_ce = argument->ptr;
- break;
- }
- /* no break */
- default:
- zend_argument_error(reflection_exception_ptr, 1, "must be of type ReflectionClass|string, %s given", zend_zval_type_name(interface));
+ interface_ce = argument->ptr;
+ } else {
+ if ((interface_ce = zend_lookup_class(interface_str)) == NULL) {
+ zend_throw_exception_ex(reflection_exception_ptr, 0, "Interface \"%s\" does not exist", ZSTR_VAL(interface_str));
RETURN_THROWS();
+ }
}
if (!(interface_ce->ce_flags & ZEND_ACC_INTERFACE)) {
- zend_throw_exception_ex(reflection_exception_ptr, 0,
- "%s is not an interface", ZSTR_VAL(interface_ce->name));
+ zend_throw_exception_ex(reflection_exception_ptr, 0, "%s is not an interface", ZSTR_VAL(interface_ce->name));
RETURN_THROWS();
}
+
+ GET_REFLECTION_OBJECT_PTR(ce);
+
RETURN_BOOL(instanceof_function(ce, interface_ce));
}
/* }}} */
/* {{{ Constructor. Throws an Exception in case the given property does not exist */
ZEND_METHOD(ReflectionProperty, __construct)
{
- zval *classname;
+ zend_string *classname_str;
+ zend_object *classname_obj;
zend_string *name;
int dynam_prop = 0;
zval *object;
zend_property_info *property_info = NULL;
property_reference *reference;
- if (zend_parse_parameters(ZEND_NUM_ARGS(), "zS", &classname, &name) == FAILURE) {
- RETURN_THROWS();
- }
+ ZEND_PARSE_PARAMETERS_START(2, 2)
+ Z_PARAM_STR_OR_OBJ(classname_str, classname_obj)
+ Z_PARAM_STR(name)
+ ZEND_PARSE_PARAMETERS_END();
object = ZEND_THIS;
intern = Z_REFLECTION_P(object);
- /* Find the class entry */
- switch (Z_TYPE_P(classname)) {
- case IS_STRING:
- if ((ce = zend_lookup_class(Z_STR_P(classname))) == NULL) {
- zend_throw_exception_ex(reflection_exception_ptr, 0,
- "Class \"%s\" does not exist", Z_STRVAL_P(classname));
- RETURN_THROWS();
- }
- break;
-
- case IS_OBJECT:
- ce = Z_OBJCE_P(classname);
- break;
-
- default:
- zend_argument_error(reflection_exception_ptr, 1, "must be of type object|string, %s given", zend_zval_type_name(classname));
+ if (classname_obj) {
+ ce = classname_obj->ce;
+ } else {
+ if ((ce = zend_lookup_class(classname_str)) == NULL) {
+ zend_throw_exception_ex(reflection_exception_ptr, 0, "Class \"%s\" does not exist", ZSTR_VAL(classname_str));
RETURN_THROWS();
+ }
}
property_info = zend_hash_find_ptr(&ce->properties_info, name);
|| ((property_info->flags & ZEND_ACC_PRIVATE)
&& property_info->ce != ce)) {
/* Check for dynamic properties */
- if (property_info == NULL && Z_TYPE_P(classname) == IS_OBJECT) {
- if (zend_hash_exists(Z_OBJ_HT_P(classname)->get_properties(Z_OBJ_P(classname)), name)) {
+ if (property_info == NULL && classname_obj) {
+ if (zend_hash_exists(classname_obj->handlers->get_properties(classname_obj), name)) {
dynam_prop = 1;
}
}
class ReflectionFunction extends ReflectionFunctionAbstract
{
- /** @param string|Closure $name */
- public function __construct($name) {}
+ public function __construct(Closure|string $function) {}
public function __toString(): string {}
class ReflectionMethod extends ReflectionFunctionAbstract
{
- /** @param object|string $class_or_method */
- public function __construct($class_or_method, string $name = UNKNOWN) {}
+ /** @param object|string $objectOrMethod */
+ public function __construct($objectOrMethod, string $method = UNKNOWN) {}
public function __toString(): string {}
public function getPrototype() {}
/** @return void */
- public function setAccessible(bool $visible) {}
+ public function setAccessible(bool $isAccessible) {}
}
class ReflectionClass implements Reflector
{
final private function __clone() {}
- /** @param object|string $argument */
- public function __construct($argument) {}
+ /** @param object|string $objectOrClass */
+ public function __construct($objectOrClass) {}
public function __toString(): string {}
public function isInstance(object $object) {}
/** @return object */
- public function newInstance(...$args) {}
+ public function newInstance(mixed ...$args) {}
/** @return object */
public function newInstanceWithoutConstructor() {}
/** @return ReflectionClass|false */
public function getParentClass() {}
- /**
- * @param string|ReflectionClass $class
- * @return bool
- */
- public function isSubclassOf($class) {}
+ /** @return bool */
+ public function isSubclassOf(ReflectionClass|string $class) {}
/** @return array|null */
public function getStaticProperties() {}
*/
public function isIterateable() {}
- /**
- * @param string|ReflectionClass $interface
- * @return bool
- */
- public function implementsInterface($interface) {}
+ /** @return bool */
+ public function implementsInterface(ReflectionClass|string $interface) {}
/** @return ReflectionExtension|null */
public function getExtension() {}
/** @alias ReflectionClass::__clone */
final private function __clone() {}
- /** @param string|object $class */
- public function __construct($class, string $name) {}
+ public function __construct(object|string $class, string $property) {}
public function __toString(): string {}
public function getValue(?object $object = null) {}
/** @return void */
- public function setValue($object_or_value, $value = UNKNOWN) {}
+ public function setValue($objectOrValue, $value = UNKNOWN) {}
/** @return bool */
public function isInitialized(?object $object = null) {}
public function getDocComment() {}
/** @return void */
- public function setAccessible(bool $visible) {}
+ public function setAccessible(bool $isAccessible) {}
/** @return ReflectionType|null */
public function getType() {}
/** @alias ReflectionClass::__clone */
final private function __clone() {}
- /** @return string|object */
- public function __construct($class, string $name) {}
+ public function __construct(object|string $class, string $constant) {}
public function __toString(): string {}
/** @alias ReflectionClass::__clone */
final private function __clone() {}
- /**
- * @param $function string|array|object
- */
+ /** @param string|array|object $function */
public function __construct($function, int|string $parameter) {}
public function __toString(): string {}
/* This is a generated file, edit the .stub.php file instead.
- * Stub hash: 330900e4fdcc9691ef971a270d065f859cee47bd */
+ * Stub hash: 0a3d9fb707ddf5e508075799bf06ff42b849a4b8 */
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_Reflection_getModifierNames, 0, 0, 1)
ZEND_ARG_TYPE_INFO(0, modifiers, IS_LONG, 0)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_ReflectionFunction___construct, 0, 0, 1)
- ZEND_ARG_INFO(0, name)
+ ZEND_ARG_OBJ_TYPE_MASK(0, function, Closure, MAY_BE_STRING, NULL)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_ReflectionFunction___toString, 0, 0, IS_STRING, 0)
#define arginfo_class_ReflectionGenerator_getExecutingGenerator arginfo_class_ReflectionFunctionAbstract___clone
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_ReflectionMethod___construct, 0, 0, 1)
- ZEND_ARG_INFO(0, class_or_method)
- ZEND_ARG_TYPE_INFO(0, name, IS_STRING, 0)
+ ZEND_ARG_INFO(0, objectOrMethod)
+ ZEND_ARG_TYPE_INFO(0, method, IS_STRING, 0)
ZEND_END_ARG_INFO()
#define arginfo_class_ReflectionMethod___toString arginfo_class_ReflectionFunction___toString
#define arginfo_class_ReflectionMethod_getPrototype arginfo_class_ReflectionFunctionAbstract___clone
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_ReflectionMethod_setAccessible, 0, 0, 1)
- ZEND_ARG_TYPE_INFO(0, visible, _IS_BOOL, 0)
+ ZEND_ARG_TYPE_INFO(0, isAccessible, _IS_BOOL, 0)
ZEND_END_ARG_INFO()
#define arginfo_class_ReflectionClass___clone arginfo_class_ReflectionFunctionAbstract___clone
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_ReflectionClass___construct, 0, 0, 1)
- ZEND_ARG_INFO(0, argument)
+ ZEND_ARG_INFO(0, objectOrClass)
ZEND_END_ARG_INFO()
#define arginfo_class_ReflectionClass___toString arginfo_class_ReflectionFunction___toString
ZEND_ARG_TYPE_INFO(0, object, IS_OBJECT, 0)
ZEND_END_ARG_INFO()
-ZEND_BEGIN_ARG_INFO_EX(arginfo_class_ReflectionClass_newInstance, 0, 0, 0)
- ZEND_ARG_VARIADIC_INFO(0, args)
-ZEND_END_ARG_INFO()
+#define arginfo_class_ReflectionClass_newInstance arginfo_class_ReflectionFunction_invoke
#define arginfo_class_ReflectionClass_newInstanceWithoutConstructor arginfo_class_ReflectionFunctionAbstract___clone
#define arginfo_class_ReflectionClass_getParentClass arginfo_class_ReflectionFunctionAbstract___clone
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_ReflectionClass_isSubclassOf, 0, 0, 1)
- ZEND_ARG_INFO(0, class)
+ ZEND_ARG_OBJ_TYPE_MASK(0, class, ReflectionClass, MAY_BE_STRING, NULL)
ZEND_END_ARG_INFO()
#define arginfo_class_ReflectionClass_getStaticProperties arginfo_class_ReflectionFunctionAbstract___clone
#define arginfo_class_ReflectionClass_isIterateable arginfo_class_ReflectionFunctionAbstract___clone
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_ReflectionClass_implementsInterface, 0, 0, 1)
- ZEND_ARG_INFO(0, interface)
+ ZEND_ARG_OBJ_TYPE_MASK(0, interface, ReflectionClass, MAY_BE_STRING, NULL)
ZEND_END_ARG_INFO()
#define arginfo_class_ReflectionClass_getExtension arginfo_class_ReflectionFunctionAbstract___clone
#define arginfo_class_ReflectionProperty___clone arginfo_class_ReflectionFunctionAbstract___clone
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_ReflectionProperty___construct, 0, 0, 2)
- ZEND_ARG_INFO(0, class)
- ZEND_ARG_TYPE_INFO(0, name, IS_STRING, 0)
+ ZEND_ARG_TYPE_MASK(0, class, MAY_BE_OBJECT|MAY_BE_STRING, NULL)
+ ZEND_ARG_TYPE_INFO(0, property, IS_STRING, 0)
ZEND_END_ARG_INFO()
#define arginfo_class_ReflectionProperty___toString arginfo_class_ReflectionFunction___toString
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_ReflectionProperty_setValue, 0, 0, 1)
- ZEND_ARG_INFO(0, object_or_value)
+ ZEND_ARG_INFO(0, objectOrValue)
ZEND_ARG_INFO(0, value)
ZEND_END_ARG_INFO()
#define arginfo_class_ReflectionClassConstant___clone arginfo_class_ReflectionFunctionAbstract___clone
-#define arginfo_class_ReflectionClassConstant___construct arginfo_class_ReflectionProperty___construct
+ZEND_BEGIN_ARG_INFO_EX(arginfo_class_ReflectionClassConstant___construct, 0, 0, 2)
+ ZEND_ARG_TYPE_MASK(0, class, MAY_BE_OBJECT|MAY_BE_STRING, NULL)
+ ZEND_ARG_TYPE_INFO(0, constant, IS_STRING, 0)
+ZEND_END_ARG_INFO()
#define arginfo_class_ReflectionClassConstant___toString arginfo_class_ReflectionFunction___toString
echo "Done\n";
?>
--EXPECT--
-string(91) "ReflectionMethod::__construct(): Argument #1 ($class_or_method) must be a valid method name"
-string(91) "ReflectionMethod::__construct(): Argument #1 ($class_or_method) must be a valid method name"
+string(90) "ReflectionMethod::__construct(): Argument #1 ($objectOrMethod) must be a valid method name"
+string(90) "ReflectionMethod::__construct(): Argument #1 ($objectOrMethod) must be a valid method name"
string(23) "Class "" does not exist"
string(24) "Class "a" does not exist"
string(23) "Class "" does not exist"
string(24) "Class "a" does not exist"
string(23) "Class "" does not exist"
-string(104) "ReflectionMethod::__construct(): Argument #1 ($class_or_method) must be of type object|string, int given"
+string(103) "ReflectionMethod::__construct(): Argument #1 ($objectOrMethod) must be of type object|string, int given"
string(23) "Class "" does not exist"
Done
foreach ($rcs as $childName => $child) {
foreach ($rcs as $parentName => $parent) {
- echo "Does " . $childName . " implement " . $parentName . "? \n";
+ echo "Does " . $childName . " implement " . $parentName . "?\n";
echo " - Using object argument: ";
try {
var_dump($child->implementsInterface($parent));
- } catch (Exception $e) {
+ } catch (Exception|TypeError $e) {
echo $e->getMessage() . "\n";
}
echo " - Using string argument: ";
try {
var_dump($child->implementsInterface($parentName));
- } catch (Exception $e) {
+ } catch (Exception|TypeError $e) {
echo $e->getMessage() . "\n";
}
}
echo "\n\nTest bad arguments:\n";
try {
- var_dump($rcs['A']->implementsInterface());
-} catch (TypeError $e) {
+ $rcs['A']->implementsInterface();
+} catch (ArgumentCountError $e) {
echo $e->getMessage() . "\n";
}
try {
- var_dump($rcs['A']->implementsInterface('C', 'C'));
-} catch (TypeError $e) {
+ $rcs['A']->implementsInterface('C', 'C');
+} catch (ArgumentCountError $e) {
echo $e->getMessage() . "\n";
}
try {
- var_dump($rcs['A']->implementsInterface(null));
-} catch (Exception $e) {
+ $rcs['A']->implementsInterface(null);
+} catch (ReflectionException $e) {
echo $e->getMessage() . "\n";
}
try {
- var_dump($rcs['A']->implementsInterface('ThisClassDoesNotExist'));
-} catch (Exception $e) {
+ $rcs['A']->implementsInterface('ThisClassDoesNotExist');
+} catch (ReflectionException $e) {
echo $e->getMessage() . "\n";
}
try {
- var_dump($rcs['A']->implementsInterface(2));
-} catch (Exception $e) {
+ $rcs['A']->implementsInterface(2);
+} catch (ReflectionException $e) {
echo $e->getMessage() . "\n";
}
?>
--EXPECT--
-Does A implement A?
+Does A implement A?
- Using object argument: A is not an interface
- Using string argument: A is not an interface
-Does A implement B?
+Does A implement B?
- Using object argument: B is not an interface
- Using string argument: B is not an interface
-Does A implement C?
+Does A implement C?
- Using object argument: C is not an interface
- Using string argument: C is not an interface
-Does A implement I1?
+Does A implement I1?
- Using object argument: bool(true)
- Using string argument: bool(true)
-Does A implement I2?
+Does A implement I2?
- Using object argument: bool(false)
- Using string argument: bool(false)
-Does B implement A?
+Does B implement A?
- Using object argument: A is not an interface
- Using string argument: A is not an interface
-Does B implement B?
+Does B implement B?
- Using object argument: B is not an interface
- Using string argument: B is not an interface
-Does B implement C?
+Does B implement C?
- Using object argument: C is not an interface
- Using string argument: C is not an interface
-Does B implement I1?
+Does B implement I1?
- Using object argument: bool(true)
- Using string argument: bool(true)
-Does B implement I2?
+Does B implement I2?
- Using object argument: bool(false)
- Using string argument: bool(false)
-Does C implement A?
+Does C implement A?
- Using object argument: A is not an interface
- Using string argument: A is not an interface
-Does C implement B?
+Does C implement B?
- Using object argument: B is not an interface
- Using string argument: B is not an interface
-Does C implement C?
+Does C implement C?
- Using object argument: C is not an interface
- Using string argument: C is not an interface
-Does C implement I1?
+Does C implement I1?
- Using object argument: bool(true)
- Using string argument: bool(true)
-Does C implement I2?
+Does C implement I2?
- Using object argument: bool(true)
- Using string argument: bool(true)
-Does I1 implement A?
+Does I1 implement A?
- Using object argument: A is not an interface
- Using string argument: A is not an interface
-Does I1 implement B?
+Does I1 implement B?
- Using object argument: B is not an interface
- Using string argument: B is not an interface
-Does I1 implement C?
+Does I1 implement C?
- Using object argument: C is not an interface
- Using string argument: C is not an interface
-Does I1 implement I1?
+Does I1 implement I1?
- Using object argument: bool(true)
- Using string argument: bool(true)
-Does I1 implement I2?
+Does I1 implement I2?
- Using object argument: bool(false)
- Using string argument: bool(false)
-Does I2 implement A?
+Does I2 implement A?
- Using object argument: A is not an interface
- Using string argument: A is not an interface
-Does I2 implement B?
+Does I2 implement B?
- Using object argument: B is not an interface
- Using string argument: B is not an interface
-Does I2 implement C?
+Does I2 implement C?
- Using object argument: C is not an interface
- Using string argument: C is not an interface
-Does I2 implement I1?
+Does I2 implement I1?
- Using object argument: bool(true)
- Using string argument: bool(true)
-Does I2 implement I2?
+Does I2 implement I2?
- Using object argument: bool(true)
- Using string argument: bool(true)
Test bad arguments:
ReflectionClass::implementsInterface() expects exactly 1 parameter, 0 given
ReflectionClass::implementsInterface() expects exactly 1 parameter, 2 given
-ReflectionClass::implementsInterface(): Argument #1 ($interface) must be of type ReflectionClass|string, null given
+Interface "" does not exist
Interface "ThisClassDoesNotExist" does not exist
-ReflectionClass::implementsInterface(): Argument #1 ($interface) must be of type ReflectionClass|string, int given
+Interface "2" does not exist
echo "\n\nTest bad arguments:\n";
try {
- var_dump($rc->isSubclassOf());
-} catch (TypeError $e) {
+ $rc->isSubclassOf();
+} catch (ArgumentCountError $e) {
echo $e->getMessage() . "\n";
}
try {
- var_dump($rc->isSubclassOf('C', 'C'));
-} catch (TypeError $e) {
+ $rc->isSubclassOf('C', 'C');
+} catch (ArgumentCountError $e) {
echo $e->getMessage() . "\n";
}
try {
- var_dump($rc->isSubclassOf(null));
-} catch (Exception $e) {
+ $rc->isSubclassOf(null);
+} catch (ReflectionException $e) {
echo $e->getMessage() . "\n";
}
try {
- var_dump($rc->isSubclassOf('ThisClassDoesNotExist'));
-} catch (Exception $e) {
+ $rc->isSubclassOf('ThisClassDoesNotExist');
+} catch (ReflectionException $e) {
echo $e->getMessage() . "\n";
}
try {
- var_dump($rc->isSubclassOf(2));
-} catch (Exception $e) {
+ $rc->isSubclassOf(2);
+} catch (ReflectionException $e) {
echo $e->getMessage() . "\n";
}
?>
Test bad arguments:
ReflectionClass::isSubclassOf() expects exactly 1 parameter, 0 given
ReflectionClass::isSubclassOf() expects exactly 1 parameter, 2 given
-ReflectionClass::isSubclassOf(): Argument #1 ($class) must be of type ReflectionClass|string, null given
+Class "" does not exist
Class "ThisClassDoesNotExist" does not exist
-ReflectionClass::isSubclassOf(): Argument #1 ($class) must be of type ReflectionClass|string, int given
+Class "2" does not exist
Method [ <internal:Reflection, ctor> public method __construct ] {
- Parameters [1] {
- Parameter #0 [ <required> $argument ]
+ Parameter #0 [ <required> $objectOrClass ]
}
}
Method [ <internal:Reflection> public method newInstance ] {
- Parameters [1] {
- Parameter #0 [ <optional> ...$args = <default> ]
+ Parameter #0 [ <optional> mixed ...$args = <default> ]
}
}
Method [ <internal:Reflection> public method isSubclassOf ] {
- Parameters [1] {
- Parameter #0 [ <required> $class ]
+ Parameter #0 [ <required> ReflectionClass|string $class ]
}
}
Method [ <internal:Reflection> public method implementsInterface ] {
- Parameters [1] {
- Parameter #0 [ <required> $interface ]
+ Parameter #0 [ <required> ReflectionClass|string $interface ]
}
}
?>
--EXPECT--
-Ok - ReflectionFunction::__construct(): Argument #1 ($name) must be of type string, array given
+Ok - ReflectionFunction::__construct(): Argument #1 ($function) must be of type Closure|string, array given
Function nonExistentFunction() does not exist
Ok - ReflectionFunction::__construct() expects exactly 1 parameter, 0 given
Ok - ReflectionFunction::__construct() expects exactly 1 parameter, 2 given
-Ok - ReflectionFunction::__construct(): Argument #1 ($name) must be of type string, array given
+Ok - ReflectionFunction::__construct(): Argument #1 ($function) must be of type Closure|string, array given
string(%d) "Method [ <internal:Reflection, ctor> public method __construct ] {
- Parameters [2] {
- Parameter #0 [ <required> $class ]
- Parameter #1 [ <required> string $name ]
+ Parameter #0 [ <required> object|string $class ]
+ Parameter #1 [ <required> string $property ]
}
}
"
?>
--EXPECTF--
Wrong type of argument (bool):
-ReflectionException: ReflectionMethod::__construct(): Argument #1 ($class_or_method) must be a valid method name in %s:%d
+ReflectionException: ReflectionMethod::__construct(): Argument #1 ($objectOrMethod) must be a valid method name in %s:%d
Stack trace:
#0 %s ReflectionMethod->__construct('1')
#1 {main}
Wrong type of argument (int):
-ReflectionException: ReflectionMethod::__construct(): Argument #1 ($class_or_method) must be a valid method name in %s:%d
+ReflectionException: ReflectionMethod::__construct(): Argument #1 ($objectOrMethod) must be a valid method name in %s:%d
Stack trace:
#0 %s ReflectionMethod->__construct('3')
#1 {main}
Wrong type of argument (bool, string):
-ReflectionException: ReflectionMethod::__construct(): Argument #1 ($class_or_method) must be of type object|string, bool given in %s:%d
+ReflectionException: ReflectionMethod::__construct(): Argument #1 ($objectOrMethod) must be of type object|string, bool given in %s:%d
Stack trace:
#0 %s ReflectionMethod->__construct(true, 'foo')
#1 {main}
#0 %s ReflectionMethod->__construct('TestClass', '1')
#1 {main}
No method given:
-ReflectionException: ReflectionMethod::__construct(): Argument #1 ($class_or_method) must be a valid method name in %s:%d
+ReflectionException: ReflectionMethod::__construct(): Argument #1 ($objectOrMethod) must be a valid method name in %s:%d
Stack trace:
#0 %s ReflectionMethod->__construct('TestClass')
#1 {main}
Too many arguments:
Ok - ReflectionMethod::__construct() expects exactly 1 parameter, 3 given
Ok - Class "InvalidClassName" does not exist
-Ok - ReflectionMethod::__construct(): Argument #1 ($class_or_method) must be of type object|string, array given
+Ok - ReflectionMethod::__construct(): Argument #1 ($objectOrMethod) must be of type object|string, array given
Ok - ReflectionMethod::__construct() expects exactly 1 parameter, 2 given
echo "\n\nTest bad arguments:\n";
try {
- var_dump($ro->isSubclassOf());
-} catch (TypeError $e) {
+ $ro->isSubclassOf();
+} catch (ArgumentCountError $e) {
echo $e->getMessage() . "\n";
}
try {
- var_dump($ro->isSubclassOf('C', 'C'));
-} catch (TypeError $e) {
+ $ro->isSubclassOf('C', 'C');
+} catch (ArgumentCountError $e) {
echo $e->getMessage() . "\n";
}
try {
- var_dump($ro->isSubclassOf(null));
-} catch (Exception $e) {
+ $ro->isSubclassOf(null);
+} catch (ReflectionException $e) {
echo $e->getMessage() . "\n";
}
try {
- var_dump($ro->isSubclassOf('ThisClassDoesNotExist'));
-} catch (Exception $e) {
+ $ro->isSubclassOf('ThisClassDoesNotExist');
+} catch (ReflectionException $e) {
echo $e->getMessage() . "\n";
}
try {
- var_dump($ro->isSubclassOf(2));
-} catch (Exception $e) {
+ $ro->isSubclassOf(2);
+} catch (ReflectionException $e) {
echo $e->getMessage() . "\n";
}
?>
Test bad arguments:
ReflectionClass::isSubclassOf() expects exactly 1 parameter, 0 given
ReflectionClass::isSubclassOf() expects exactly 1 parameter, 2 given
-ReflectionClass::isSubclassOf(): Argument #1 ($class) must be of type ReflectionClass|string, null given
+Class "" does not exist
Class "ThisClassDoesNotExist" does not exist
-ReflectionClass::isSubclassOf(): Argument #1 ($class) must be of type ReflectionClass|string, int given
+Class "2" does not exist
echo "Non-existent class:\n";
try {
- $propInfo = new ReflectionProperty("NonExistentClass", "prop");
-}
-catch(Exception $e) {
+ new ReflectionProperty("NonExistentClass", "prop");
+} catch (ReflectionException $e) {
echo $e->getMessage();
}
echo "\n\nWrong property parameter type:\n";
try {
- $propInfo = new ReflectionProperty($a, 'TestClass');
+ new ReflectionProperty($a, 'TestClass');
}
catch(ReflectionException $e) {
echo $e->getMessage();
echo "\n\nNon-existent property:\n";
try {
- $propInfo = new ReflectionProperty('TestClass', "nonExistentProperty");
+ new ReflectionProperty('TestClass', "nonExistentProperty");
}
-catch(Exception $e) {
+catch(ReflectionException $e) {
echo $e->getMessage();
}
Class "NonExistentClass" does not exist
Wrong property parameter type:
-ReflectionProperty::__construct(): Argument #1 ($class) must be of type object|string, int given
+Class "5" does not exist
Non-existent property:
Property TestClass::$nonExistentProperty does not exist