1. 程式人生 > >PHP核心之旅-3.變數

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 #define
IS_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 #define
IS_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

結構體v
名稱 作用
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

Shader3:通道分離+抖動

書寫本文的初衷是為了自我反省記錄。如有表達不當,請批評指正   抖音上有類似的故障效果的拍攝特效。 其實就是利用通道分離,並將畫面進行震盪,產生類似的效果。如下效果。 這是我寫在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的變數儲存在