php弱类型变量如何实现?-PHP问题

资源魔 31 0

完成php弱类型变量的办法:一、经过Zend引擎用C完成弱类型,正在ZE顶用构造体zval来保留;二、经过Zend引擎是判断、存储PHP中的多种数据类型,依据type来抉择猎取【zvalue_value】的值。

完成php弱类型变量的办法:

PHP是弱类型,静态的言语剧本。正在声明一个变量的时分,其实不需求指明它保留的数据类型。例如:

<?php  
$var = 1;  
$var = "variable";  
$var = 1.00;  
$var = array();  
$var = new Object();

静态变量,正在运转时期是能够扭转的,而且正在应用前无需申明变量类型。

相干学习保举:PHP编程从入门到通晓

成绩1、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是真正保留数据的要害局部。经过共用体完成的弱类型变量申明

成绩2、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

来看一个简略的例子:

<?php  
$a = 1;  
//此时zval.type = IS_LONG,那末zval.value就去取lval.  
$a = array();  
//此时zval.type = IS_ARRAY,那末zval.value就去取ht.

这此中最复杂的,而且正在开发第三方扩大中常常需求用到的是”资本类型”.

正在PHP中,任何没有属于PHP的内建的变量类型的变量,城市被看做资本来进行保留。

比方:数据库句柄、关上的文件句柄、关上的socket句柄。

资本类型,会用lval,此时它是一个整型批示器, 而后PHP会再依据这个批示器正在PHP内建的一个资本列表中查问绝对应的资本。

恰是由于ZE这样的解决形式,使PHP就完成了弱类型,而关于ZE的来讲,它所面临的永远都是同一品种型zval。

以上就是php弱类型变量若何完成?的具体内容,更多请存眷资源魔其它相干文章!

标签: php php教程 php故障解决 php使用问题 弱类型变量

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