felipe Wed, 02 Jun 2010 15:29:42 +0000 Revision: http://svn.php.net/viewvc?view=revision&revision=300096
Log: - Added ReflectionClass::isCloneable() [DOC] Changed paths: U php/php-src/trunk/UPGRADING U php/php-src/trunk/ext/reflection/php_reflection.c A php/php-src/trunk/ext/reflection/tests/ReflectionClass_isCloneable_001.phpt A php/php-src/trunk/ext/reflection/tests/ReflectionClass_isCloneable_002.phpt Modified: php/php-src/trunk/UPGRADING =================================================================== --- php/php-src/trunk/UPGRADING 2010-06-02 15:27:38 UTC (rev 300095) +++ php/php-src/trunk/UPGRADING 2010-06-02 15:29:42 UTC (rev 300096) @@ -228,7 +228,8 @@ h. New methods - - + - Reflection: + - ReflectionClass::isCloneable() i. New class constants Modified: php/php-src/trunk/ext/reflection/php_reflection.c =================================================================== --- php/php-src/trunk/ext/reflection/php_reflection.c 2010-06-02 15:27:38 UTC (rev 300095) +++ php/php-src/trunk/ext/reflection/php_reflection.c 2010-06-02 15:29:42 UTC (rev 300096) @@ -3987,6 +3987,39 @@ } /* }}} */ +/* {{{ proto public bool ReflectionClass::isCloneable() + Returns whether this class is cloneable */ +ZEND_METHOD(reflection_class, isCloneable) +{ + reflection_object *intern; + zend_class_entry *ce; + zval obj; + + if (zend_parse_parameters_none() == FAILURE) { + return; + } + GET_REFLECTION_OBJECT_PTR(ce); + if (ce->ce_flags & (ZEND_ACC_INTERFACE | ZEND_ACC_TRAIT | ZEND_ACC_EXPLICIT_ABSTRACT_CLASS | ZEND_ACC_IMPLICIT_ABSTRACT_CLASS)) { + RETURN_FALSE; + } + if (intern->obj) { + if (ce->clone) { + RETURN_BOOL(ce->clone->common.fn_flags & ZEND_ACC_PUBLIC); + } else { + RETURN_BOOL(Z_OBJ_HANDLER_P(intern->obj, clone_obj) != NULL); + } + } else { + object_init_ex(&obj, ce); + if (ce->clone) { + RETVAL_BOOL(ce->clone->common.fn_flags & ZEND_ACC_PUBLIC); + } else { + RETVAL_BOOL(Z_OBJ_HANDLER(obj, clone_obj) != NULL); + } + zval_dtor(&obj); + } +} +/* }}} */ + /* {{{ proto public bool ReflectionClass::isInterface() Returns whether this is an interface or a class */ ZEND_METHOD(reflection_class, isInterface) @@ -5693,6 +5726,7 @@ ZEND_ME(reflection_class, isInternal, arginfo_reflection__void, 0) ZEND_ME(reflection_class, isUserDefined, arginfo_reflection__void, 0) ZEND_ME(reflection_class, isInstantiable, arginfo_reflection__void, 0) + ZEND_ME(reflection_class, isCloneable, arginfo_reflection__void, 0) ZEND_ME(reflection_class, getFileName, arginfo_reflection__void, 0) ZEND_ME(reflection_class, getStartLine, arginfo_reflection__void, 0) ZEND_ME(reflection_class, getEndLine, arginfo_reflection__void, 0) Added: php/php-src/trunk/ext/reflection/tests/ReflectionClass_isCloneable_001.phpt =================================================================== --- php/php-src/trunk/ext/reflection/tests/ReflectionClass_isCloneable_001.phpt (rev 0) +++ php/php-src/trunk/ext/reflection/tests/ReflectionClass_isCloneable_001.phpt 2010-06-02 15:29:42 UTC (rev 300096) @@ -0,0 +1,69 @@ +--TEST-- +Testing ReflectionClass::isCloneable() +--FILE-- +<?php + +class foo { +} +$foo = new foo; + +print "User class\n"; +$obj = new ReflectionClass($foo); +var_dump($obj->isCloneable()); +$obj = new ReflectionObject($foo); +var_dump($obj->isCloneable()); +$h = clone $foo; + +class bar { + private function __clone() { + } +} +$bar = new bar; +print "User class - private __clone\n"; +$obj = new ReflectionClass($bar); +var_dump($obj->isCloneable()); +$obj = new ReflectionObject($bar); +var_dump($obj->isCloneable()); +$h = clone $foo; + +print "Closure\n"; +$closure = function () { }; +$obj = new ReflectionClass($closure); +var_dump($obj->isCloneable()); +$obj = new ReflectionObject($closure); +var_dump($obj->isCloneable()); +$h = clone $closure; + +print "Internal class - SimpleXMLElement\n"; +$obj = new ReflectionClass('simplexmlelement'); +var_dump($obj->isCloneable()); +$obj = new ReflectionObject(new simplexmlelement('<test></test>')); +var_dump($obj->isCloneable()); +$h = clone new simplexmlelement('<test></test>'); + +print "Internal class - XMLWriter\n"; +$obj = new ReflectionClass('xmlwriter'); +var_dump($obj->isCloneable()); +$obj = new ReflectionObject(new XMLWriter); +var_dump($obj->isCloneable()); +$h = clone new xmlwriter; + +?> +--EXPECTF-- +User class +bool(true) +bool(true) +User class - private __clone +bool(false) +bool(false) +Closure +bool(true) +bool(true) +Internal class - SimpleXMLElement +bool(true) +bool(true) +Internal class - XMLWriter +bool(false) +bool(false) + +Fatal error: Trying to clone an uncloneable object of class XMLWriter in %s on line %d Property changes on: php/php-src/trunk/ext/reflection/tests/ReflectionClass_isCloneable_001.phpt ___________________________________________________________________ Added: svn:keywords + Id Rev Revision Added: svn:eol-style + native Added: php/php-src/trunk/ext/reflection/tests/ReflectionClass_isCloneable_002.phpt =================================================================== --- php/php-src/trunk/ext/reflection/tests/ReflectionClass_isCloneable_002.phpt (rev 0) +++ php/php-src/trunk/ext/reflection/tests/ReflectionClass_isCloneable_002.phpt 2010-06-02 15:29:42 UTC (rev 300096) @@ -0,0 +1,25 @@ +--TEST-- +Testing ReflectionClass::isCloneable() with non instantiable objects +--FILE-- +<?php + +trait foo { +} +$obj = new ReflectionClass('foo'); +var_dump($obj->isCloneable()); + +abstract class bar { +} +$obj = new ReflectionClass('bar'); +var_dump($obj->isCloneable()); + +interface baz { +} +$obj = new ReflectionClass('baz'); +var_dump($obj->isCloneable()); + +?> +--EXPECT-- +bool(false) +bool(false) +bool(false) Property changes on: php/php-src/trunk/ext/reflection/tests/ReflectionClass_isCloneable_002.phpt ___________________________________________________________________ Added: svn:keywords + Id Rev Revision Added: svn:eol-style + native
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php