前言:
PHP 在变量定义中不需要(不支持)明确的类型定义。变量类型是根据使用该变量的上下文所决定的。所以,在面对页码跳转、数值计算等严格的格式需求时,就要对变量进行类型转换。
举例如下:
$foo = "1"; // $foo 是字符串 (ASCII 49)
$foo *= 2; // $foo 现在是一个整数 (2)
$foo = $foo * 1.3; // $foo 现在是一个浮点数 (2.6)
$foo = 5 * "10 Little Piggies"; // $foo 是整数 (50)
$foo = 5 * "10 Small Pigs"; // $foo 是整数 (50)
 
正文:
问题:
1、PHP如何判断变量类型?
2、PHP的类型转换方式有哪三种?每种方式都有何函数?
 
判断变量类型:
两种方式:
  • gettype()
  • is_各种类型(),比如is_array,is_bool,is_string,is_float,is_integer,is_null,is_numeric,is_object,is_scalar(标量),is_resource
区别:
官方不提倡使用gettype()来测试某种类型,因为其返回的字符串在未来的版本中可能需要改变。此外,由于包含了字符串的比较,它的运行也是较慢的。
可是,在实际使用中,我更想要只使用一个函数就判断出变量的类型,所以我更喜欢使用gettype()。而且用第二种方式也不过是判断某一时刻的变量类型而已,并没有解决弱类型变量的基本问题。
所以,我认为在使用gettype时,只要尽量避免对需要进行改变或运算的变量判断类型,只判断已经固定类型或运算结束的变量即可。就比如前言中举例的五个变量都可以在运算结束后使用gettype($foo)。
 
PHP的三种类型转换方式:
  1. 在要转换的变量之前加上用括号括起来的目标类型(强制转换)
  2. 使用3个具体类型的转换函数,intval()、floatval()、strval()
  3. 使用通用类型转换函数settype(mixed var,string type)
解释:
  1. 强制转换方式沿袭自C,是一种粗暴的转换,不太安全,准确性不能保证,不推荐。
  2. intval() 方式较为常见,int intval ( mixed $var [, int $base = 10 ] )中$base表示转化所使用的进制,成功返回integer值,失败返回0。
  3. bool settype ( mixed &$var , string $type )是一种原地改变类型的方式,如果结果为true,直接继续操作原变量即可。
举例:

$a='0X11';
dump((int)$a);//int 0
dump(intval($a,16));//int 17
$flag=settype($a,"integer");
dump($flag);//boolean true
dump($a);//int 0
总结:
从使用场景上说,假设要转变成integer型,原变量是"0X0001"、"1a",这三种方法里面效果最好的是第二种intval()。但是无论哪种方法都需要在转换类型前做好数据检验工作,最好是先结合正则过滤字符串的每个字符,这样就能避免很多非法数据的转换了。变量类型转换可能会造成重大的隐藏bug,不容易被发现,所以在这里,安全性要高于性能。
 
参考:

