PHP 底层原理之类和对象-php教程

资源魔 21 0

关于PHPer来讲,OOP是不成或缺的开发思想,然而你对php类以及工具的底层完成又理解几何呢?本着知其然且知其以是然的思维,让咱们一同来寻觅谜底~

类的底层完成可看做是以前咱们讲过的变量、函数等的常识荟萃。以是想要了解更深化的同窗最佳查看下我以前的对于引见变量、函数的文章

类的数据构造

不论是一般类仍是形象类或是接口,都寄存到对立的构造体中,而且正在天生两头代码时,会将此类增加到全局类列表中。当然,也是正在此时,会经过类名判别该类能否曾经存正在,假如存正在,则增加失败

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;	//类的类型,正在编译阶段被区别是一般类,接口,形象类
    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;// 办法界说入口
 
	/* 魔术办法 */
    //一切魔术办法独自寄存,初始化时被设置为null
    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_co妹妹ent;
    zend_uint doc_co妹妹ent_len;
 
 
    struct _zend_module_entry *module; // 类所正在的模块入口:EG(current_module)
};

由下面代码能够看出,类的成员变量、成员办法都是寄存正在各自的构造体中,而构造体的数据构造以及以前解说的变量以及函数的数据构造如出一辙,只不外编译后的成员变量以及成员办法是寄存正在类构造体中罢了

工具的天生

咱们都晓得,工具是new进去的,然而从底层来看,工具天生分为3步
第一步:依据类名去全局类列表外调找该类能否存正在,假如存正在,则猎取存储类的变量
第二步:判别类能否是一般类(非形象类或接口);假如是一般类则给需求创立的工具寄存的zval容器调配内存,并设置容器类型为IS_OBJECT
第三步:执行工具初始化操作,将工具增加到全局工具列表(工具池)中

附上工具的数据构造:

typedef struct _zend_object {
    zend_class_entry *ce; //工具的类构造
    HashTable *properties; //工具属性
    HashTable *guards; /* protects from __get/__set ... recursion */
} zend_object;

猎取以及设置成员变量

猎取成员变量:
第一步,猎取工具的属性,从工具的properties查找能否存正在与称号对应的属性,假如存正在前往后果,假如没有存正在,转第二步
第二步,假如存正在get魔术办法,则挪用此办法猎取变量,假如没有存正在,则报错

设置成员变量:
第一步,猎取工具的属性,从工具的properties查找能否存正在与称号对应的属性,假如存正在且已有的值以及需求设置的值相反,则没有执行任何操作,不然执行变量赋值操作,假如没有存正在,转第二步
第二步,假如存正在_set魔术办法,则挪用此办法设置变量,假如没有存正在,转第三步
第三步,假如成员变量不断不被设置过,则间接将此变量增加到工具的properties字段所正在HashTable中。

总结

到明天为止,咱们差没有多曾经将对于php的底层原理讲了一个遍了。当然,正在这时期,很多同窗跟我说,如今都曾经逐步开端应用php7了,你如今解说的内容仍是php5,会没有会过期了?其实我解说php5也是为讲php7作预备,php7究竟结果是php5的延展,理解了php5之后,再去理解php7会愈加容易些。并且php也是从php5开端才逐步欠缺起来的,咱们有须要理解下php5的内容。不外从下周开端,咱们会开端从底层比拟php7以及php5的没有同,敬请等待~

更多PHP相干技巧文章,请拜访PHP教程栏目进行学习!

以上就是PHP 底层原理之类以及工具的具体内容,更多请存眷资源魔其它相干文章!

标签: php php开发教程 php开发资料 php开发自学 对象 底层

抱歉,评论功能暂时关闭!