亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > PHP > 正文

PHP 底層原理之類和對象

2020-03-22 16:54:44
字體:
來源:轉載
供稿:網友

對于PHPer來說,OOP是不可或缺的開發思維,但是你對php類和對象的底層實現又了解多少呢?本著知其然且知其所以然的思想,讓我們一起來尋找答案~

類的底層實現可看作是之前我們講過的變量、函數等的知識集合。所以想要理解更深入的同學最好查看下我之前的關于介紹變量、函數的文章

類的數據結構

不管是普通類還是抽象類或是接口,都存放到統一的結構體中,并且在生成中間代碼時,會將此類添加到全局類列表中。當然,也是在此時,會通過類名判斷該類是否已經存在,如果存在,則添加失敗

struct _zend_html' target='_blank'>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_comment;    zend_uint doc_comment_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 底層原理之類和對象的詳細內容,更多請關注 其它相關文章!

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美一级黑人aaaaaaa做受| 日韩极品精品视频免费观看| 精品中文字幕视频| 亚洲自拍偷拍网址| 性欧美暴力猛交69hd| 国产精品国产自产拍高清av水多| 姬川优奈aav一区二区| 在线观看国产精品淫| 欧美日韩福利视频| 国产亚洲精品久久久优势| 日韩色av导航| 国产精品尤物福利片在线观看| 国产精品扒开腿做爽爽爽男男| 91精品视频免费| 黄色精品一区二区| 国产国语刺激对白av不卡| 亚洲国产精品va在线看黑人| 欧美国产精品日韩| 亚洲第一网站男人都懂| 欧美激情欧美激情在线五月| 久久精品国产电影| 日韩欧美中文免费| 欧美高清在线播放| 国产精品一区二区3区| 亚洲社区在线观看| 亚洲综合日韩中文字幕v在线| 热99在线视频| 国产99视频在线观看| 久久成人综合视频| 91精品国产乱码久久久久久久久| 国产一区二区动漫| 亚洲一区亚洲二区亚洲三区| 国产一区二区丝袜| 国产精品毛片a∨一区二区三区|国| 国产精品久久久久久久久男| 欧美一级淫片videoshd| 国产中文欧美精品| 亚洲va男人天堂| 日韩少妇与小伙激情| 国产精品高清免费在线观看| 欧美成aaa人片在线观看蜜臀| 亚洲女人被黑人巨大进入al| 国产精品视频在线播放| 久久久久久久999| 精品视频—区二区三区免费| 日韩国产一区三区| 亚洲一区二区三区视频播放| 精品露脸国产偷人在视频| 欧美中文字幕第一页| 日日狠狠久久偷偷四色综合免费| 中文字幕日韩在线观看| 91精品一区二区| 欧美成人精品一区二区三区| 国自产精品手机在线观看视频| 国产日韩欧美一二三区| 精品中文字幕久久久久久| 欧美老女人性生活| 国产精品爱久久久久久久| 亚洲午夜精品久久久久久性色| 亚洲色图五月天| 国产成人综合精品在线| 高清一区二区三区四区五区| 中文字幕在线看视频国产欧美在线看完整| 亚洲国产精品一区二区久| 亚洲天堂精品在线| 美女av一区二区三区| 久久精品国产电影| 茄子视频成人在线| 国产日韩欧美中文在线播放| 亚洲精品网站在线播放gif| 精品国模在线视频| 欧美日韩人人澡狠狠躁视频| 热99精品只有里视频精品| 一个人看的www欧美| 欧美视频免费在线观看| 日韩欧美一区二区三区| 国产精品自拍小视频| 国产成人综合精品在线| 国产日韩在线视频| 亚洲福利视频免费观看| 6080yy精品一区二区三区| 亚洲国产精品va| 国产偷国产偷亚洲清高网站| 欧美激情2020午夜免费观看| 国产精品久久不能| 精品国产成人在线| 欧美日韩国产999| 91豆花精品一区| 欧美成年人视频| 欧美激情国内偷拍| 大胆欧美人体视频| 亚洲国产中文字幕在线观看| 成人中文字幕在线观看| 亚洲电影免费观看高清完整版在线观看| 国产精品69久久久久| 日韩在线视频线视频免费网站| 成人国产在线激情| 91丝袜美腿美女视频网站| 国产精品爽爽ⅴa在线观看| 亚洲free性xxxx护士hd| 久久久久久高潮国产精品视| 2025国产精品视频| 精品久久久久久中文字幕大豆网| 欧美黄色www| 亚洲男人天堂九九视频| 国产精品美乳在线观看| 91丨九色丨国产在线| 国产精品日韩专区| 91高潮精品免费porn| 欧美专区国产专区| 久久久久中文字幕| 亚洲精品久久在线| 国产亚洲欧美aaaa| 亚洲精品自产拍| 日韩av电影免费观看高清| 国产精品久久久久久久久久ktv| 亚洲xxxx视频| 啪一啪鲁一鲁2019在线视频| 久久久久久尹人网香蕉| 国产精品综合不卡av| 日韩在线观看免费全| 日本精品久久久| 91精品久久久久久久久青青| 国产视频精品一区二区三区| 欧美性受xxx| 欧美日韩aaaa| 亚洲国产精品成人一区二区| 中文字幕欧美日韩va免费视频| 色综合导航网站| 亚洲天堂av高清| 欧美性猛交xxxxx免费看| 欧美肥老太性生活视频| 亚洲国产精品va在线| 美乳少妇欧美精品| 久久99青青精品免费观看| 国产亚洲精品综合一区91| 亚洲一区二区免费| 日韩欧美在线字幕| xxxxxxxxx欧美| 中文字幕国产亚洲| 777国产偷窥盗摄精品视频| 成人免费网站在线看| 日本成人精品在线| 欧美精品一区三区| 亚洲性生活视频在线观看| 中文字幕久久久av一区| 亚洲女人天堂色在线7777| 国产成人亚洲综合| 亚洲xxxx3d| 欧美巨乳美女视频| 久久97久久97精品免视看| 91干在线观看| 国产在线观看精品一区二区三区| 中文字幕亚洲欧美日韩高清| 一区二区三区国产在线观看| 亚洲美女动态图120秒| 日韩三级影视基地| 一区二区三区国产在线观看| 成人久久久久久久| 亚洲精品成人久久久| 欧美日韩亚洲一区二| 亚洲国产日韩欧美在线动漫| 欧美成人午夜激情在线| 精品视频中文字幕|