Browse Source

- Extend API to support real existance test without the need to add any new

functions or change any behavior
PHP-5.1
Marcus Boerger 22 years ago
parent
commit
56d543c161
  1. 2
      Zend/zend_builtin_functions.c
  2. 15
      Zend/zend_object_handlers.c
  3. 7
      Zend/zend_object_handlers.h

2
Zend/zend_builtin_functions.c

@ -953,7 +953,7 @@ ZEND_FUNCTION(property_exists)
RETURN_FALSE;
case IS_OBJECT:
if (Z_OBJ_HANDLER_PP(object, has_property) && Z_OBJ_HANDLER_PP(object, has_property)(*object, *property, 0 TSRMLS_CC)) {
if (Z_OBJ_HANDLER_PP(object, has_property) && Z_OBJ_HANDLER_PP(object, has_property)(*object, *property, 2 TSRMLS_CC)) {
RETURN_TRUE;
}
RETURN_FALSE;

15
Zend/zend_object_handlers.c

@ -806,8 +806,7 @@ static int zend_std_compare_objects(zval *o1, zval *o2 TSRMLS_DC)
return zend_compare_symbol_tables_i(zobj1->properties, zobj2->properties TSRMLS_CC);
}
static int zend_std_has_property(zval *object, zval *member, int check_empty TSRMLS_DC)
static int zend_std_has_property(zval *object, zval *member, int has_set_exists TSRMLS_DC)
{
zend_object *zobj;
int result;
@ -833,10 +832,16 @@ static int zend_std_has_property(zval *object, zval *member, int check_empty TSR
}
if (zend_hash_find(zobj->properties, property_info->name, property_info->name_length+1, (void **) &value) == SUCCESS) {
if (check_empty) {
result = zend_is_true(*value);
} else {
switch (has_set_exists) {
case 0:
result = (Z_TYPE_PP(value) != IS_NULL);
break;
default:
result = zend_is_true(*value);
break;
case 2:
result = 1;
break;
}
} else {
result = 0;

7
Zend/zend_object_handlers.h

@ -61,7 +61,12 @@ typedef void (*zend_object_set_t)(zval **property, zval *value TSRMLS_DC);
typedef zval* (*zend_object_get_t)(zval *property TSRMLS_DC);
/* Used to check if a property of the object exists */
typedef int (*zend_object_has_property_t)(zval *object, zval *member, int check_empty TSRMLS_DC);
/* param has_set_exists:
* 0 (has) whetehr property exists and is not NULL
* 1 (set) whether property exists and is true
* 2 (exists) whether property exists
*/
typedef int (*zend_object_has_property_t)(zval *object, zval *member, int has_set_exists TSRMLS_DC);
/* Used to check if a dimension of the object exists */
typedef int (*zend_object_has_dimension_t)(zval *object, zval *member, int check_empty TSRMLS_DC);

Loading…
Cancel
Save