PHP是一门弱类型语言,本身不严格区分变量的类型。PHP在变量申明的时候不需要指定类型。

PHP在程序运行期间可能进行变量类型的隐示转换。 和其他强类型语言一样,程序中也可以进行显示的类型转换。

PHP变量可以分为简单类型(int、string、bool)、集合类型(array resource

object)和常量(const)。以上所有的变量在底层都是同一种结构 zval。

Zval主要由三部分组成:

type:指定了变量所述的类型(整数、字符串、数组等)

refcount&is_ref:用来实现引用计数(后面具体介绍)

value:核心部分,存储了变量的实际数据

Zvalue是用来保存一个变量的实际数据。因为要存储多种类型,所以zvalue是一个union,也由此实现了弱类型。

PHP变量是什么?

引用计数在内存回收、字符串操作等地方使用非常广泛。PHP中的变量就是引用计数的典型应用。Zval的引用计数通过成员变量is_ref和ref_count实现,通过引用计数,多个变量可以共享同一份数据。避免频繁拷贝带来的大量消耗。在进行赋值操作时,zend将变量指向相同的zval同时ref_count++,在unset操作时,对应的ref_count-1。只有ref_count减为0时才会真正执行销毁操作。如果是引用赋值,则zend会修改is_ref为1。

PHP变量通过引用计数实现变量共享数据,那如果改变其中一个变量值呢?当试图写入一个变量时,Zend若发现该变量指向的zval被多个变量共

享,则为其复制一份ref_count为1的zval,并递减原zval的refcount,这个过程称为“zval分离”。可见,只有在有写操作发生时

zend才进行拷贝操作,因此也叫copy-on-write(写时拷贝)对于引用型变量,其要求和非引用型相反,引用赋值的变量间必须是捆绑的,修改一个变量就修改了所有捆绑变量。整数、浮点数是PHP中的基础类型之一,也是一个简单型变量。对于整数和浮点数,在zvalue中直接存储对应的值。其类型分别是long和double。

从zvalue结构中可以看出,对于整数类型,和c等强类型语言不同,PHP是不区分int、unsigned int、long、long

long等类型的,对它来说,整数只有一种类型也就是long。由此,可以看出,在PHP里面,整数的取值范围是由编译器位数来决定而不是固定不变的。

对于浮点数,类似整数,它也不区分float和double而是统一只有double一种类型。在PHP中,如果整数范围越界了怎么办?这种情况下会自动转换为double类型,这个一定要小心,很多trick都是由此产生。

和整数一样,字符变量也是PHP中的基础类型和简单型变量。通过zvalue结构可以看出,在PHP中,字符串是由由指向实际数据的指针和长度结

构体组成,这点和c++中的string比较类似。由于通过一个实际变量表示长度,和c不同,它的字符串可以是2进制数据(包含\0),同时在PHP中,

求字符串长度strlen是O(1)操作。在新增、修改、追加字符串操作时,PHP都会重新分配内存生成新的字符串。后,出于安全考虑,PHP在生成一个字符串时末尾仍然会添加\0

常见的字符串拼接方式及速度比较:假设有如下4个变量:$strA=‘123’; $strB = ‘456’; $intA=123;

intB=456;

PHP的数组通过Zend

HashTable来天然实现。foreach操作如何实现?对一个数组的foreach就是通过遍历hashtable中的双向链表完成。对于索引数组,通过foreach遍

历效率比for高很多,省去了key->value的查找。count操作直接调用

HashTable->NumOfElements,O(1)操作。对于’123’这样的字符串,zend会转换为其整数形

式。$arr[‘123’]和$arr[123]是等价的

资源类型变量是PHP中复杂的一种变量,也是一种复合型结构。PHP的zval可以表示广泛的数据类型,但是对于自定义的数据类型却很难充分描述。由于没有有效的方式描绘这些复合结构,因此也没有办法对它们使用传统的操作符。要解决这个问题,只需要通过一个本质上任意的标识符(label)引用指针,这种方式被称为资源。

PHP变量是什么?

像我们所熟悉的mysqli、fsock、memcached这一类都是资源,首先我们先了解关于这类资源的专业知识,其次将讲解如何使用这些资源。

