【PHP内核剖析】面向对象

作为一名程序猿,你们是不是经常会看到这样的一个笑话:

“程序猿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];
};

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值