]> granicus.if.org Git - php/commitdiff
Making it possible to pass a class name to get_parent_class() as well
authorAndrei Zmievski <andrei@php.net>
Mon, 26 Mar 2001 19:03:06 +0000 (19:03 +0000)
committerAndrei Zmievski <andrei@php.net>
Mon, 26 Mar 2001 19:03:06 +0000 (19:03 +0000)
as a class instance.

Zend/zend_builtin_functions.c

index 40d5a37ec2678ad1dc6b940604df9d2cf361254e..9de2a2503f60ef45a517ca9b11e82fd858b210c9 100644 (file)
@@ -460,19 +460,30 @@ ZEND_FUNCTION(get_class)
 }
 /* }}} */
 
-/* {{{ proto string get_parent_class(object object)
-   Retrieves the parent class name */
+/* {{{ proto string get_parent_class(mixed object)
+   Retrieves the parent class name for object or class. */
 ZEND_FUNCTION(get_parent_class)
 {
        zval **arg;
+       zend_class_entry *ce = NULL;
        
        if (ZEND_NUM_ARGS()!=1 || zend_get_parameters_ex(1, &arg)==FAILURE) {
                ZEND_WRONG_PARAM_COUNT();
        }
-       if (((*arg)->type != IS_OBJECT) || !(*arg)->value.obj.ce->parent) {
+
+       if (Z_TYPE_PP(arg) == IS_OBJECT)
+          ce = Z_OBJCE_PP(arg);
+       else if (Z_TYPE_PP(arg) == IS_STRING) {
+               SEPARATE_ZVAL(arg);
+               zend_str_tolower(Z_STRVAL_PP(arg), Z_STRLEN_PP(arg));
+               zend_hash_find(EG(class_table), Z_STRVAL_PP(arg), Z_STRLEN_PP(arg)+1, (void **)&ce);
+       }
+
+       if (ce && ce->parent) {
+               RETURN_STRINGL(ce->parent->name, ce->parent->name_length, 1);
+       } else {
                RETURN_FALSE;
        }
-       RETURN_STRINGL((*arg)->value.obj.ce->parent->name,      (*arg)->value.obj.ce->parent->name_length, 1);
 }
 /* }}} */