Annotation of embedaddon/php/Zend/OBJECTS2_HOWTO, revision 1.1
1.1 ! misho 1: Creating an object
! 2: ------------------
! 3:
! 4: Object can be created in the following ways:
! 5:
! 6: 1. As a result of a function call. E.g.:
! 7:
! 8: $foo = create_new_foo("parameter");
! 9: $foo->run();
! 10:
! 11: The function should create a new zval, create new object and get the
! 12: handle for it, set handle and handler table as needed. Note that the
! 13: handle is the only ID of the object, so it should be enough to
! 14: identify it.
! 15:
! 16: 2. Overriding create_object handler for class. E.g.:
! 17:
! 18: $foo = new Java("some.Class.here", "parameter");
! 19: $foo->run();
! 20:
! 21: The create_object handler function should create a new zval, create
! 22: new object and get the handle for it, set handle and handler table as
! 23: needed, and also provide constructor method that would handle
! 24: constructor call. The get_constructor handler table entry should be
! 25: used for that. Do not rely class entry's constructor, unless you refer
! 26: to it from get_constructor handler.
! 27:
! 28: Object maintenance
! 29: ------------------
! 30:
! 31: The handlers add_ref and del_ref are called when a new zval referring
! 32: to the object is created. This does not create a new object - both
! 33: zvals still refer to the same object.
! 34:
! 35: clone_obj handler should create a new object, identical to an old one,
! 36: but being a separate entity.
! 37:
! 38: delete_obj should destroy an object, all references to it become
! 39: invalid.
! 40:
! 41: Object access - read
! 42: --------------------
! 43:
! 44: read_property is used to read object's property. This value is not
! 45: meant to be changed. The handler returns zval * with the value.
! 46:
! 47: Object access - write
! 48: ---------------------
! 49:
! 50: write_property is used to directly write object's property by
! 51: name. This handler is used to assign property variables or to change them
! 52: in operations like += or ++ (unless get_property_zval_ptr is also set).
! 53:
! 54: get_property_zval_ptr is used to obtain pointer to modifiable zval for
! 55: operations like += or ++. This should be used only if your object model
! 56: stores properties as real zval's that can be modified from outside.
! 57: Otherwise this handler should be NULL and the engine will use
! 58: read_property and write_property instead.
! 59:
! 60: get_property_ptr is used to obtain zval ** for future writing to
! 61: it. If your object properties are stored as zval*, return real place
! 62: where the property is stored. If the aren't, the best way is to create
! 63: proxy object and handle it via get and set methods (see below).
! 64: This method is meant to be used for send-by-reference and assign-by-reference
! 65: use of object properties. If you don;t want to implement property
! 66: referencing for your objects, you can set this handler to NULL.
! 67:
! 68: get and set handlers are used when engine needs to access the object
! 69: as a value. E.g., in the following situation:
! 70:
! 71: $foo =& $obj->bar;
! 72: $foo = 1;
! 73:
! 74: if $foo is an object (e.g., proxy object from get_property_ptr) it
! 75: would be accessed using write handler.
! 76:
! 77: Object access - method call
! 78: ---------------------------
! 79:
! 80: get_method handler is used to find method description by name. It
! 81: should set right type, function name and parameter mask for the
! 82: method. If the type is ZEND_OVERLOADED_FUNCTION, the method would be
! 83: called via call_method handler, otherwise it would be called with
! 84: standard Zend means.
! 85:
! 86: get_constructor performs the same function as get_method, but for the
! 87: object constructor.
! 88:
! 89: call_method handler is used to perform method call. Parameters are
! 90: passed like to any other Zend internal function.
! 91:
! 92: Object - comparison
! 93: -------------------
! 94:
! 95: Objects can be compared via compare_objects handler. This is used with
! 96: == operation, === compares objects by handles, i.e., return true if
! 97: and only if it's really the same object. Note that objects from
! 98: different object types (i.e., having different handlers) can not be
! 99: compared.
! 100:
! 101: Objects - reflection
! 102: --------------------
! 103:
! 104: get_class_name is used to retrieve class name of the object.
! 105: get_class_entry returns class entry (zend_class_entry) for the object,
! 106: in case there exists PHP class for it.
! 107: No other reflection functions are currently implemented.
! 108:
! 109: Objects - data structures and handlers
! 110: ---------------------------------------
! 111:
! 112: The object is represented by the following structure:
! 113:
! 114: struct _zend_object_value {
! 115: zend_object_handle handle;
! 116: zend_object_handlers *handlers;
! 117: };
! 118:
! 119: handle is an ID of the object among the objects of the same type (not
! 120: class!). The type of the object and how it behaves is determined by
! 121: the handler table.
! 122:
! 123: typedef struct _zend_object_handlers {
! 124: zend_object_add_ref_t add_ref;
! 125: zend_object_del_ref_t del_ref;
! 126: zend_object_delete_obj_t delete_obj;
! 127: zend_object_clone_obj_t clone_obj;
! 128: zend_object_read_property_t read_property;
! 129: zend_object_write_property_t write_property;
! 130: zend_object_get_property_ptr_t get_property_ptr;
! 131: zend_object_get_property_zval_ptr_t get_property_zval_ptr;
! 132: zend_object_get_t get;
! 133: zend_object_set_t set;
! 134: zend_object_has_property_t has_property;
! 135: zend_object_unset_property_t unset_property;
! 136: zend_object_get_properties_t get_properties;
! 137: zend_object_get_method_t get_method;
! 138: zend_object_call_method_t call_method;
! 139: zend_object_get_constructor_t get_constructor;
! 140: zend_object_get_class_entry_t get_class_entry;
! 141: zend_object_get_class_name_t get_class_name;
! 142: zend_object_compare_t compare_objects;
! 143: } zend_object_handlers;
! 144:
! 145: See zend_object_handlers.h for prototypes. All objects are passed as zval's.
! 146:
! 147: Handlers explained:
! 148:
! 149: add_ref - called when a copy of the object handle is created.
! 150:
! 151: del_ref - called when a copy of the object handle is destroyed.
! 152:
! 153: delete_obj - called when an object needs to be destroyed.
! 154:
! 155: clone_obj - called when a new object identical to an old one should be
! 156: created (unlike Zend Engine 1, this never happens unless explicitly
! 157: asked for).
! 158:
! 159: read_property - returns zval *, containing the value of the
! 160: property. Is used when value of the property should be retrieved for
! 161: reading.
! 162:
! 163: write_property - assigns value to certain property of the object.
! 164:
! 165: get_property_zval_ptr - retrieves zval** for being directly modified by
! 166: the engine. If your properties are not zval's, don't define it.
! 167:
! 168: get_property_ptr - retrieves zval** for the property of the value, to
! 169: be used for read and write. If object properties are not zval's
! 170: natively, this method should create and return proxy object for use
! 171: with get and set methods.
! 172:
! 173: get - retrieves zval* for object contents. To be used mainly with
! 174: proxy objects from get_property_ptr, but also may be used for
! 175: convert_to_* functions.
! 176:
! 177: set - sets value for object contents. To be used mainly with
! 178: proxy objects from get_property_ptr.
! 179:
! 180: has_property - checks if the object has certain property set.
! 181:
! 182: unset_property - removes value for the property of the object
! 183:
! 184: get_method - retrieves description of the method
! 185:
! 186: call_method - calls the method (parameters should be put on stack like
! 187: for any other PHP internal function).
! 188:
! 189: get_constructor - get description for the object constructor method
! 190:
! 191: get_class_entry - should return the class entry for the object
! 192:
! 193: get_class_name - get the name of the class the object belongs to
! 194:
! 195: compare_objects - compares if two objects are equal
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>