helly Sun Mar 12 17:22:34 2006 UTC
Added files: (Branch: PHP_5_1)
/php-src/ext/reflection/tests parameters_002.phpt
Modified files:
/php-src/ext/reflection php_reflection.c
/php-src/ext/reflection/tests bug26695.phpt bug29268.phpt
Log:
- MFH:
- Fix ReflectionParameter
. Reintroduce getClass()
. Change getDeclaringClass() to return what it suggests
. (inactive but tested) Add getDeclaringFunction()
. (inactive but tested) Add getPosition()
- Fix tests accordingly
# This also fixes Bug #36687 ReflectionParameter::getDeclaringClass returns
# wrong result
http://cvs.php.net/viewcvs.cgi/php-src/ext/reflection/php_reflection.c?r1=1.164.2.31&r2=1.164.2.32&diff_format=u
Index: php-src/ext/reflection/php_reflection.c
diff -u php-src/ext/reflection/php_reflection.c:1.164.2.31
php-src/ext/reflection/php_reflection.c:1.164.2.32
--- php-src/ext/reflection/php_reflection.c:1.164.2.31 Mon Mar 6 23:26:28 2006
+++ php-src/ext/reflection/php_reflection.c Sun Mar 12 17:22:34 2006
@@ -20,7 +20,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: php_reflection.c,v 1.164.2.31 2006/03/06 23:26:28 rasmus Exp $ */
+/* $Id: php_reflection.c,v 1.164.2.32 2006/03/12 17:22:34 helly Exp $ */
#ifdef HAVE_CONFIG_H
#include "config.h"
@@ -1787,6 +1787,7 @@
}
efree(lcname);
}
+ ce = fptr->common.scope;
break;
case IS_ARRAY: {
@@ -1901,9 +1902,10 @@
}
/* }}} */
-/* {{{ proto public ReflectionClass ReflectionParameter::getDeclaringClass()
- Returns this parameters's class hint or NULL if there is none */
-ZEND_METHOD(reflection_parameter, getDeclaringClass)
+#if MBO_0
+/* {{{ proto public ReflectionFunction
ReflectionParameter::getDeclaringFunction()
+ Returns the ReflectionFunction for the function of this parameter */
+ZEND_METHOD(reflection_parameter, getDeclaringFunction)
{
reflection_object *intern;
parameter_reference *param;
@@ -1911,12 +1913,44 @@
METHOD_NOTSTATIC_NUMPARAMS(reflection_parameter_ptr, 0);
GET_REFLECTION_OBJECT_PTR(param);
- if (!param->arg_info->class_name) {
- RETURN_NULL();
+ if (!param->fptr->common.scope) {
+ reflection_function_factory(param->fptr, return_value
TSRMLS_CC);
} else {
- zend_class_entry **pce;
+ reflection_method_factory(param->fptr->common.scope,
param->fptr, return_value TSRMLS_CC);
+ }
+}
+/* }}} */
+#endif
+
+/* {{{ proto public ReflectionClass|NULL
ReflectionParameter::getDeclaringClass()
+ Returns in which class this parameter is defined (not the typehint of the
parameter) */
+ZEND_METHOD(reflection_parameter, getDeclaringClass)
+{
+ reflection_object *intern;
+ parameter_reference *param;
+
+ METHOD_NOTSTATIC_NUMPARAMS(reflection_parameter_ptr, 0);
+ GET_REFLECTION_OBJECT_PTR(param);
+
+ if (param->fptr->common.scope) {
+ zend_reflection_class_factory(param->fptr->common.scope,
return_value TSRMLS_CC);
+ }
+}
+/* }}} */
+
+/* {{{ proto public ReflectionClass|NULL ReflectionParameter::getClass()
+ Returns this parameters's class hint or NULL if there is none */
+ZEND_METHOD(reflection_parameter, getClass)
+{
+ reflection_object *intern;
+ parameter_reference *param;
+ zend_class_entry **pce;
+
+ METHOD_NOTSTATIC_NUMPARAMS(reflection_parameter_ptr, 0);
+ GET_REFLECTION_OBJECT_PTR(param);
- if (zend_lookup_class_ex(param->arg_info->class_name,
param->arg_info->class_name_len, 1, &pce TSRMLS_CC) == FAILURE) {
+ 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) {
zend_throw_exception_ex(reflection_exception_ptr, 0
TSRMLS_CC,
"Class %s does not exist",
param->arg_info->class_name);
return;
@@ -1968,6 +2002,22 @@
}
/* }}} */
+#if MBO_0
+/* {{{ proto public bool ReflectionParameter::getPosition()
+ Returns whether this parameter is an optional parameter */
+ZEND_METHOD(reflection_parameter, getPosition)
+{
+ reflection_object *intern;
+ parameter_reference *param;
+
+ METHOD_NOTSTATIC_NUMPARAMS(reflection_parameter_ptr, 0);
+ GET_REFLECTION_OBJECT_PTR(param);
+
+ RETVAL_LONG(param->offset);
+}
+/* }}} */
+#endif
+
/* {{{ proto public bool ReflectionParameter::isOptional()
Returns whether this parameter is an optional parameter */
ZEND_METHOD(reflection_parameter, isOptional)
@@ -4295,10 +4345,16 @@
ZEND_ME(reflection_parameter, __toString, NULL, 0)
ZEND_ME(reflection_parameter, getName, NULL, 0)
ZEND_ME(reflection_parameter, isPassedByReference, NULL, 0)
+#if MBO_0
+ ZEND_ME(reflection_parameter, getDeclaringFunction, NULL, 0)
+#endif
ZEND_ME(reflection_parameter, getDeclaringClass, NULL, 0)
- ZEND_MALIAS(reflection_parameter, getClass, getDeclaringClass, NULL,
ZEND_ACC_PUBLIC|ZEND_ACC_DEPRECATED)
+ ZEND_ME(reflection_parameter, getClass, NULL, 0)
ZEND_ME(reflection_parameter, isArray, NULL, 0)
ZEND_ME(reflection_parameter, allowsNull, NULL, 0)
+#if MBO_0
+ ZEND_ME(reflection_parameter, getPosition, NULL, 0)
+#endif
ZEND_ME(reflection_parameter, isOptional, NULL, 0)
ZEND_ME(reflection_parameter, isDefaultValueAvailable, NULL, 0)
ZEND_ME(reflection_parameter, getDefaultValue, NULL, 0)
@@ -4432,7 +4488,7 @@
php_info_print_table_start();
php_info_print_table_header(2, "Reflection", "enabled");
- php_info_print_table_row(2, "Version", "$Id: php_reflection.c,v
1.164.2.31 2006/03/06 23:26:28 rasmus Exp $");
+ php_info_print_table_row(2, "Version", "$Id: php_reflection.c,v
1.164.2.32 2006/03/12 17:22:34 helly Exp $");
php_info_print_table_end();
} /* }}} */
http://cvs.php.net/viewcvs.cgi/php-src/ext/reflection/tests/bug26695.phpt?r1=1.2.4.2&r2=1.2.4.3&diff_format=u
Index: php-src/ext/reflection/tests/bug26695.phpt
diff -u php-src/ext/reflection/tests/bug26695.phpt:1.2.4.2
php-src/ext/reflection/tests/bug26695.phpt:1.2.4.3
--- php-src/ext/reflection/tests/bug26695.phpt:1.2.4.2 Sun Mar 12 12:38:25 2006
+++ php-src/ext/reflection/tests/bug26695.phpt Sun Mar 12 17:22:34 2006
@@ -17,7 +17,7 @@
$methods = $class->getMethods();
$params = $methods[0]->getParameters();
-$class = $params[0]->getDeclaringClass();
+$class = $params[0]->getClass();
var_dump($class->getName());
?>
http://cvs.php.net/viewcvs.cgi/php-src/ext/reflection/tests/bug29268.phpt?r1=1.1.2.3&r2=1.1.2.4&diff_format=u
Index: php-src/ext/reflection/tests/bug29268.phpt
diff -u php-src/ext/reflection/tests/bug29268.phpt:1.1.2.3
php-src/ext/reflection/tests/bug29268.phpt:1.1.2.4
--- php-src/ext/reflection/tests/bug29268.phpt:1.1.2.3 Sun Mar 12 12:38:25 2006
+++ php-src/ext/reflection/tests/bug29268.phpt Sun Mar 12 17:22:34 2006
@@ -16,8 +16,9 @@
$ref = new reflectionMethod('B','doit');
$parameters = $ref->getParameters();
-foreach($parameters as $parameter){
- $class = $parameter->getDeclaringClass();
+foreach($parameters as $parameter)
+{
+ $class = $parameter->getClass();
echo $class->name."\n";
}
echo "ok\n";
http://cvs.php.net/viewcvs.cgi/php-src/ext/reflection/tests/parameters_002.phpt?view=markup&rev=1.1
Index: php-src/ext/reflection/tests/parameters_002.phpt
+++ php-src/ext/reflection/tests/parameters_002.phpt
--TEST--
ReflectionParameter::getclass(), getDeclaringClass(), getDeclaringFunction()
--SKIPIF--
<?php extension_loaded('reflection') or die('skip'); ?>
--FILE--
<?php
function test($nix, Array $ar, &$ref, stdClass $std, NonExistingClass $na,
stdClass &$opt = NULL, $def = "FooBar")
{
}
class test
{
function test($nix, Array $ar, &$ref, stdClass $std, NonExistingClass
$na, stdClass $opt = NULL, $def = "FooBar")
{
}
}
function check_params_decl_func($r, $f)
{
$c = $r->$f();
echo $f . ': ' . ($c ? ($c instanceof ReflectionMethod ? $c->class .
'::' : '') . $c->name : 'NULL') . "()\n";
}
function check_params_decl_class($r, $f)
{
$c = $r->$f();
echo $f . ': ' . ($c ? $c->name : 'NULL') . "\n";
}
function check_params_func($r, $f)
{
echo $f . ': ';
$v = $r->$f();
var_dump($v);
}
function check_params($r)
{
echo "#####" . ($r instanceof ReflectionMethod ? $r->class . '::' : '')
. $r->name . "()#####\n";
foreach($r->getParameters() as $p)
{
echo "===" . $p->getPosition() . "===\n";
check_params_func($p, 'getName');
check_params_func($p, 'isPassedByReference');
try
{
check_params_decl_class($p, 'getClass');
}
catch(ReflectionException $e)
{
echo $e->getMessage() . "\n";
}
check_params_decl_class($p, 'getDeclaringClass');
check_params_decl_func($p, 'getDeclaringFunction');
check_params_func($p, 'isArray');
check_params_func($p, 'allowsNull');
check_params_func($p, 'isOptional');
check_params_func($p, 'isDefaultValueAvailable');
if ($p->isOptional())
{
check_params_func($p, 'getDefaultValue');
}
}
}
check_params(new ReflectionFunction('test'));
check_params(new ReflectionMethod('test::test'));
?>
===DONE===
<?php exit(0); ?>
--EXPECT--
#####test()#####
===0===
getName: string(3) "nix"
isPassedByReference: bool(false)
getClass: NULL
getDeclaringClass: NULL
getDeclaringFunction: test()
isArray: bool(false)
allowsNull: bool(true)
isOptional: bool(false)
isDefaultValueAvailable: bool(false)
===1===
getName: string(2) "ar"
isPassedByReference: bool(false)
getClass: NULL
getDeclaringClass: NULL
getDeclaringFunction: test()
isArray: bool(true)
allowsNull: bool(false)
isOptional: bool(false)
isDefaultValueAvailable: bool(false)
===2===
getName: string(3) "ref"
isPassedByReference: bool(true)
getClass: NULL
getDeclaringClass: NULL
getDeclaringFunction: test()
isArray: bool(false)
allowsNull: bool(true)
isOptional: bool(false)
isDefaultValueAvailable: bool(false)
===3===
getName: string(3) "std"
isPassedByReference: bool(false)
getClass: stdClass
getDeclaringClass: NULL
getDeclaringFunction: test()
isArray: bool(false)
allowsNull: bool(false)
isOptional: bool(false)
isDefaultValueAvailable: bool(false)
===4===
getName: string(2) "na"
isPassedByReference: bool(false)
Class NonExistingClass does not exist
getDeclaringClass: NULL
getDeclaringFunction: test()
isArray: bool(false)
allowsNull: bool(false)
isOptional: bool(false)
isDefaultValueAvailable: bool(false)
===5===
getName: string(3) "opt"
isPassedByReference: bool(true)
getClass: stdClass
getDeclaringClass: NULL
getDeclaringFunction: test()
isArray: bool(false)
allowsNull: bool(true)
isOptional: bool(true)
isDefaultValueAvailable: bool(true)
getDefaultValue: NULL
===6===
getName: string(3) "def"
isPassedByReference: bool(false)
getClass: NULL
getDeclaringClass: NULL
getDeclaringFunction: test()
isArray: bool(false)
allowsNull: bool(true)
isOptional: bool(true)
isDefaultValueAvailable: bool(true)
getDefaultValue: string(6) "FooBar"
#####test::test()#####
===0===
getName: string(3) "nix"
isPassedByReference: bool(false)
getClass: NULL
getDeclaringClass: test
getDeclaringFunction: test::test()
isArray: bool(false)
allowsNull: bool(true)
isOptional: bool(false)
isDefaultValueAvailable: bool(false)
===1===
getName: string(2) "ar"
isPassedByReference: bool(false)
getClass: NULL
getDeclaringClass: test
getDeclaringFunction: test::test()
isArray: bool(true)
allowsNull: bool(false)
isOptional: bool(false)
isDefaultValueAvailable: bool(false)
===2===
getName: string(3) "ref"
isPassedByReference: bool(true)
getClass: NULL
getDeclaringClass: test
getDeclaringFunction: test::test()
isArray: bool(false)
allowsNull: bool(true)
isOptional: bool(false)
isDefaultValueAvailable: bool(false)
===3===
getName: string(3) "std"
isPassedByReference: bool(false)
getClass: stdClass
getDeclaringClass: test
getDeclaringFunction: test::test()
isArray: bool(false)
allowsNull: bool(false)
isOptional: bool(false)
isDefaultValueAvailable: bool(false)
===4===
getName: string(2) "na"
isPassedByReference: bool(false)
Class NonExistingClass does not exist
getDeclaringClass: test
getDeclaringFunction: test::test()
isArray: bool(false)
allowsNull: bool(false)
isOptional: bool(false)
isDefaultValueAvailable: bool(false)
===5===
getName: string(3) "opt"
isPassedByReference: bool(false)
getClass: stdClass
getDeclaringClass: test
getDeclaringFunction: test::test()
isArray: bool(false)
allowsNull: bool(true)
isOptional: bool(true)
isDefaultValueAvailable: bool(true)
getDefaultValue: NULL
===6===
getName: string(3) "def"
isPassedByReference: bool(false)
getClass: NULL
getDeclaringClass: test
getDeclaringFunction: test::test()
isArray: bool(false)
allowsNull: bool(true)
isOptional: bool(true)
isDefaultValueAvailable: bool(true)
getDefaultValue: string(6) "FooBar"
===DONE===
--UEXPECT--
#####test()#####
===0===
getName: unicode(3) "nix"
isPassedByReference: bool(false)
getClass: NULL
getDeclaringClass: NULL
getDeclaringFunction: test()
isArray: bool(false)
allowsNull: bool(true)
isOptional: bool(false)
isDefaultValueAvailable: bool(false)
===1===
getName: unicode(2) "ar"
isPassedByReference: bool(false)
getClass: NULL
getDeclaringClass: NULL
getDeclaringFunction: test()
isArray: bool(true)
allowsNull: bool(false)
isOptional: bool(false)
isDefaultValueAvailable: bool(false)
===2===
getName: unicode(3) "ref"
isPassedByReference: bool(true)
getClass: NULL
getDeclaringClass: NULL
getDeclaringFunction: test()
isArray: bool(false)
allowsNull: bool(true)
isOptional: bool(false)
isDefaultValueAvailable: bool(false)
===3===
getName: unicode(3) "std"
isPassedByReference: bool(false)
getClass: stdClass
getDeclaringClass: NULL
getDeclaringFunction: test()
isArray: bool(false)
allowsNull: bool(false)
isOptional: bool(false)
isDefaultValueAvailable: bool(false)
===4===
getName: unicode(2) "na"
isPassedByReference: bool(false)
Class NonExistingClass does not exist
getDeclaringClass: NULL
getDeclaringFunction: test()
isArray: bool(false)
allowsNull: bool(false)
isOptional: bool(false)
isDefaultValueAvailable: bool(false)
===5===
getName: unicode(3) "opt"
isPassedByReference: bool(true)
getClass: stdClass
getDeclaringClass: NULL
getDeclaringFunction: test()
isArray: bool(false)
allowsNull: bool(true)
isOptional: bool(true)
isDefaultValueAvailable: bool(true)
getDefaultValue: NULL
===6===
getName: unicode(3) "def"
isPassedByReference: bool(false)
getClass: NULL
getDeclaringClass: NULL
getDeclaringFunction: test()
isArray: bool(false)
allowsNull: bool(true)
isOptional: bool(true)
isDefaultValueAvailable: bool(true)
getDefaultValue: unicode(6) "FooBar"
#####test::test()#####
===0===
getName: unicode(3) "nix"
isPassedByReference: bool(false)
getClass: NULL
getDeclaringClass: test
getDeclaringFunction: test::test()
isArray: bool(false)
allowsNull: bool(true)
isOptional: bool(false)
isDefaultValueAvailable: bool(false)
===1===
getName: unicode(2) "ar"
isPassedByReference: bool(false)
getClass: NULL
getDeclaringClass: test
getDeclaringFunction: test::test()
isArray: bool(true)
allowsNull: bool(false)
isOptional: bool(false)
isDefaultValueAvailable: bool(false)
===2===
getName: unicode(3) "ref"
isPassedByReference: bool(true)
getClass: NULL
getDeclaringClass: test
getDeclaringFunction: test::test()
isArray: bool(false)
allowsNull: bool(true)
isOptional: bool(false)
isDefaultValueAvailable: bool(false)
===3===
getName: unicode(3) "std"
isPassedByReference: bool(false)
getClass: stdClass
getDeclaringClass: test
getDeclaringFunction: test::test()
isArray: bool(false)
allowsNull: bool(false)
isOptional: bool(false)
isDefaultValueAvailable: bool(false)
===4===
getName: unicode(2) "na"
isPassedByReference: bool(false)
Class NonExistingClass does not exist
getDeclaringClass: test
getDeclaringFunction: test::test()
isArray: bool(false)
allowsNull: bool(false)
isOptional: bool(false)
isDefaultValueAvailable: bool(false)
===5===
getName: unicode(3) "opt"
isPassedByReference: bool(false)
getClass: stdClass
getDeclaringClass: test
getDeclaringFunction: test::test()
isArray: bool(false)
allowsNull: bool(true)
isOptional: bool(true)
isDefaultValueAvailable: bool(true)
getDefaultValue: NULL
===6===
getName: unicode(3) "def"
isPassedByReference: bool(false)
getClass: NULL
getDeclaringClass: test
getDeclaringFunction: test::test()
isArray: bool(false)
allowsNull: bool(true)
isOptional: bool(true)
isDefaultValueAvailable: bool(true)
getDefaultValue: unicode(6) "FooBar"
===DONE===
--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php