PHP弱类型变量是如何实现的
来源:互联网 发布:怎么识谱古筝知乎 编辑:程序博客网 时间:2024/06/04 22:08
PHP是弱类型,动态的语言脚本。在申明一个变量的时候,并不需要指明它保存的数据类型。例如:
<?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
来看一个简单的例子:
<?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。
阅读全文
0 0
- PHP弱类型变量是如何实现的
- php如何判断某变量的类型
- PHP如何实现弱变量
- PHP源码分析-弱类型变量实现
- PHP源码分析-弱类型变量实现
- (php的弱类型导致的小问题)某变量可能是数字或非数字(对象、字符串、json等)时,应该如何去判断
- PHP 的 变量类型
- php的变量类型
- 浅析php变量存储结构及弱类型实现机制
- php 获取变量的类型
- 【PHP】获取变量的类型
- php的变量类型数组
- Zepto中如何实现"变量"的类型判断
- JavaScript中如何检测一个变量是一个String类型?请写出函数实现
- 在Java中如何通过反射找到一个变量,这个变量的类型是指定的类型
- 33-弱类型变量的实现
- 如何判断变量的类型
- JavaScrit的变量:如何检测变量类型
- 微信小程序 车轮之 地区选择
- Android中include标签使用一些常用注意事项
- Android 低功耗蓝牙(Bluetooth Low Energy)
- Flume数据传输事务分析
- Unity编辑器中Status窗口详解
- PHP弱类型变量是如何实现的
- android 无线ADB调试
- Ubuntu修改Java环境变量
- 一个完整的Java文件的代码分几个部分,每部分都起什么作用,大致的写法
- 设计模式---外观模式
- CSS概要了解
- Linux下完全卸载mysql
- EhCache缓存框架学习笔记
- Android开发之--拼接字符串