mirror of
https://github.com/php/php-src.git
synced 2024-12-01 22:03:36 +08:00
Fixed ReflectionFunction, ReflectionMethod and ReflectionParameter.
This commit is contained in:
parent
b00cd68d74
commit
043a02605f
@ -18,7 +18,7 @@ catch(PDOException $pe) {
|
||||
}
|
||||
}
|
||||
catch(\Exception $e) {
|
||||
echo "Failed to ";
|
||||
echo "Exception throw was not of type PDOException instead was ".get_class($e).PHP_EOL;
|
||||
}
|
||||
|
||||
?>
|
||||
|
@ -1576,6 +1576,8 @@ ZEND_METHOD(reflection_function, __construct)
|
||||
zend_function *fptr;
|
||||
char *name_str;
|
||||
size_t name_len;
|
||||
int rv;
|
||||
zend_error_handling zeh;
|
||||
|
||||
object = getThis();
|
||||
intern = Z_REFLECTION_P(object);
|
||||
@ -1586,27 +1588,32 @@ ZEND_METHOD(reflection_function, __construct)
|
||||
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);
|
||||
Z_ADDREF_P(closure);
|
||||
} else if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", &name_str, &name_len) == SUCCESS) {
|
||||
char *nsname;
|
||||
|
||||
lcname = zend_str_tolower_dup(name_str, name_len);
|
||||
|
||||
/* Ignore leading "\" */
|
||||
nsname = lcname;
|
||||
if (lcname[0] == '\\') {
|
||||
nsname = &lcname[1];
|
||||
name_len--;
|
||||
}
|
||||
|
||||
if ((fptr = zend_hash_str_find_ptr(EG(function_table), nsname, name_len)) == NULL) {
|
||||
} else {
|
||||
zend_replace_error_handling(EH_THROW, reflection_exception_ptr, &zeh TSRMLS_CC);
|
||||
rv = zend_parse_parameters(ZEND_NUM_ARGS(), "s", &name_str, &name_len);
|
||||
zend_restore_error_handling(&zeh TSRMLS_CC);
|
||||
if (rv == SUCCESS) {
|
||||
char *nsname;
|
||||
lcname = zend_str_tolower_dup(name_str, name_len);
|
||||
|
||||
/* Ignore leading "\" */
|
||||
nsname = lcname;
|
||||
if (lcname[0] == '\\') {
|
||||
nsname = &lcname[1];
|
||||
name_len--;
|
||||
}
|
||||
|
||||
if ((fptr = zend_hash_str_find_ptr(EG(function_table), nsname, name_len)) == NULL) {
|
||||
efree(lcname);
|
||||
zend_throw_exception_ex(reflection_exception_ptr, 0,
|
||||
"Function %s() does not exist", name_str);
|
||||
return;
|
||||
}
|
||||
efree(lcname);
|
||||
zend_throw_exception_ex(reflection_exception_ptr, 0,
|
||||
"Function %s() does not exist", name_str);
|
||||
} else {
|
||||
//Exception has been thrown.
|
||||
return;
|
||||
}
|
||||
efree(lcname);
|
||||
} else {
|
||||
return;
|
||||
}
|
||||
|
||||
ZVAL_STR_COPY(&name, fptr->common.function_name);
|
||||
@ -2128,10 +2135,14 @@ ZEND_METHOD(reflection_parameter, __construct)
|
||||
zend_class_entry *ce = NULL;
|
||||
zend_bool is_closure = 0;
|
||||
zend_bool is_invoke = 0;
|
||||
zend_error_handling zeh;
|
||||
|
||||
zend_replace_error_handling(EH_THROW, reflection_exception_ptr, &zeh TSRMLS_CC);
|
||||
if (zend_parse_parameters(ZEND_NUM_ARGS(), "zz", &reference, ¶meter) == FAILURE) {
|
||||
zend_restore_error_handling(&zeh TSRMLS_CC);
|
||||
return;
|
||||
}
|
||||
zend_restore_error_handling(&zeh TSRMLS_CC);
|
||||
|
||||
object = getThis();
|
||||
intern = Z_REFLECTION_P(object);
|
||||
@ -2712,7 +2723,13 @@ ZEND_METHOD(reflection_method, __construct)
|
||||
zval ztmp;
|
||||
|
||||
if (zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET, ZEND_NUM_ARGS(), "zs", &classname, &name_str, &name_len) == FAILURE) {
|
||||
if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", &name_str, &name_len) == FAILURE) {
|
||||
zend_error_handling zeh;
|
||||
int rv;
|
||||
|
||||
zend_replace_error_handling(EH_THROW, reflection_exception_ptr, &zeh TSRMLS_CC);
|
||||
rv = zend_parse_parameters(ZEND_NUM_ARGS(), "s", &name_str, &name_len);
|
||||
zend_restore_error_handling(&zeh TSRMLS_CC);
|
||||
if (rv == FAILURE) {
|
||||
return;
|
||||
}
|
||||
if ((tmp = strstr(name_str, "::")) == NULL) {
|
||||
|
@ -6,18 +6,41 @@ Steve Seear <stevseea@php.net>
|
||||
--FILE--
|
||||
<?php
|
||||
|
||||
$a = new ReflectionFunction(array(1, 2, 3));
|
||||
try {
|
||||
$a = new ReflectionFunction(array(1, 2, 3));
|
||||
echo "exception not thrown.".PHP_EOL;
|
||||
}
|
||||
catch(ReflectionException $re) {
|
||||
echo "Ok - ".$re->getMessage().PHP_EOL;
|
||||
}
|
||||
try {
|
||||
$a = new ReflectionFunction('nonExistentFunction');
|
||||
} catch (Exception $e) {
|
||||
echo $e->getMessage();
|
||||
echo $e->getMessage().PHP_EOL;
|
||||
}
|
||||
$a = new ReflectionFunction();
|
||||
$a = new ReflectionFunction(1, 2);
|
||||
try {
|
||||
$a = new ReflectionFunction();
|
||||
}
|
||||
catch(ReflectionException $re) {
|
||||
echo "Ok - ".$re->getMessage().PHP_EOL;
|
||||
}
|
||||
try {
|
||||
$a = new ReflectionFunction(1, 2);
|
||||
}
|
||||
catch(ReflectionException $re) {
|
||||
echo "Ok - ".$re->getMessage().PHP_EOL;
|
||||
}
|
||||
try {
|
||||
$a = new ReflectionFunction([]);
|
||||
}
|
||||
catch(ReflectionException $re) {
|
||||
echo "Ok - ".$re->getMessage().PHP_EOL;
|
||||
}
|
||||
|
||||
?>
|
||||
--EXPECTF--
|
||||
Warning: ReflectionFunction::__construct() expects parameter 1 to be string, array given in %s on line %d
|
||||
Ok - ReflectionFunction::__construct() expects parameter 1 to be string, array given
|
||||
Function nonExistentFunction() does not exist
|
||||
Warning: ReflectionFunction::__construct() expects exactly 1 parameter, 0 given in %s on line %d
|
||||
|
||||
Warning: ReflectionFunction::__construct() expects exactly 1 parameter, 2 given in %s on line %d
|
||||
Ok - ReflectionFunction::__construct() expects exactly 1 parameter, 0 given
|
||||
Ok - ReflectionFunction::__construct() expects exactly 1 parameter, 2 given
|
||||
Ok - ReflectionFunction::__construct() expects parameter 1 to be string, array given
|
||||
|
@ -6,8 +6,18 @@ Steve Seear <stevseea@php.net>
|
||||
--FILE--
|
||||
<?php
|
||||
|
||||
var_dump(new ReflectionMethod());
|
||||
var_dump(new ReflectionMethod('a', 'b', 'c'));
|
||||
try {
|
||||
new ReflectionMethod();
|
||||
}
|
||||
catch(ReflectionException $re) {
|
||||
echo "Ok - ".$re->getMessage().PHP_EOL;
|
||||
}
|
||||
try {
|
||||
new ReflectionMethod('a', 'b', 'c');
|
||||
}
|
||||
catch(ReflectionException $re) {
|
||||
echo "Ok - ".$re->getMessage().PHP_EOL;
|
||||
}
|
||||
|
||||
class C {
|
||||
public function f() {}
|
||||
@ -35,21 +45,8 @@ var_dump($rm->getName(1));
|
||||
|
||||
?>
|
||||
--EXPECTF--
|
||||
Warning: ReflectionMethod::__construct() expects exactly 1 parameter, 0 given in %s on line %d
|
||||
object(ReflectionMethod)#%d (2) {
|
||||
["name"]=>
|
||||
string(0) ""
|
||||
["class"]=>
|
||||
string(0) ""
|
||||
}
|
||||
|
||||
Warning: ReflectionMethod::__construct() expects exactly 1 parameter, 3 given in %s on line %d
|
||||
object(ReflectionMethod)#%d (2) {
|
||||
["name"]=>
|
||||
string(0) ""
|
||||
["class"]=>
|
||||
string(0) ""
|
||||
}
|
||||
Ok - ReflectionMethod::__construct() expects exactly 1 parameter, 0 given
|
||||
Ok - ReflectionMethod::__construct() expects exactly 1 parameter, 3 given
|
||||
|
||||
Warning: ReflectionMethod::isFinal() expects exactly 0 parameters, 1 given in %s on line %d
|
||||
NULL
|
||||
|
@ -16,22 +16,47 @@ class TestClass
|
||||
try {
|
||||
echo "Too few arguments:\n";
|
||||
$methodInfo = new ReflectionMethod();
|
||||
} catch (Exception $e) {
|
||||
print $e->__toString();
|
||||
} catch (ReflectionException $re) {
|
||||
echo "Ok - ".$re->getMessage().PHP_EOL;
|
||||
}
|
||||
try {
|
||||
echo "\nToo many arguments:\n";
|
||||
$methodInfo = new ReflectionMethod("TestClass", "foo", true);
|
||||
} catch (Exception $e) {
|
||||
print $e->__toString();
|
||||
} catch (ReflectionException $re) {
|
||||
echo "Ok - ".$re->getMessage().PHP_EOL;
|
||||
}
|
||||
|
||||
|
||||
try {
|
||||
//invalid class
|
||||
$methodInfo = new ReflectionMethod("InvalidClassName", "foo");
|
||||
} catch (ReflectionException $re) {
|
||||
echo "Ok - ".$re->getMessage().PHP_EOL;
|
||||
}
|
||||
|
||||
|
||||
try {
|
||||
//invalid 1st param
|
||||
$methodInfo = new ReflectionMethod([], "foo");
|
||||
} catch (ReflectionException $re) {
|
||||
echo "Ok - ".$re->getMessage().PHP_EOL;
|
||||
}
|
||||
|
||||
try{
|
||||
//invalid 2nd param
|
||||
$methodInfo = new ReflectionMethod("TestClass", []);
|
||||
} catch (ReflectionException $re) {
|
||||
echo "Ok - ".$re->getMessage().PHP_EOL;
|
||||
}
|
||||
|
||||
?>
|
||||
--EXPECTF--
|
||||
Too few arguments:
|
||||
|
||||
Warning: ReflectionMethod::__construct() expects exactly 1 parameter, 0 given in %s on line 12
|
||||
Ok - ReflectionMethod::__construct() expects exactly 1 parameter, 0 given
|
||||
|
||||
Too many arguments:
|
||||
Ok - ReflectionMethod::__construct() expects exactly 1 parameter, 3 given
|
||||
Ok - Class InvalidClassName does not exist
|
||||
Ok - The parameter class is expected to be either a string or an object
|
||||
Ok - ReflectionMethod::__construct() expects exactly 1 parameter, 2 given
|
||||
|
||||
Warning: ReflectionMethod::__construct() expects exactly 1 parameter, 3 given in %s on line 18
|
||||
|
@ -6,7 +6,7 @@ ReflectionParameter::__construct(): Invalid method as constructor
|
||||
// Invalid class name
|
||||
try {
|
||||
new ReflectionParameter (array ('A', 'b'), 0);
|
||||
} catch (ReflectionException $e) { echo $e->getMessage ()."\n"; }
|
||||
} catch (ReflectionException $e) { echo $e->getMessage()."\n"; }
|
||||
|
||||
// Invalid class method
|
||||
try {
|
||||
@ -18,14 +18,31 @@ try {
|
||||
new ReflectionParameter (array (new C, 'b'), 0);
|
||||
} catch (ReflectionException $e) { echo $e->getMessage ()."\n"; }
|
||||
|
||||
echo "Done.\n";
|
||||
|
||||
class C {
|
||||
}
|
||||
|
||||
try {
|
||||
new ReflectionParameter(array ('A', 'b'));
|
||||
}
|
||||
catch(ReflectionException $e) {
|
||||
printf( "Ok - %s\n", $e->getMessage());
|
||||
}
|
||||
|
||||
try {
|
||||
new ReflectionParameter(0, 0);
|
||||
}
|
||||
catch(ReflectionException $e) {
|
||||
printf( "Ok - %s\n", $e->getMessage());
|
||||
}
|
||||
|
||||
echo "Done.\n";
|
||||
|
||||
?>
|
||||
--EXPECTF--
|
||||
Class A does not exist
|
||||
Method C::b() does not exist
|
||||
Method C::b() does not exist
|
||||
Ok - ReflectionParameter::__construct() expects exactly 2 parameters, 1 given
|
||||
Ok - The parameter class is expected to be either a string, an array(class, method) or a callable object
|
||||
Done.
|
||||
|
Loading…
Reference in New Issue
Block a user