php什么是变量6,PHP变量是什么相关推荐

  1. 浅显易懂 Makefile 入门 (02)— 普通变量和自动变量定义、使用($@、$^、$< 作用)、变量覆盖 override、变量的来源 origin

    1. 变量的定义 Makefile 文件中定义变量的基本语法如下: 变量的名称=值列表 变量的名称可以由大小写字母.阿拉伯数字和下划线构成.等号左右的空白符没有明确的要求,因为在执行 make 的时候 ...

  2. Go 学习笔记(6)— 变量定义、变量声明、变量作用域

    1. 变量定义 Go 语言变量名由字母.数字.下划线组成,其中首个字符不能为数字.声明变量的一般形式是使用 var 关键字: var varName dataType [= value] Go 语言和 ...

  3. 用户变量和系统变量的区别

    用户变量和系统变量的区别 1. 系统变量:对所有的用户起作用 用户变量:对当前用户起作用 那么为什么要设置环境变量? 在Windows和DOS操作系统中的path环境变量,当要求系统运行一个程序而没有 ...

  4. go 指针变量和普通变量的转化_C语言 | 指向结构体变量的指针变量

    "要成为绝世高手,并非一朝一夕,除非是天生武学奇才,但是这种人-万中无一" --包租婆这道理放在C语言学习上也一并受用.在编程方面有着天赋异禀的人毕竟是少数,我们大多数人想要从C语 ...

  5. 堆栈,静态变量和普通变量,静态函数和普通函数的区别

    首先简单介绍一下堆和栈的区别. 1.内存分配 一个由c/C++编译的程序占用的内存分为以下几个部分 1).栈区(stack)- 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等.其操作方式类似 ...

  6. awk 内置变量与自定义变量

    点击上方"生信科技爱好者",马上关注真爱,请置顶或星标 作者:ghostwu 原文:https://www.cnblogs.com/ghostwu/p/9085653.html A ...

  7. R语言广义加性模型GAMs:可视化每个变量的样条函数、样条函数与变量与目标变量之间的平滑曲线比较、并进行多变量的归一化比较、测试广义线性加性模型GAMs在测试集上的表现(防止过拟合)

    R语言广义加性模型GAMs:可视化每个变量的样条函数.样条函数与变量与目标变量之间的平滑曲线比较.并进行多变量的归一化比较.测试广义线性加性模型GAMs在测试集上的表现(防止过拟合) 目录

  8. R语言创建自定义颜色(分类变量与颜色形成稳定映射)实战:设置因子变量(分类变量)到可视化颜色的稳定映射

    R语言创建自定义颜色(分类变量与颜色形成稳定映射)实战:设置因子变量(分类变量)到可视化颜色的稳定映射 目录

  9. 环境变量、用户变量、系统变量

    环境变量.用户变量.系统变量 环境变量: 环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数,如:临时文件夹位置和系统文件夹位置等. 环境变量 ...

  10. linux脚本查看变量类型,Shell变量:Shell变量的定义、删除变量、只读变量、变量类型...

    变量是任何一种编程语言都必不可少的组成部分,变量用来存放各种数据.脚本语言在定义变量时通常不需要指明类型,直接赋值就可以,Shell 变量也遵循这个规则. 在 Bash shell 中,每一个变量的值 ...

最新文章

  1. PLSQL的 dynamic sql小例子
  2. 分布式账本(Distributed ledger)
  3. UML各种图总结-精华
  4. vue2.x 在引用插件的时候,npm run dev跑正常 ,npm run build 报错vue-cli Unexpected token: punc (() [...
  5. java 设置文本颜色_在Java中更改文本的颜色
  6. 学习Spring Data JPA
  7. C#中通过WMI的Win32_DiskDrive对象获取磁盘驱动器信息简介
  8. phalapi 数据库锁_phalApi数据库操作
  9. shellcode编写技巧
  10. int 占一个机器字长
  11. oracle增加表字段_史上最详细的oracle 中的CR块介绍--一致性读
  12. java 可以做前端么_java怎么做前端?Java web前端必备技术
  13. 前端知识点查文档网站
  14. WEB2.0是什么东东?[转]
  15. 图像降噪算法——从BM3D到VBM4D
  16. 计算机硬件维修的步骤和方法,计算机硬件组装与维护教程
  17. PDF Reader Pro - 一款全能型PDF文件编辑器
  18. No known package when getting value for resource number 0xfe080009
  19. 5G网络入门基础--5G网络的架构与基本原理
  20. Mysql-五种join类型

热门文章

  1. pythonhtml生成word_python如何实现word批量转HTML
  2. json里面的list数据取不出来_sql盲注的困局:利用DNSlog快速导出数据
  3. C语言变量未赋初值时,输出为乱七八糟解释
  4. js设置了location.href不跳转问题
  5. python3的 pymysql把mysqldb库取代了,让python 3支持mysqldb的解决方法
  6. java犀牛是什么意思_深入浅出Rhino:Java与JS互操作
  7. 以知乎为例子来说明MVC是个啥
  8. HDU 3709 Balanced Number(数位DP)题解
  9. vue 中 created 和 mounted 钩子生命周期 问题
  10. angularjs启动项目报ERROR in AppModule is not an NgModule解决方法