diff options
author | Marcus Boerger <helly@php.net> | 2003-09-18 11:38:33 +0000 |
---|---|---|
committer | Marcus Boerger <helly@php.net> | 2003-09-18 11:38:33 +0000 |
commit | d7fdf15a413de33953a2060b22c58b87f2f06abb (patch) | |
tree | faf00211c24f74a772ca6dff1a33fefd8f9bbc05 /Zend/zend_object_handlers.c | |
parent | 87045df4ce1137b7604ed9a767b78eeaebe79b5e (diff) | |
download | php-git-d7fdf15a413de33953a2060b22c58b87f2f06abb.tar.gz |
- Allow partial type conversion support for objects.
- Add support for object to string conversion from userspace by method
__toString() and add a test.
Diffstat (limited to 'Zend/zend_object_handlers.c')
-rw-r--r-- | Zend/zend_object_handlers.c | 24 |
1 files changed, 23 insertions, 1 deletions
diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c index 30b02ad95d..86b0ea2dd3 100644 --- a/Zend/zend_object_handlers.c +++ b/Zend/zend_object_handlers.c @@ -860,6 +860,28 @@ int zend_std_object_get_class_name(zval *object, char **class_name, zend_uint *c return SUCCESS; } +int zend_std_cast_object(zval *readobj, zval *writeobj, int type, int should_free TSRMLS_DC) +{ + zval fname, *retval; + + switch (type) { + case IS_STRING: + ZVAL_STRING(&fname, "__tostring", 0); + if (call_user_function_ex(NULL, &readobj, &fname, &retval, 0, NULL, 0, NULL TSRMLS_CC) == SUCCESS) { + if (Z_TYPE_P(retval) != IS_STRING) { + zend_error(E_ERROR, "Method %s::__toString() must return a string value", Z_OBJCE_P(readobj)->name); + } + ZVAL_STRING(writeobj, Z_STRVAL_P(retval), 1); + zval_ptr_dtor(&retval); + return SUCCESS; + } + break; + default: + break; + } + return FAILURE; +} + zend_object_handlers std_object_handlers = { zend_objects_store_add_ref, /* add_ref */ zend_objects_store_del_ref, /* del_ref */ @@ -884,7 +906,7 @@ zend_object_handlers std_object_handlers = { zend_std_object_get_class, /* get_class_entry */ zend_std_object_get_class_name, /* get_class_name */ zend_std_compare_objects, /* compare_objects */ - NULL, /* cast_object */ + zend_std_cast_object, /* cast_object */ }; /* |