PHP判断变量类型和类型转换的三种方式的更多相关文章

  1. PHP中数据类型转换的三种方式

    PHP中数据类型转换的三种方式 PHP的数据类型转换属于强制转换,允许转换的PHP数据类型有: 1.(int).(integer):转换成整形2.(float).(double).(real):转换成 ...

  2. python 判断变量是否是 None 的三种写法

    代码中经常会有变量是否为None的判断,有三种主要的写法:第一种是`if x is None`:第二种是 `if not x:`:第三种是`if not x is None`(这句这样理解更清晰`if ...

  3. 2、shader基本语法、变量类型、shader的三种形式、subshader、fallback、Pass LOD、tags

    新建一个shader,名为MyShader1内容如下: 1._MainTex 为变量名 2.“Base (RGB)”表示在unity编辑面板中显示的名字,可以定义为中文 3.2D 表示变量的类型 4. ...

  4. 数据类型转换的三种方式 Convert,parse和TryParse的解析

    以Int类型为例,具体说明Convert.ToInt32(object value),int.Parse(object value)和int.TryParse(string s,out int res ...

  5. JS判断图片是否加载完成三种方式

    1.img的complete属性 轮询不断监测img的complete属性,如果为true则表明图片已经加载完毕,停止轮询.该属性所有浏览器都支持. <p id="p1"&g ...

  6. Javascript 判断变量类型的陷阱 与 正确的处理方式

    Javascript 由于各种各样的原因,在判断一个变量的数据类型方面一直存在着一些问题,其中最典型的问题恐怕就是 typeof null 会返回 object 了吧.因此在这里简单的总结一下判断数据 ...

  7. php判断变量类型

    php判断变量类型 一.总结 一句话总结: gettype()函数:gettype(1);返回的是integer is_array():is系列函数 1.PHP empty.isset.isnull的 ...

  8. JavaScript 变量克隆和判断变量类型

    一.变量克隆 在js中经常会遇到将一个变量赋值给一个新的变量这种情况,这对于基本类型很容易去实现,直接通过等号赋值就可以了,对于引用类型就不能这样了.(注:像函数,正则也可以直接通过等号赋值) 这里我 ...

  9. 记住 Python 变量类型的三种方式

    title: 记住变量类型的三种方式 date: 2017-06-11 15:25:03 tags: ['Python'] category: ['Python'] toc: true comment ...

随机推荐

  1. Scrum Meeting 10.29

    成员 今日活动 明日计划 用时 徐越 配置tomcat+eclipse 将上届后端代码迁移到服务器 4h 赵庶宏 与数据库连接的java代码学习及编写,测试代码 进行数据库的建立并学习数据库方面的知识 ...

  2. NetFPGA-SUME下reference_nic测试

    Reference_nic Reference_nic是NetFPGA-SUME中提供的一个参考Demo,本文主要介绍如何构建并在SUME上运行reference_nic. GIT源 git clon ...

  3. 【CSAPP笔记】8. 汇编语言——数据存储

    下面介绍一些C语言中常见的特殊的数据存储方式,以及它们在汇编语言中是如何表示的. 数组 数组是一种将标量数据聚集成更大数据类型的方式.实现数组的方式其实十分简单,也非常容易翻译成机器代码.C语言的一个 ...

  4. 【CSAPP笔记】4. 汇编语言——基础知识

    程序的机器级表示 计算机能读懂是机器代码(machine code)-- 用字节序列编码的低级操作 -- 也就是0和1.编译器基于编程语言的规则.目标机器的指令集和操作系统的规则,经过一系列阶段产生机 ...

  5. Scala入门系列(六):面向对象之object

    object object相当于class的单个实例,类似于Java中的static,通常在里面放一些静态的field和method.   第一次调用object中的方法时,会执行object的con ...

  6. 深入理解Java类加载器(1)

    类加载器概述: java类的加载是由虚拟机来完成的,虚拟机把描述类的Class文件加载到内存,并对数据进行校验,解析和初始化,最终形成能被java虚拟机直接使用的java类型,这就是虚拟机的类加载机制 ...

  7. 浅谈iOS内存管理机制

    iOS内存管理机制的原理是引用计数,引用计数简单来说就是统计一块内存的所有权,当这块内存被创建出来的时候,它的引用计数从0增加到1,表示有一个对象或指针持有这块内存,拥有这块内存的所有权,如果这时候有 ...

  8. JPEG标准推荐的亮度、色度DC、AC Huffman编码表

    JPEG 标准推荐的亮度.色度DC.AC Huffman 编码表 博主在完成数字图像处理大作业时利用搜索引擎查找了很久完整的四张Huffman 编码表(亮度AC Huffman编码表.亮度DC Huf ...

  9. 【Leetcode】143. Reorder List

    Question: Given a singly linked list L: L0→L1→…→Ln-1→Ln, reorder it to: L0→Ln→L1→Ln-1→L2→Ln-2→… You ...

  10. docker搭建redis未授权访问漏洞环境

    这是redis未授权访问漏洞环境,可以使用该环境练习重置/etc/passwd文件从而重置root密码 环境我已经搭好放在了docker hub 可以使用命令docker search ju5ton1 ...