Re: Re: [ZEND-ENGINE-CVS] cvs: ZendEngine2 / zend_builtin_functions.c
| From: | Marcus Boerger | Date: | Fri, 08 Apr 2005 16:14:06 +0000 |
| Subject: | Re: Re: [ZEND-ENGINE-CVS] cvs: ZendEngine2 / zend_builtin_functions.c | ||
| References: | 1 2 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-15911@lists.php.net to get a copy of this message | ||
Hello Andi,
to this i only agree under two conditions. First we remove other like
method_exists() too and second we fix handling of implicit public and
dynamic properties. Unless the second is done i see such a function as
relative important and don't like to use reflection overhead always.
regards
marcus
Friday, April 8, 2005, 6:00:03 PM, you wrote:
> 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
--
Best regards,
Marcus mailto:mail@marcus-boerger.de