PHP变量名、变量值、类型
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PHP变量名、变量值、类型相关的知识,希望对你有一定的参考价值。
参考技术A 变量名 =》 zval变量值 =》zend_value
问题:
引用计数
变量传递,变量赋值
变量的基础结构
变量值:zend_value
typedef union _zend_value
zend_long lval; /* long value */
double dval; /* double value */
zend_refcounted *counted;
zend_string *str;
zend_array *arr;
zend_object *obj;
zend_resource *res;
zend_reference *ref;
zend_ast_ref *ast;
zval *zv;
void *ptr;
zend_class_entry *ce;
zend_function *func;
struct
uint32_t w1;
uint32_t w2;
ww;
zend_value;
变量名:_zval
typedef struct _zval_struct zval;
struct _zval_struct
zend_value value; /* value */
union
struct
ZEND_ENDIAN_LOHI_4(
zend_uchar type, /* active type */
zend_uchar type_flags,
zend_uchar const_flags,
zend_uchar reserved) /* call info for EX(This) */
v;
uint32_t type_info;
u1;
union
uint32_t var_flags;
uint32_t next; /* hash collision chain */
uint32_t cache_slot; /* literal cache slot */
uint32_t lineno; /* line number (for ast nodes) */
uint32_t num_args; /* arguments number for EX(This) */
uint32_t fe_pos; /* foreach position */
uint32_t fe_iter_idx; /* foreach iterator index */
u2;
;
变量类型【type】
/* regular data types */
#define IS_UNDEF 0
#define IS_NULL 1
#define IS_FALSE 2
#define IS_TRUE 3
#define IS_LONG 4
#define IS_DOUBLE 5
#define IS_STRING 6
#define IS_ARRAY 7
#define IS_OBJECT 8
#define IS_RESOURCE 9
#define IS_REFERENCE 10
/* constant expressions */
#define IS_CONSTANT 11
#define IS_CONSTANT_AST 12
/* fake types */
#define _IS_BOOL 13
#define IS_CALLABLE 14
/* internal types */
#define IS_INDIRECT 15
#define IS_PTR 17
true 和 flase 没有zend_value 结构, 直接通过type来区分,zend_long和double的变量指直接存储在_zend_value中,不需要额外的value指针。
PHP核心编程知识点
一、PHP基本语法
- PHP标记:一共有四种,只推荐使用第一种
- 语句结束符:分号
- 注释:行注释(// #)和块注释(/* */),注释的规范
二、常见的输出语句
- echo
- var_dump
- print_r
- printf
三、变量
- 变量的组成:变量名和变量值组成,变量名引用变量值
- 内存的组成:堆区、栈区、用户代码区,全局数据区(变量区、常量区、静态变量区),变量名在栈区,变量值是在变量区中
- 变量的基本语法:$
- 变量的命名规则
- 可变变量:变量的名又可以用一个变量来代替
- 变量的基本操作
- 增:声明变量
- 删:删除变量,unset的行为:删除变量名空间,消除引用关系
- 该:修改变量的值
- 查:获取变量的值,输出变量
- 变量间的传值
- 值传递:传递后两个变量独占占用各自的变量名空间和变量值空间,互补干扰
- 引用传递:传递后两个变量的变量名共同引用相同的变量值空间
- 预定义变量
- $_SERVER
- $_GET
- $_POST
- $_REQUEST
- 其他
四、常量
- 常量的定义:define(‘名’,值,是否不区分大小写) const 常量名=常量值
- 常量的语法意义:用来规范数据保证数据在运行的过程中不被改变
- 判断常量是否存在:defined(‘常量名’),返回一个布尔值
- 常量的命名规则,特殊的常量名使用constant(‘常量名’)方式进行访问
- 获取所有的常量:get_defined_constants()
- 预定义常量
- 含义
- 魔术常量:该常量的值由其所在的位置决定
五、数据类型
1.数据类型简介
- 程序 = 数据结构 + 算法
- PHP的数据类型:三大类,8小类
2.进制及进制转换
- 其他进制转换为十进制:按权展开!
- 十进制转二进制
- 整数
- 除二取余法
- 填充法
- 小数:乘二取整
- 整数
- 十进制转其他进制
- 整数:除 n 取余
- 小数:乘 n 取整
- 八进制、二进制、十六进制直接的互转
- 二、八之间的互转
- 八转二:一拆三(421码)
- 二转八:三并一
- 二、十六之间的互转
- 十六转二:一拆四
- 二转十六:四并一
- 八、十六之间的互转
- 八转十六:先一拆三,再四并一
- 十六转八:先一拆四,再三并一
- 二、八之间的互转
3.整型数据
- 表示形式
- 十进制
- 八进制,以0开头
- 十六进制,以0x开头
- 在内存中的形式:二进制的补码的形式存放的
- 原码、反码和补码的概念
4.浮点型数据
- 表示形式:
- 小数形式
- 指数形式
- e不区分大小写
- e后必须要有数字
- e后必须是整数
- 在内存中的形式:只能以指数的形式存放
- 浮点数的比较:不要使用浮点数进行比较,因为会浮点数会丢失精度
5.布尔型数据
- 只有true和false两个值,不区分大小写
- 在进行逻辑判断的时候,以下的值会当成false进行处理
- 整数0
- 浮点数0:0.0
- 字符串0:’0’
- 空字符串:’’
- 空类型:NULL
- 空数组:array()
- 对象和资源型永远为真!
6.字符串数据
- 单引号
- 双引号
- 定界符:Heredoc
- 定界符:Nowdoc
7.特殊数据类型
- NULL类型
- resource型
8.类型转换
-
类型自动转换
- 字符串型自动转换为数值型
- 其他类型自动转换为布尔型
- 类型强制转换
- 利用类型强制转换运算符()来完成的!
- 使用(array)进制强制转换的时候的注意事项
9.类型相关函数
- 类型相关的函数
- gettype
- settype
- isset
- empty
- is_type系列
六、运算符
1.几个概念
a.运算符的概念
b.运算符的分类
c.运算符的优先级和结合性
d.表达式和语句
2.算术运算符
- 求余运算符:在运算之前先把两个操作数都自动转换为整型,符号是由被除数决定的
- 自增自减:++和——在前面和在后面的区别
3.赋值运算符
- 复合的赋值运算符
- 赋值运算符的结合性:右结合
- 赋值表达式的值就是被赋值的那个变量的值$a = 100
4.字符串连接符
- 主要和逗号的区别
- 在运算之前是将两边的操作数都自动转换为字符串类,然后进行横向的“拼接”
5.关系运算符
- =和==的区别
- ==和===的区别
6.逻辑运算符
- 逻辑与 && 或者and
- 逻辑或 || 或者 or
- 逻辑非 !
- 逻辑异或 xor
- 注意短路运算
7.条件运算符
- 形式:表达式1 ? 表达式2 : 表达式3
- 也有短路运算的行为,相当于简单的if……else语句
8.位运算符
- 按位与 &
- 按位或 |
- 按位非 ~
- 按位异或 ^
- 按位左移:<<,右边补0
- 按位右移:>>,左边正数补0,负数补1
9.其他运算符
- new、clone、instanceof、@
七、流程控制
1.流程控制简介
- 三大结构:顺序、选择、循环
- 算法的表示:流程图、伪代码、自然语言
2.if语句
- 条件执行:只有if没有else
- if……else……
- if……elseif……
3.switch语句
- 开关语句:一旦case后面的表达式的值和switch后面表达式的值一致,开关就打开了,一直遇到右花括号或者break语句为止!
- 与if语句的区别:if语句是条件分支,switch语句是状态分支
4.while语句
- 当型循环:里面的循环体有可能一次都不执行
- 百钱买百鸡:面向过程的编程思想——自顶向下,逐步细化!
5.do-while语句
- 直到型循环:里面的循环体至少要执行一次
- 辗转相除法求最大公约数:体会while循环和do-while循环的区别
6.for语句
- 使用的最多,因为最简洁紧凑
- 执行流程
- 表达式1、表达式2、表达式3都可以省略
7.循环的中断语句
- continue:结束当前的本次循环,继续下一次循环
- break:结束当前整个循环
- 中断的层次:默认值为1
8.流程控制语句的替代语法
- 把所有的左花括号都用冒号来代替
- 整个流程控制语句结束后,再用endIf、endWhile、endFor、endForeach等来结束
- do-while没有这种替代语法
9.文件载入
- 体现了网站的分层设计,以提高代码的重用性
- 有四种不同的载入的方式,只是语法上的一些差异
- 载入的原理(过程)
- 退出PHP模式,进入HTML模式
- 将目标文件内的源代码载入到当前位置(相当于将其中的源码复制到当前载入的位置)
- 将被载入的源代码先进行预编译然后执行(文件的载入是发生在执行阶段)
- 再次进入PHP模式
- 载入时的路径问题
- 相对路径:./ ../
- 默认路径:可以在php.ini中进行配置(include_path)
- 绝对路径:一般都要先定义目录常量
- 四种载入方式的区别
- include和require
- include和include_once
10.脚本的执行控制
- die或exit
- sleep
八、函数
1.函数的定义
2.函数的组成
- 函数名
- 函数参数列表
- 函数体
3.函数调用
4.可变函数
函数名可以用一个变量来代替
5.匿名函数
6.函数的参数
- 形参和实参
- 参数的值传递和引用传递
- 形参的默认值
- 参数的数量问题
- 实参多于形参
- 实参少于形参:只有一种正确的情况,那就是形参有默认值的时候
- 不定参数的函数
- 基本思想:干脆一个都不定义
- func_get_args()用来接收实参的值,是一个索引数组
- func_get_arg()用来获取某一个实参的值,索引是从0开始
- func_num_args(),用于获取实参的数量
- 函数体
- return语句
- 函数内允许出现多个return语句,但是只能执行其中的一条
- 如果一个函数内确实有很多的值需要返回,一般的做法就是把这些值放到一个数组(对象)里面,然后返回这个数组就行了
- 函数的作用域
- 全局作用域(全局变量)
- 局部作用域(局部变量)
- 超全局作用域(预定义变量)
- $GLOBALS
- 关键字global
7.变量的生命周期
- 概念:与变量的作用域的区别
- 静态局部变量:使用关键字static
8.函数的递归调用
- 概念:就是函数在执行的时候自己调用自己,不是一种新的语法,而是一种算法的描述
- 递归调用的关键点:递归出口,递归点,写程序的时候先写递归出口,然后再写递归点
- 特点:代码书写比较简单,本质上就是以空间换取时间
10.字符串函数
- strlen
- substr
- strtolower|strtoupper
- ucfirst:首字母大写
- strrev
- strpos
- strrpos
- strchr|strstr
- strrchr
- trim
- str_replace(要替换的字符,替换成什么字符,从哪个字符串替换);
11.时间函数
- time:返回一个时间戳
- date:将一个时间戳格式化为指定的格式(常见的时间占位符:Y-m-d H:i:s)
- strtotime
- microtime,加上参数true就是返回一个浮点型的时间戳
12.数学函数
- abs
- sqrt
- pow
- ceil|floor
- round
- rand|mt_rand
九、数组
-
数组初步
- 数组创建:显示创建,隐式创建、利用强制类型转换符创建
- 数组访问:中括号语法
- 数组分类:
- 键值之间的关系:索引数组和关联数组
- 数组的维度:一维和多维数组
- foreach遍历
- 基本语法
- 几个细节
- 数组的指针:reset,next、current、key
以上是关于PHP变量名、变量值、类型的主要内容,如果未能解决你的问题,请参考以下文章