summaryrefslogtreecommitdiff
path: root/Zend/zend_object_handlers.c
diff options
context:
space:
mode:
authorMarcus Boerger <helly@php.net>2003-09-18 11:38:33 +0000
committerMarcus Boerger <helly@php.net>2003-09-18 11:38:33 +0000
commitd7fdf15a413de33953a2060b22c58b87f2f06abb (patch)
treefaf00211c24f74a772ca6dff1a33fefd8f9bbc05 /Zend/zend_object_handlers.c
parent87045df4ce1137b7604ed9a767b78eeaebe79b5e (diff)
downloadphp-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.c24
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 */
};
/*