Home > Backend Development > PHP Tutorial > PHP source code analysis-weak type variable implementation_PHP tutorial

PHP source code analysis-weak type variable implementation_PHP tutorial

WBOY
Release: 2016-07-13 17:47:07
Original
961 people have browsed it

PHP is a weakly typed, dynamic scripting language. When declaring a variable, you do not need to specify the data type it holds.

For example:

$var = 1;
$var = "variable";
$var = 1.00;
$var = array();
$var = new Object();
$var = 1;
$var = "variable";
$var = 1.00;
$var = array();
$var = new Object();
Dynamic variables can be changed during runtime, and there is no need to declare the variable type before use.


So, question 1: How does the Zend engine implement this weak type in C?
In fact, variables declared in PHP are stored in the structure zval in ZE.

First we open Zend/zend.h to see the definition of 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;
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;
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;
From the above code, you can see that _zvalue_value is the key part that actually saves the data. Weakly typed variable declaration through union

Question 2: How does the Zend engine identify and store various data types in PHP?
_zval_struct.type stores the real type of a variable, and you can choose how to get the value of zvalue_value based on type.

Type value list (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
type value list (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
Let’s look at a simple example: www.2cto.com
$a = 1;
//At this time zval.type = IS_LONG, then zval.value will get lval.
$a = array();
//At this time zval.type = IS_ARRAY, then zval.value will get ht.
$a = 1;
//At this time zval.type = IS_LONG, then zval.value will get lval.
$a = array();
//At this time zval.type = IS_ARRAY, then zval.value will get ht.
The most complex of these, and one that is often used when developing third-party extensions, is the "resource type".
In PHP, any variable that does not belong to PHP's built-in variable type will be treated as a resource and saved.
For example: database handle, open file handle, open socket handle.

Resource types need to be registered using the API functions provided by ZE. The declaration and use of resource variables will be introduced in detail in a separate article.

It is precisely because of ZE's processing method that PHP implements weak types, and for ZE, it always faces the same type zval

Excerpted from God's blog

www.bkjia.comtruehttp: //www.bkjia.com/PHPjc/478520.htmlTechArticlePHP is a weakly typed, dynamic language script. When declaring a variable, you do not need to specify the data type it holds. For example: ?php $var = 1; $var = variable; $var = 1.00; $var...
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template