• 技术文章 >php教程 >php手册

    php 全局变量:PHP源码分析-弱类型变量实现

    2016-06-21 08:50:34原创487
    PHP是弱类型,动态的语言脚本。在申明一个变量的时候,并不需要指明它保存的数据类型。
    例如:
    $var = 1;
    $var = "variable";
    $var = 1.00;
    $var = array();
    $var = new Object();
    动态变量,在运行期间是可以改变的,并且在使用前无需声明变量类型。
    那么,问题一、Zend引擎是如何用C实现这种弱类型的呢?
    实际上,在PHP中声明的变量,在ZE中都是用结构体zval来保存的。
    首先我们打开Zend/zend.h来看zval的定义:
    typedef struct _zval_struct zval;
    struct _zval_struct {
    /* Variable information */
    zvalue_value value; /* value */
    zend_uint refcount__gc;
    zend_uchar type; /* active type */
    zend_uchar is_ref__gc;
    };
    typedef union _zvalue_value {
    long lval; /* long value */
    double dval; /* double value */
    struct {
    char *val;
    int len;
    } str;
    HashTable *ht; /* hash table value */
    zend_object_value obj;
    } zvalue_value;
    Zend/zend_types.h:
    typedef unsigned char zend_bool;
    typedef unsigned char zend_uchar;
    typedef unsigned int zend_uint;
    typedef unsigned long zend_ulong;
    typedef unsigned short zend_ushort;
    从上述代码中,可以看到_zvalue_value是真正保存数据的关键部分。通过共用体实现的弱类型变量声明
    问题二、Zend引擎是如何判别、存储PHP中的多种数据类型的呢?
    _zval_struct.type中存储着一个变量的真正类型,根据type来选择如何获取zvalue_value的值。
    type值列表(Zend/zend.h):
    #define IS_NULL 0
    #define IS_LONG 1
    #define IS_DOUBLE 2
    #define IS_BOOL 3
    #define IS_ARRAY 4
    #define IS_OBJECT 5
    #define IS_STRING 6
    #define IS_RESOURCE 7
    #define IS_CONSTANT 8
    #define IS_CONSTANT_ARRAY 9
    来看一个简单的例子:
    $a = 1;
    //此时zval.type = IS_LONG,那么zval.value就去取lval.
    $a = array();
    //此时zval.type = IS_ARRAY,那么zval.value就去取ht.
    这其中最复杂的,并且在开发第三方扩展中经常需要用到的是"资源类型".
    在PHP中,任何不属于PHP的内建的变量类型的变量,都会被看作资源来进行保存。 本文链接http://www.cxybl.com/html/wlbc/Php/20121213/34971.html



    声明:本文原创发布php中文网,转载请注明出处,感谢您的尊重!如有疑问,请联系admin@php.cn处理
    专题推荐:Zend value define zval typedef
    上一篇:PHP实现读取远程文件功能 下一篇:phpwind9.0 新时代的社区产品
    大前端线上培训班

    相关文章推荐

    • PHP类(Class)入门教程第1/2页_php基础• php中实现api接口思路介绍 • startos安装apache,php,mysql• php获取英文姓名首字母的方法• php的memcached扩展

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网