cvs: php-src /ext/spl php_spl.c /ext/spl/tests spl_003.phpt

From: Date: Wed, 06 Apr 2005 15:16:45 +0000
Subject: cvs: php-src /ext/spl php_spl.c /ext/spl/tests spl_003.phpt
Groups: php.cvs 
Request: Send a blank email to php-cvs+get-31265@lists.php.net to get a copy of this message
helly Wed Apr 6 11:16:45 2005 EDT Added files: /php-src/ext/spl/tests spl_003.phpt Modified files: /php-src/ext/spl php_spl.c Log: - Make class_parentS() and class_implements() accepts class names as well http://cvs.php.net/diff.php/php-src/ext/spl/php_spl.c?r1=1.45&r2=1.46&ty=u Index: php-src/ext/spl/php_spl.c diff -u php-src/ext/spl/php_spl.c:1.45 php-src/ext/spl/php_spl.c:1.46 --- php-src/ext/spl/php_spl.c:1.45 Tue Apr 5 05:24:53 2005 +++ php-src/ext/spl/php_spl.c Wed Apr 6 11:16:43 2005 @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_spl.c,v 1.45 2005/04/05 09:24:53 helly Exp $ */ +/* $Id: php_spl.c,v 1.46 2005/04/06 15:16:43 helly Exp $ */ #ifdef HAVE_CONFIG_H #include "config.h" @@ -59,18 +59,56 @@ } /* }}} */ +static zend_class_entry * spl_find_ce_by_name(char *name, int len, zend_bool autoload TSRMLS_DC) +{ + zend_class_entry **ce; + int found; + if (!autoload) { + char *lc_name; + + lc_name = do_alloca(len + 1); + zend_str_tolower_copy(lc_name, name, len); + + found = zend_hash_find(EG(class_table), lc_name, len +1, (void **) &ce); + free_alloca(lc_name); + } else { + found = zend_lookup_class(name, len, &ce TSRMLS_CC); + } + if (found != SUCCESS) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Class %s does not exist%s", name, autoload ? " and could not be loaded" : ""); + return NULL; + } + + return *ce; +} + /* {{{ array class_parents(object instance) Return an array containing the names of all parent classes */ PHP_FUNCTION(class_parents) { zval *obj; - zend_class_entry *parent_class; + zend_class_entry *parent_class, *ce; + zend_bool autoload = 1; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "o", &obj) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z|b", &obj, &autoload) == FAILURE) { + RETURN_FALSE; + } + + if (Z_TYPE_P(obj) != IS_OBJECT && Z_TYPE_P(obj) != IS_STRING) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "object or string expected"); RETURN_FALSE; } + + if (Z_TYPE_P(obj) == IS_STRING) { + if (NULL == (ce = spl_find_ce_by_name(Z_STRVAL_P(obj), Z_STRLEN_P(obj), autoload TSRMLS_CC))) { + RETURN_FALSE; + } + } else { + ce = Z_OBJCE_P(obj); + } + array_init(return_value); - parent_class = Z_OBJCE_P(obj)->parent; + parent_class = ce->parent; while (parent_class) { spl_add_class_name(return_value, parent_class, 0, 0 TSRMLS_CC); parent_class = parent_class->parent; @@ -78,17 +116,32 @@ } /* }}} */ -/* {{{ proto array class_implements() +/* {{{ proto array class_implements(mixed what [, bool autoload ]) Return all classes and interfaces implemented by SPL */ PHP_FUNCTION(class_implements) { zval *obj; - - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "o", &obj) == FAILURE) { + zend_bool autoload = 1; + zend_class_entry *ce; + + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z|b", &obj, &autoload) == FAILURE) { RETURN_FALSE; } + if (Z_TYPE_P(obj) != IS_OBJECT && Z_TYPE_P(obj) != IS_STRING) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "object or string expected"); + RETURN_FALSE; + } + + if (Z_TYPE_P(obj) == IS_STRING) { + if (NULL == (ce = spl_find_ce_by_name(Z_STRVAL_P(obj), Z_STRLEN_P(obj), autoload TSRMLS_CC))) { + RETURN_FALSE; + } + } else { + ce = Z_OBJCE_P(obj); + } + array_init(return_value); - spl_add_interfaces(return_value, Z_OBJCE_P(obj), 1, ZEND_ACC_INTERFACE TSRMLS_CC); + spl_add_interfaces(return_value, ce, 1, ZEND_ACC_INTERFACE TSRMLS_CC); } /* }}} */ http://cvs.php.net/co.php/php-src/ext/spl/tests/spl_003.phpt?r=1.1&p=1 Index: php-src/ext/spl/tests/spl_003.phpt +++ php-src/ext/spl/tests/spl_003.phpt --TEST-- SPL: class_parents() and class_implements() --SKIPIF-- <?php if (!extension_loaded("spl")) print "skip"; ?> --FILE-- <?php class a{} class b extends a{} class c extends b{} class d{} var_dump(class_parents(new c), class_parents("c"), class_parents(new b), class_parents("b"), class_parents("d"), class_parents("foo", 0), class_parents("foo", 1) ); interface iface1{} interface iface2{} class f implements iface1, iface2{} var_dump(class_implements(new a), class_implements("a"), class_implements("aaa"), class_implements("bbb", 0) ); function __autoload($cname) { var_dump($cname); } ?> ===DONE=== <?php exit(0); ?> --EXPECTF-- Warning: class_parents(): Class foo does not exist in %sspl_003.php on line %d string(3) "foo" Warning: class_parents(): Class foo does not exist and could not be loaded in %sspl_003.php on line %d array(2) { ["b"]=> string(1) "b" ["a"]=> string(1) "a" } array(2) { ["b"]=> string(1) "b" ["a"]=> string(1) "a" } array(1) { ["a"]=> string(1) "a" } array(1) { ["a"]=> string(1) "a" } array(0) { } bool(false) bool(false) string(3) "aaa" Warning: class_implements(): Class aaa does not exist and could not be loaded in %sspl_003.php on line %d Warning: class_implements(): Class bbb does not exist in %sspl_003.php on line %d array(0) { } array(0) { } bool(false) bool(false) ===DONE===

« previous php.cvs (#31265) next »