Annotation of embedaddon/php/Zend/OBJECTS2_HOWTO, revision 1.1.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>