作为一名程序猿,你们是不是经常会看到这样的一个笑话:
“程序猿A:没对象啊,好烦啊,难道程序猿真的不配拥有对象嘛?
程序猿B:啊,没对象,new一个不就好了”
这个笑话是不是经常听到呢?那你真的知道‘对象’这个东西嘛?你知道‘类’嘛?你知道‘对象’与‘类’之间是什么关系嘛?而我们经常说的‘面向对象’,你又真正了解嘛?今天,我们就一起来扒一扒PHP中关于‘面向对象’的一些相关的知识吧!
对象与类:类是对象的抽象,对象是类的具体实现实例。
面向对象:OOP,它是一种程序设计思想。
先说说类。我们在平时的开发过程中,对类一定不陌生,我们也都知道,一个类里面,有常量,成员变量,成员方法。那你们知道类是在PHP生命周期的哪一个阶段出现的嘛?类在PHP中是编译阶段的产物。而在PHP的内核中,类是通过zend_class_entry这样一个结构来存储的。
struct _zend_class_entry {
char type; // 类型:ZEND_INTERNAL_CLASS / ZEND_USER_CLASS
char *name;// 类名称
zend_uint name_length; // 即sizeof(name) - 1
structͺ_zend_class_entry *parent; // 继承的父类
intͺrefcount; // 引用数
zend_bool constants_updated;
zend_uint ce_flags; // ZEND_ACC_IMPLICIT_ABSTRACT_CLASS: 类存在abstract方法
// ZEND_ACC_EXPLICIT_ABSTRACT_CLASS: 在类名称前加abstract关键字
// ZEND_ACC_FINAL_CLASS
// ZEND_ACC_INTERFACE
HashTable function_table; // 方法
HashTable default_properties; // 默认属性
HashTable properties_info; // 属性信息
HashTable default_static_members;// 类本身所具有的静态变量
HashTable *static_members; // type == ZEND_USER_CLASS时,取&default_static_members;
// type == ZEND_INTERAL_CLASS时,设NULL
HashTable constants_table; // 常量
struct _zend_function_entry *builtin_functions;// 方法定义入口
union _zend_function *constructor;
union _zend_function *destructor;
union _zend_function *clone;
/* 魔术方法 */
union _zend_function *__get;
union _zend_function *__set;
union _zend_function *__unset;
union _zend_function *__isset;
union _zend_function *__call;
union _zend_function *__tostring;
union _zend_function *serialize_func;
union _zend_function *unserialize_func;
zend_class_iterator_funcs iterator_funcs;// 迭代
/* 类句柄 */
zend_object_value (*create_object)(zend_class_entry *class_type TSRMLS_DC);
zend_object_iterator *(*get_iterator)(zend_class_entry *ce, zval *object,
intby_ref TSRMLS_DC);
/* 类声明的接口 */
int(*interface_gets_implemented)(zend_class_entry *iface,
zend_class_entry *class_type TSRMLS_DC);
/* 序列化回调函数指针 */
int(*serialize)(zval *object unsignedchar**buffer, zend_uint *buf_len,
zend_serialize_data *data TSRMLS_DC);
int(*unserialize)(zval **object, zend_class_entry *ce,
constunsignedchar*buf,
zend_uint buf_len, zend_unserialize_data *data TSRMLS_DC);
zend_class_entry **interfaces; // 类实现的接口
zend_uint num_interfaces; // 类实现的接口数
char *filename; // 类的存放文件地址 绝对地址
zend_uint line_start; // 类定义的开始行
zend_uint line_end; // 类定义的结束行
char *doc_comment;
zend_uint doc_comment_len;
struct _zend_module_entry *module; // 类所在的模块入口EG(current_module)
};
上面就是一个类的结构体,基本都有定义了,大家可自行查看相关知识。
接下来我们来说一下对象。
刚说了,类是PHP在编辑阶段的产物,那么对象呢?对象是在运行时产生的。
看一下对象的结构:
struct _zend_object {
zend_refcounted_h gc;
uint32_t handle; // TODO: may be removed ???
zend_class_entry *ce;
const zend_object_handlers *handlers;
HashTable *properties;
zval properties_table[1];
};