PHP语言中的数据类型(2-2)

PHP 支持 9 种原始数据类型。之前整理的时候,把callable整漏了,这次补上。

四种标量类型:1、布尔类型 2、整型 3、浮点型(小数) 4、字符串
两种复合类型:1、数组 2、对象 3、callable(可调用)
两种特殊类型:1、null 2、资源

一、布尔型 boolean

最简单的类型。 可以为 TRUE 或 FALSE,且不区分大小写; 一般情况下建议布尔类型的变量使用is 来开头,类如:

$isDelete = true;
$isVip = true;

在if、elseif条件代码里小括弧里会强制隐性转换为boolean类型。

$isRich = 1; // 大家可以把 $isRich 设置成 "", -1, 2.333, null, "false" 自行测试一下。
if ($isRich) { // 这里会有一个隐性转换,会把 $isRich 由 1 转成 true
    echo "不差钱";
} else {
    echo "穷";
}

下面的值都是false,其他所有值都认为true。

  • 整数0 (-1和其他非零值都是true)
  • 浮点型0.0
  • 字符串 '0'"0"、空白字符串(中间无空格)
  • 布尔值false
  • 没有成员的数组
  • null

需要注意下面的代码

$isTop = 1;
if( $isTop === true ){   //全等情况
    echo 'ok';
}else{
    echo 'buok';
}
var_dump(is_bool($isTop));  //使用is_bool检测一个变量是否是布尔类型
$isTop = (bool)$isTop;    // 强制转换布尔类型
var_dump(is_bool($isTop));

二. 整型(integer)

就是不包括小数点的数,PHP支持以十进制数、八进制数、16进制数表示的整数值 PHP在大多数平台上支持的最大整数是20亿左右【-2147483648,2147483647】,如果超出integer范围,会被解释float类型。

$a  =  1234 ;  // 十进制数
$a  = -123 ;  // 负数
$a  =  0123 ;  // 八进制数 (等于十进制 83)
$a  =  0x1A ;  // 十六进制数 (等于十进制 26)

八进制数由前导0和一个0~7的数字序列组成

0755  =》十进制493
+010  =》十进制 8

十六进制值以0x开头,接着是数字(0~9)或字母(A~F)的序列,一般大写

0xFF  //十进制 255
0x10  // 十进制 16
-0xDAD1  //十进制 -56017

二进制 用0和1来表示一个数字 数字前加 0b

0b101           // 十进制 5
0b10011010010; // 二进制 1234

转换函数

$a = 100;
// 十进制转成二进制字符串
var_dump(decbin($a)); // string(11) "1100100"
// 十进制转成八进制字符串
var_dump(decoct($a)); // string(4) "144"
// 十进制转成十六进制字符串
var_dump(dechex($a)); // string(3) "64"

可以使用 (int) 或者 intval() 来强制把一个类型转成 int 类型

三、浮点型(float)

  • 最大支持【1.7E-38,1.7E+38】,精确到小数点后15位。
  • 浮点数只是近似值,浮点数表示8,其实结果7.999999...,所以不要比较两个浮点数的值是否相等
$a = 1.234; 
$b = 1.2e3; //1.2乘以10的3次方
$c = 7E-10; //7乘以10的-10次方

尽量不要比较两个浮点数是否相等

$d = (0.1 + 0.7) * 10;
var_dump($d, floor($d));
if ($d == 8) {
    echo "我等于8";
} else {
    echo "我不等于8";
}
/* bccomp 如果两个数相等返回0, 左边的数大返回1, 左边小则返回-1. 下面的2为只比较前2位的小数位 */
if (bccomp($d, 8, 2) === 0) {
    echo "我等于8";
} else {
    echo "我不等于8";
}

(0.1+0.7)*10在计算机内部,可能是7.999999……所以我们用floor($d)舍去法舍去小数取整时,返回的是7而不是8。 永远不要相信浮点数结果精确到了最后一位,也永远不要比较两个浮点数是否相等。 如果需要比较,一定要使用任意精度函数(如BCMath、GMP相关函数)

四、字符串 string

1、单引号

通常执行速度也是最快的,因为PHP不解析其中存在的变量或特殊字符的转义

echo 'phptherightway is ' . $adjective;   // 一个单引号的使用示例,

多行拼接

echo 'phptherightway is ' . $adjective . '.'    
    . "\n"                                      // 为变量和转义字符串使用了多行拼接
    . 'I love learning ' . $code . '!';

2、双引号

最适用于:

  • 包含特殊字符的转义
  • 内含多个变量和纯文本字符串的混搭
  • 压缩多行拼接,提高可读性
echo "phptherightway is $adjective.\n I love learning $code!";
// 没有使用多行拼接,

3、heredoc 语法结构

标识符的命名:只能包含字母、数字和下划线,并且不能用数字和下划线作为开头;结束定界符必须独立一行存在。前后不能有其他字符(包括空白符)

$str = <<<EOD
定义字符串的方法是用heredoc句法结构
EOD;
echo $str;
/*
 $变量名 =  <<<定界符号
 结束定界符;
 */

4、NowDoc 语法结构(php5.3+)

名称加单引号。相当于定界符中的单引号。不会解析变量。

echo <<<'EOT'
My name is "$name". I am printing some $foo->foo.
Now, I am printing some {$foo->bar[1]}.
This should not print a capital 'A': \x41
EOT;

