Home > Backend Development > PHP Tutorial > How to implement weakly typed variables in PHP

How to implement weakly typed variables in PHP

高洛峰
Release: 2016-10-17 10:19:19
Original
1668 people have browsed it

PHP 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 = array();  
$var = new Object();
Copy after login

Dynamic variables can be changed during runtime, and there is no need to declare the variable type before use.


Question 1. How does the Zend engine implement this weak type in C?


In fact, variables declared in PHP are stored in ZE using the structure zval.

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;
Copy after login

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;
Copy after login

From the above code, we can see that _zvalue_value is the key part that actually saves data. Weakly typed variable declaration through union


Question 2. How does the Zend engine identify and store multiple 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 the 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
Copy after login

Let’s look at a simple example:

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

The most complex of these, and what is often used in developing third-party extensions, is "resources" 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.


The resource type will use lval, which is an integer indicator at this time. Then PHP will query the corresponding resource in a resource list built in PHP based on this indicator.


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


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