It's vital? Come on, you can convince me that it's nice to have, sure. But vital? What can it do which you can do with reflection API? If the name is sexier than you can write your own PHP function.

At 06:36 PM 4/8/2005 +0200, Marcus Boerger wrote:
Hello Andrey,

  same goes for property_exists() which is why i added it.

marcus

Friday, April 8, 2005, 6:31:48 PM, you wrote:

> Hello Andi, Marcus,
> method_exists() is quite vital to help where the type hinting fail.
> Type hinting fail because it leads to a fatal error which is uncatchable
> and the code cannot react on this. Therefore, for me type hinting is
> kind of useless since I cannot catch my bugs by executing some code whenever
> the data passed is not what the function/method expects. Reflection API is
> overkill to write everywhere and has to be wrapped to something which at
> the end will simulate method_exists().


> Thanks for you attention,
> Andrey

> Marcus Boerger wrote:
>> 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:[EMAIL PROTECTED]

-- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php



Reply via email to