字符串使用注意

1、花括号的使用

$var = 'jack';
$str = "不要把后面的杰克和肉丝分开-----{$var}Rose";

2、什么是转义字符

进行转义字符前放置反斜杠;当在双引号内使用这些字符时,它们具有特殊的含义

转义字符的代码 转义字符的含义
\" 双引号
\' 单引号
\\ 反斜杠
\n 换行符
\r 回车符
\t 制表符
\$ 美元符

3、字符串连接符点(.)的使用

  • 如果代码行超过了推荐的行长度(120个字符),那么应该考虑拼接代码行
  • 为了便于阅读,最好使用拼接操作符而不是拼接赋值操作符
  • 在变量原本的命名空间内,当拼接使用了新行,则应该缩进
$str = '聂哥帅不帅'
        . "\n"
        . '帅';
echo $str;

五、数组

1、索引数组

$nvshen = ['白晶晶','紫霞','春三十娘','如花'];
//自动创建索引数组
$newArray = range(0, 10,2);
var_dump($newArray);

2、关联数组

$role = ['mo'=>'白晶晶','zhuyin'=>'紫霞'];
$role['zhou'] = '至尊宝';

六、对象

class Student
{
    public $name;
    public $sex;

    public function readBook(){
        echo $this->name.':抬头望明月,低头思故乡';
    }
}
## 实例化一个对象
$std = new Student();
## 设置对象属性
$std->name = '李白';
## 调用对象方法
$std->readBook();

七、callable(可调用)

我们在使用call_user_func()usort,array_map函数的时候,可以接受用户自定义的回调函数作为参数,回调函数不止可以是简单的函数,还可以是对象内的方法、静态类方法。

function my_callback_function() {
    echo 'hello world!';
}
// 简单的回调
call_user_func('my_callback_function'); 

class Person 
{
    static function talk() {
        echo '聂哥帅';
    }
}
//回调静态的类方法
call_user_func(array('Person', 'talk')); 

八、NULL(也叫无类型)

下列情况之一被认为是null

  • 赋值null
  • 声明的变量尚未被赋值
  • unset() 函数销毁的变量

九、资源类型

资源 resource 是一种特殊变量,保存了到外部资源的一个引用,比如打开文件、连接数据库、请求网络等

$handle  =  fopen ( "/home/rasmus/file.txt" ,  "r" );

伪类型

伪类型(pseudo-types)是PHP文档里用于标识参数可以使用的类型和值。仅用于PHP手册及我们代码中注释部分。

1、mixed

说明一个参数可以接受多种不同的(但不一定是所有的)类型。 例如 gettype() 可以接受所有的 PHP 类型, str_replace() 可以接受字符串和数组。

mixed  str_replace  ( mixed  $search  , mixed  $replace  , mixed  $subject  [, int &$count  ] )

2、number

number 说明一个参数可以是 integer 或者 float。

/**
 * 获取订单总价
 * @param   number  $amount     数额
 * @return  bool
 */
 function getOrderPrice($amount){
 }

3、callback

本文档中在 PHP 5.4 引入 callable 类型之前使用 了 callback 伪类型。二者含义完全相同。 现在已经用callable类型替代

4、array|object(数组 | 对象类型)

array|object 意思是参数既可以是 array 也可以是 object

5、void

void 作为返回类型意味着函数的返回值是无用的。void 作为参数列表意味着函数不接受任何参数

在函数原型中,$...表示等等的意思。当一个函数可以接受任意个参数时使用此变量名

小练习

有可能会吐血,请准备大盆一个。

error_reporting(E_ALL ^ E_NOTICE);

var_dump((bool) false);     
var_dump((bool) 0);         
var_dump((bool) 0.00);    
var_dump((bool) "");       
var_dump((bool) "0");      
var_dump((bool) array());   
var_dump((bool) []);        
var_dump((bool) null);      
var_dump((bool) "00");      
var_dump((bool) "0.0");     
var_dump((bool) -1);        
var_dump((bool) 1);         
var_dump((bool) "abc");     
var_dump((bool) 2.3e5);     
var_dump((bool) array(12)); 
var_dump((bool) [12]);      
var_dump((bool) NAN);  

$a = false;
var_dump(is_null($a));
var_dump(isset($a));
var_dump(empty($a));

$a = null;
var_dump(is_null($a));
var_dump(isset($a));
var_dump(empty($a));

$a = '';
var_dump(is_null($a));
var_dump(isset($a));
var_dump(empty($a));

$a = 0;
var_dump(is_null($a));
var_dump(isset($a));
var_dump(empty($a));

$a = '0';
var_dump(is_null($a));
var_dump(isset($a));
var_dump(empty($a));

$a = 0.0;
var_dump(is_null($a));
var_dump(isset($a));
var_dump(empty($a));

$a = 0.5;
var_dump(is_null($a));
var_dump(isset($a));
var_dump(empty($a));

$a = [];
var_dump(is_null($a));
var_dump(isset($a));
var_dump(empty($a));

$b;
var_dump(is_null($b));
var_dump(isset($b));
var_dump(empty($b));     

参考

[PHP官网]http://php.net/manual/zh/
[波哥博客]https://www.jianshu.com/p/c3f560dcdbcb