cvs: php-src /ext/spl php_spl.c /ext/spl/tests spl_003.phpt
| From: | Marcus Boerger | 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===