实现php弱类型变量的方法:1、通过Zend引擎用C实现弱类型,在ZE中用结构体zval来保存;2、通过Zend引擎是判别、存储PHP中的多种数据类型,根据type来选择获取【zvalue_value】的值。

实现php弱类型变量的方法:

PHP是弱类型,动态的语言脚本。在申明一个变量的时候,并不需要指明它保存的数据类型。例如:<?php

$var = 1;

$var = "variable";

$var = 1.00;

$var = array();

$var = new Object();

动态变量,在运行期间是可以改变的,并且在使用前无需声明变量类型。相关学习推荐:PHP编程从入门到精通

问题一、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。

php弱类型变量是什么,php弱类型变量如何实现?相关推荐

  1. 弱类型 python_弱的解释|弱的意思|汉典“弱”字的基本解释

    详细字义 ◎ 弱 ruò 〈形〉 (1) (会意.小篆字形,两把弯曲的弓,"彡"( shān)象毛羽之形,合起来表示柔弱.本义:气力小;势力差) (2) 同本义.与"强& ...

  2. C语言:__attribute__((weak)) 弱符号与__attribute__ ((weakref())弱引用

    C语言中的__attribute__((weak)) 与 __attribute__((weakref()) 引言:最近在看 linux 中一些驱动代码.驱动代码中为了实现程序的扩展性和兼容性用了很多 ...

  3. 服务器弱口令修改,Tomcat服务器弱口令漏洞攻击实验

    1.在XP系统上搭建Tomcat服务器平台: 2.在另一台虚拟机上利用弱口令漏洞上传木马程序,使得XP系统中木马. 实验步骤 一.搭建Tomcat服务器平台 1.安装JAVAJDK 环境变量的配置:( ...

  4. PHP是弱类型还是强类型,php弱类型比较(松散比较) | CN-SEC 中文网

    总结一下关于php(拍h片)弱类型相关知识的梳理. 前言 php有八种类型 标量类型:整数型integer,浮点型float,字符串类型string,布尔类型boolen 复合类型:对象 object ...

  5. android 的弱网测试,Android APP弱网测试问题和解决分析

    最近做了一次移动APP的弱网和中断测试,接下来分享一下遇到的一些问题: 1.现象:用户登录应用时下载初始化数据,下载过程中因网速太慢点击取消并重新登录,数据初始化完成后出现重复,造成数据不一致. 原因 ...

  6. java引用 弱引用_了解Java弱引用

    java引用 弱引用 我最近没来得及关注这个博客,最重要的是,我没有为与技术界的所有人保持联系而致歉. 最近,我偶然发现了自Java 1.2起可用的java.lang.ref软件包,但具有讽刺意味的是 ...

  7. python 强类型 弱类型_强类型、弱类型

    什么是强类型,什么是弱类型? 之前一直写的OC语言,在自己的意识中,所有数据类型是定义好的,如果改变数据的类型必须进行强制类型转换. 但是接触了JavaScript后发现,一个变量,可以是字符串,也可 ...

  8. java 强类型 弱类型_强类型,弱类型,静态类型,动态类型的区别

    强.弱类型 强类型strongly typed: 如果一种语言的所有程序都是well behaved--即不可能出现forbidden behaviors,则该语言为strongly typed. 弱 ...

  9. mysql弱口令字典_自制弱口令字典top100

    在进行密码字典攻击时,经常使用到一些弱口令字典.而这些若口令字典基本都是通过各大网站泄露的密码,统计出使用频率最多的密码作为字典.这样就可以大大提高成功率.相信大家都听说过CSDN top 100,1 ...

最新文章

  1. 关于ubuntu 16.04 docker常用命令
  2. java流处理为什么快_“任何情况下,都不可以堕胎”是道德普遍主义的观点。
  3. python大数据分析实例-Python大数据处理案例
  4. c语言随机三位数,【分享代码】弥补c语言随机数不足
  5. WINCE基于MC8630的3G模块的控制和加载
  6. uml图工具_UML建模工具更新情况(二)
  7. 开启POP3/SMTP服务
  8. hdu 2579 BFS
  9. String Start!
  10. 第四十六期:最近程序员频繁被抓,如何避免面向监狱编程?!
  11. Postcard:简单的音乐贺卡制作
  12. 用DataGrip生成导出整个库数据的方法
  13. android 仿小米秒表,android实现秒表功能
  14. border-collapse
  15. maven依赖关系中 scope属性含义
  16. MySQL实战第二十二讲-MySQL有哪些“饮鸩止渴”提高性能的方法?
  17. js查找数组元素位置
  18. js实现json格式化,以及json校验工具的简单实现
  19. 程序员晒出从毕业到工作5年照片,抱怨头发掉光了,网友:很真实
  20. 2022.5.25 FreeSurfer入门练习:Recon-all

热门文章

  1. SAP职业生涯中12个最致命想法
  2. IDOC实例,消息方式的IDOC
  3. 什么?口红输给口罩了?
  4. 计算机硬件系统设计mooc,计算机硬件系统设计MOOC答案
  5. [javaweb] servlet介绍与servlet的继承关系 和 service 方法 (一)
  6. 在python中 函数赋值给变量时,需要注意的几个事项
  7. python基础教程:操作符
  8. python基础教程:list转换range()的打印结果
  9. Python Sphinx使用踩坑记录
  10. Python的Mixins机制