PHP核心之旅-3.變數
PHP 核心之旅系列
一、弱型別語言
php是弱型別語言。一個變數可以表示任意資料型別。
php強大的一部分原因就是因為它是弱型別語言,但是弱型別語言也有它的缺點,使用不當也會造成很大的問題。
定義變數的時候不需要指定變數型別,也不需要初始化變數。
//定義變數 $test;
二、PHP的變數型別
php雖然是弱型別語言,但是內部也是有資料型別的,總共有8種
標量型別 | 複合型別 | 特殊型別 |
字串string | 陣列array | 資源resource |
整型integer | 物件object | NULL |
浮點型float(double) | ||
布林型boolean |
全部型別如下:
1 /* regular data types */ 2 #define IS_UNDEF 0 3 #define IS_NULL 1 4 #define IS_FALSE 2 5 #define IS_TRUE 3 6 #define IS_LONG 4 7 #defineIS_DOUBLE 5 8 #define IS_STRING 6 9 #define IS_ARRAY 7 10 #define IS_OBJECT 8 11 #define IS_RESOURCE 9 12 #define IS_REFERENCE 10 13 14 /* constant expressions */ 15 #defineIS_CONSTANT 11 16 #define IS_CONSTANT_AST 12 17 18 /* fake types */ 19 #define _IS_BOOL 13 20 #define IS_CALLABLE 14 21 #define IS_ITERABLE 19 22 #define IS_VOID 18 23 24 /* internal types */ 25 #define IS_INDIRECT 15 26 #define IS_PTR 17 27 #define _IS_ERROR 20
三、內部實現
PHP用結構體_zval_struct來標識變數
檔案路徑:\Zend\zend_types.h
1 struct _zval_struct { 2 zend_value value; //用來儲存具體的變數值 3 union { 4 struct { 5 ZEND_ENDIAN_LOHI_4( //相容大小位元組序,小位元組序就是下面的屬性,大位元組序就是下面四個四個順序翻轉 6 zend_uchar type, //變數型別 7 zend_uchar type_flags, //型別掩碼,記憶體管理用到 8 zend_uchar const_flags, 9 zend_uchar reserved) //預留欄位,zend執行過程中會用來記錄 call info 10 } v; 11 uint32_t type_info; 12 } u1; 13 union { //輔助值 14 uint32_t next; /* hash collision chain */ 15 uint32_t cache_slot; /* literal cache slot */ 16 uint32_t lineno; /* line number (for ast nodes) */ 17 uint32_t num_args; /* arguments number for EX(This) */ 18 uint32_t fe_pos; /* foreach position */ 19 uint32_t fe_iter_idx; /* foreach iterator index */ 20 uint32_t access_flags; /* class constant access flags */ 21 uint32_t property_guard; /* single property guard */ 22 uint32_t extra; /* not further specified */ 23 } u2; 24 };
1. value 用來儲存具體的變數值,它是一個聯合體:zend_value。後面再介紹zend_value結構體。
2. union u1 = 結構體v + type_info
3. 結構體 v: type + type_flags + const_flags + reserved
名稱 | 作用 |
type | 標識value型別 |
type_flags | 型別掩碼 |
const_flags | |
reserved | 預留欄位,zend執行過程中記錄call info |
4. type_info: 將v結果的4個成員組合到了一起。
5. union u2 用於一些輔助功能。
zend_value 聯合體:
1 typedef union _zend_value { 2 zend_long lval; //整型變數的值儲存在這個變數中 3 double dval; //浮點型變數的值儲存在這個變數中 4 zend_refcounted *counted; //獲取不同型別結構的gc頭部 5 zend_string *str; //string字串儲存在這個變數中 6 zend_array *arr; //陣列 7 zend_object *obj; //物件 8 zend_resource *res; //資源型別 9 zend_reference *ref; //引用型別 10 zend_ast_ref *ast; //核心使用的value 11 zval *zv; //指向另一個zval 12 void *ptr; //指標,通用型別 13 zend_class_entry *ce; //類 14 zend_function *func; //函式 15 struct { 16 uint32_t w1; 17 uint32_t w2; 18 } ww; 19 } zend_value;
注意:
1.zend_value 各型別根據字記得型別選擇使用不同的成員。
2.zend_value中沒有布林型,布林型拆分成了IS_TRUE和IS_FALSE兩種型別,直接通過結構體v中的變數type區分型別。
參考資料:
http://www.php-internals.com/
《PHP7核心剖析》
作 者:
出 處:http://www.cnblogs.com/jackson0714/
關於作者:專注於微軟平臺的專案開發。如有問題或建議,請多多賜教!
版權宣告:本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連結。
特此宣告:所有評論和私信都會在第一時間回覆。也歡迎園子的大大們指正錯誤,共同進步。或者直接私信我
聲援博主:如果您覺得文章對您有幫助,可以點選文章右下角【推薦】一下。您的鼓勵是作者堅持原創和持續寫作的最大動力!
相關推薦
PHP核心之旅-3.變數
PHP 核心之旅系列 一、弱型別語言 php是弱型別語言。一個變數可以表示任意資料型別。 php強大的一部分原因就是因為它是弱型別語言,但是弱型別語言也有它的缺點,使用不當也會造成很大的問題。 定義變數的時候不需要指定變數型別,也不需要初始化變數。 //定義變數 $test;
PHP核心之旅-5.強大的陣列
PHP 核心之旅系列 一、陣列的內部結構 1.底層實現為散列表(HashTable,也稱作雜湊表) 2.散列表的概念: 是根據關鍵碼值(Key value)而直接進行訪問的資料結構。通過把關鍵碼值對映到表中一個位置來訪問記錄,以加快查詢的速度。這個對映函式叫做雜湊函式,存放記錄的陣列叫做散列表
PHP核心之旅-2.SAPI中的Cli
PHP 核心之旅系列 一、SAPI是什麼? 1.1 理解SAPI (1)SAPI是PHP框架的介面層。有很多種伺服器的SAPI的實現,程式碼在sapi資料夾下。常見的介面抽象層實現有:cgi,apache2,cli,embed,fpm。 (2)各個伺服器遵循著相同的約定,每個伺服器的SAP
PHP核心之旅-6.垃圾回收機制
回收PHP 核心之旅系列 一、引用計數 只有使用引用計數的變數才需要回收。引用計數就是用來標記變數的引用次數的。 當有新的變數zval指向value時,計數器加1,當變數zval銷燬時,計數器減一。當引用計數為0時,表示此value沒有被任何變數指向,可以對value進行釋放。 下面的例子說明引用
PHP核心之旅-1.生命週期
PHP 核心之旅系列 1.SAPI介面 PHP具體應用的程式設計介面。 2.開始和結束 PHP開始執行以後會經過兩個主要的階段: 處理請求之前的開始階段和請求之後的結束階段。 1.1開始階段: 1.1.1 模組初始化階段(MINT),只進行一次。
PHP核心之旅-4.可變長度的字串
PHP 核心之旅系列 一、字串原始碼 zend_string 1 typedef struct _zend_string zend_string; //定義 zend_string變數 2 struct _zend_string { //_zend_string結構體 3
C#多線程之旅(3)
它的 logs 更新 nth 使用 targe result 右下角 介紹 閱讀目錄 代碼下載 一、介紹 二、通過TPL進入線程池 三、不用TPL進入到線程池 v博客前言 先交代下背景,寫《C#多線程之旅》這個系列文章主要是因為以下幾個原因:1.多線程在C/S和
Android開發之旅3:android架構
通過 圖集 例如 sqlit 組件 mil 大小 簡化 .html 引言 通過前面兩篇: Android 開發之旅:環境搭建及HelloWorld Android 開發之旅:HelloWorld項目的目錄結構 我們對android有了個大
我的RabbitMQ學習之旅3 (發布/訂閱)
fan 一點 簡單 圖片 數據 這一 auto sha 如果 在前面的教程中,我們創建了一個工作隊列。工作隊列背後的假設是,每個任務只被傳遞給一個工作人員。在這一部分,我們將做一些完全不同的事情 - 我們會向多個消費者傳遞信息。這種模式被稱為“發布/訂閱&rdq
java學習之旅-3
println 深入 異或 操作 邏輯 tro 離散 out 只知道 在學習離散數學的時候,只知道一直學著莫名其妙的符號,不知其用途在何處。學習了java的邏輯運算符之後才發現,其實離散數學與計算機語言的關聯是非常大的。java中的邏輯運算符和C中一樣,只不過在學習java
【Linux之旅-3】vi和vim編輯器
一、vi和vim介紹 所有的Linux系統都會內建vi文字編輯器。vim具有程式編輯能力,可看作是vi的增強版,可以主動的以字型顏色辨別程式碼語法的正確性,方便程式設計,程式碼補充、編譯及錯誤跳轉等方便程式設計的功能豐富。 二、vi和vim的三種常見模式 2.1正常模式
菜鳥的微服務之旅(3)---springCloud(1)
上一節,我們大致上講完了關於Springboot的基礎入門。 那麼接下來,就讓我用簡單的白話以及自己的理解來入門下springcloud。 springboot只能夠用來應用開發,如果說要搭建一個完整的微服務架構,那麼就還需要實現配置管理,服務發現,智慧路由,斷路器,微代
Html5學習之旅(3) 文字元素
首先,這東西幹嘛用? ----------語意--------規則--------- 原來H4時候都是用DIV寫...您隨便亂寫都行...全叫DIV..沒有規則..每次找的時候就藍瘦了..這下好了...都給你規則出來叫什麼名字... 就像一個房子.以前叫房間1 房間2 房
Linux下PHP開發之旅-2.開發環境相關設定探索
一.預設目錄在哪兒? 開始時面對該xampp整合開發環境的相關配置有點不知所錯,於是便先想著找httpd.conf,通過該檔案,對該整合環境的配置檔案關係有了大致瞭解,具體操作如下; cd /opt/lampp/etc vi httpd.conf 預設ServerName
Linux下PHP開發之旅-1.開發環境搭建
一.下載相關安裝包 從官網:https://www.apachefriends.org/download.html 下載對應版本的安裝包,由於學的版本為5.5,選擇5.6版本安裝包 二.執行安裝 由於下載的檔案直接就是xampp-linux-x64-5.6.39-0-i
Shader之旅3:通道分離+抖動
書寫本文的初衷是為了自我反省記錄。如有表達不當,請批評指正 抖音上有類似的故障效果的拍攝特效。 其實就是利用通道分離,並將畫面進行震盪,產生類似的效果。如下效果。 這是我寫在shader上的效果 uniform float time; float rand
TOMCAT核心之旅--一個簡單的WEB伺服器--學習心得(一)
TOMCAT核心之旅–一個簡單的WEB伺服器–學習心得(一) 標籤(空格分隔): web伺服器 一、學習背景 本人是一名大三學生,開始以java學習為主,後來學習了javaWEB,瞭解到了TOMCAT伺服器,很好奇其內部是如何實現的,其與瀏覽器
Go語言核心之美 3.4-Struct結構體
struct(結構體)也是一種聚合的資料型別,struct可以包含多個任意型別的值,這些值被稱為struct的欄位。用來演示struct的一個經典案例就是僱員資訊,每條僱員資訊包含:員工編號,姓名,住址
Cocos2d-x入門之旅[3]動作
Cocos通過動作(Action)讓精靈動起來,把數個動作組成序列(Sequence)就能讓精靈做出連續的動作,在動作中我們可以改變精靈的位置,旋轉角度,縮放比例,等等 動作(Action) 首先我們建立一個Action物件,同樣使用create,這裡我們還是使用HelloWorld場景裡的那張圖片 auto
跟廠長學PHP核心7(六):變數之zval
記得網上流傳甚廣的段子“PHP是世界上最好的語言”,暫且不去討論是否言過其實,但至少PHP確實有獨特優勢的,比如它的弱型別,即只需要$符號即可宣告變數,使得PHP入手門檻極低,成為大家所青睞的Web服務端語言。那麼它的變數是如何實現的呢?我們今天就來學習一下PHP的基本變數。 一、引言 PHP的變數儲存在