Re: [ZEND-ENGINE-CVS] cvs: ZendEngine2 / zend_builtin_functions.c

From: Date: Fri, 08 Apr 2005 16:00:03 +0000
Subject: Re: [ZEND-ENGINE-CVS] cvs: ZendEngine2 / zend_builtin_functions.c
References: 1  Groups: php.internals 
Request: Send a blank email to internals+get-15909@lists.php.net to get a copy of this message
Marcus, There was a long discussion about this a few months ago. The conclusion was to use the reflection_api for the very few instances where isset() isn't relevant. Although we have done bad stuff in the past, it's also not a good idea to continue polluting the global namespace. Please revert this patch. FYI, all the other requests for additional functions like class_constant_exists() should also be reflection API. It's best for the language. Thanks, Andi At 01:33 PM 4/8/2005 +0000, Marcus Boerger wrote:
helly           Fri Apr  8 09:33:17 2005 EDT
Modified files:
    /ZendEngine2        zend_builtin_functions.c
Log: - Add property_exits() http://cvs.php.net/diff.php/ZendEngine2/zend_builtin_functions.c?r1=1.262&r2=1.263&ty=u Index: ZendEngine2/zend_builtin_functions.c diff -u ZendEngine2/zend_builtin_functions.c:1.262 ZendEngine2/zend_builtin_functions.c:1.263 --- ZendEngine2/zend_builtin_functions.c:1.262 Mon Apr 4 13:23:38 2005
+++ ZendEngine2/zend_builtin_functions.c        Fri Apr  8 09:33:15 2005
@@ -17,7 +17,7 @@
    +----------------------------------------------------------------------+
*/ -/* $Id: zend_builtin_functions.c,v 1.262 2005/04/04 17:23:38 stas Exp $ */ +/* $Id: zend_builtin_functions.c,v 1.263 2005/04/08 13:33:15 helly Exp $ */ #include "zend.h" #include "zend_API.h" @@ -43,6 +43,7 @@ static ZEND_FUNCTION(get_class); static ZEND_FUNCTION(get_parent_class); static ZEND_FUNCTION(method_exists); +static ZEND_FUNCTION(property_exists); static ZEND_FUNCTION(class_exists); static ZEND_FUNCTION(interface_exists); static ZEND_FUNCTION(function_exists); @@ -102,6 +103,7 @@
        ZEND_FE(get_class,                      NULL)
        ZEND_FE(get_parent_class,       NULL)
        ZEND_FE(method_exists,          NULL)
+       ZEND_FE(property_exists,        NULL)
        ZEND_FE(class_exists,           NULL)
        ZEND_FE(interface_exists,       NULL)
        ZEND_FE(function_exists,        NULL)
@@ -889,6 +891,63 @@ } /* }}} */ +/* {{{ proto bool property_exists(mixed object_or_class, string property_name) + Checks if the object or class has a property */ +ZEND_FUNCTION(property_exists) +{
+       zval **object, **property;
+       zend_class_entry *ce, **pce;
+       zend_property_info *property_info;
+       char *prop_name, *class_name;
+
+       if (ZEND_NUM_ARGS()!= 2 || zend_get_parameters_ex(2, &object, &property)==FAILURE) {
+               ZEND_WRONG_PARAM_COUNT();
+       }
+       convert_to_string_ex(property);
+
+       switch((*object)->type) {
+       case IS_STRING:
+               if (zend_lookup_class(Z_STRVAL_PP(object), Z_STRLEN_PP(object), &pce TSRMLS_CC) == SUCCESS) {
+                       ce = *pce;
+               }
+               if (!ce) {
+                       RETURN_NULL();
+               }
+               if (!(property_info = zend_get_property_info(ce, *property, 1 TSRMLS_CC)) || property_info == &EG(std_property_info)) {
+                       RETURN_FALSE;
+               }
+               if (property_info->flags & ZEND_ACC_PUBLIC) {
+                       RETURN_TRUE;
+               }
+               zend_unmangle_property_name(property_info->name, &class_name, &prop_name);
+               if (!strncmp(class_name, "*", 1)) {
+                       if (instanceof_function(EG(scope), ce TSRMLS_CC)) {
+                               RETURN_TRUE;
+                       }
+                       RETURN_FALSE;
+               }
+               if (zend_lookup_class(Z_STRVAL_PP(object), Z_STRLEN_PP(object), &pce TSRMLS_CC) == SUCCESS) {
+                       ce = *pce;
+               } else {
+                       RETURN_FALSE; /* shouldn't happen */
+               }
+               RETURN_BOOL(EG(scope) == ce);
+               RETURN_FALSE;
+
+       case IS_OBJECT:
+               if (Z_OBJ_HANDLER_PP(object, has_property) && Z_OBJ_HANDLER_PP(object, has_property)(*object, *property, 1 TSRMLS_CC)) {
+                       RETURN_TRUE;
+               }
+               RETURN_FALSE;
+
+       default:
+               zend_error(E_WARNING, "Parameter must either be an object or the name of an existing class");
+               RETURN_NULL();
+       }
+} +/* }}} */ + + /* {{{ proto bool class_exists(string classname [, bool autoload])
    Checks if the class exists */
ZEND_FUNCTION(class_exists) -- Zend Engine CVS Mailing List (http://cvs.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php


« previous php.internals (#15909) next »