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