PHP 没有声明变量的命令。变量在您第一次赋值给它的时候被创建。而且是一门弱类型语言,您不需要去指定类型,PHP 会根据变量的值,自动把变量转换为正确的数据类型。
目录
php支持9种原始数据类型
四种标量类型 boolean(布尔型) integer(整型int) float(浮点型,也可以叫double) string(字符串)
- 三种复合类型 array(数组) object(对象) callable(可调用)
- 两种特殊类型 resource(资源) NULL(无类型)
【1】Boolean布尔型(bool)
这种类型只有两个值true和false,即只有真和假。
大多时候我们会在流程控制中看到,还有就是我们在比较运算和逻辑运算中会看到。例如在if条件判断中,任何类型的变量都会自动转化成布尔类型,这里重点就是对布尔值的判断,到底什么样的值才是真或者假。
官网的说明是,一共有七种值是false,其他都是true。
-
布尔值False本身
-
整型值0
-
浮点型值0.0
-
空字符串,以及字符串"0"
-
不包含任何元素的数组
-
特殊类型NULL
-
从空标记生成的SimpleXML对象
下面通过的值转化一下bool,然后用var_dump函数打印的结果都是false
var_dump((bool)false);
var_dump((bool)0);
var_dump((bool)0.0);
var_dump((bool)'');
var_dump((bool)'0');
var_dump((bool)array());
var_dump((bool)null);
var_dump((bool)new SimpleXMLElement('<xml></xml>'));
【2】 integer(整型int)
整型(int)是相当于我们数学中的集合Z中的某个值,它的表现形式可以有十进制,十六进制(前面必须加上0x),八进制(前面必须加上0),二进制(前面加上0b)。同时前面也可加上正负号,PHP不支持无符号整数。
因为整型的字长和平台有关,但是我们,可以用常量PHP_INT_MAX来表示最大值,php7可以用PHP_INT_MIN打印最小值。如果给一个数超过了integer的范围,也就是整型溢出,则会被解释成float类型。
另外PHP中的/除法,如果没有整除一般会自动转化为float类型,如果想要只取整数部分可以用int或者integer强制类型转化;如果想四舍五入可以用round()函数进行。
var_dump(PHP_INT_MAX);
var_dump(15/3);//int 5
var_dump(17/3);//float 5.6666666666667
var_dump((int)(17/3));//int 5
var_dump(round(17/3));//float 6
【3】float(浮点型double)
浮点型(也可以叫浮点数float,双精度数double,实数real),它只是一种近似的数值,如果你用浮点数表示8,它的内部其实是7.99999.....,永远不要相信它会精确到最后一位,也不要试图去比较两个浮点数是否相等。它的字长和平台也是有关,允许的范围在1.7E-38~1.7E+38(例如1.7E-38,表示1.7乘10的-38此幂),可以精确的小数点后15位。
var_dump(1.234); //float 1.234
var_dump(1.2e3); //float 1200
var_dump(7E-10); //float 7.0E-10
【4】string(字符串)
一个字符串 string就是由一系列的字符组成,其中每个字符等同于一个字节,最大的string可以达到2GB。它有四种表达方式,单引号,双引号,heredoc语法结构,nowdoc语法结构(php5.4)。
先来看一下单引号和双引号的区别:
-
单引号不能解析变量,双引号可以解析变量,变量可以用{}特殊符号来包含起来。单引号效率高一些。
-
单引号不能解析转义字符,可以用\只能解析单引号和反斜线,双引号可以解析转义字符
-
单双引号混合的话,一定要前后对应。里面有变量,最外面必须是双引号才可以解析
$name = 'tacks'; echo 'I am tacks!';//I am tacks! echo 'I\' m tacks!';//I' m tacks! 可以转义单引号 echo "I\" m $name !";//I" m tacks ! echo "I \' m {$name}!";//I \' m tacks! 双引号对\'原样输出 echo "I am '$name' !";//I am 'tacks' ! 会把单引号'直接输出
再来看一下heredoc和newdoc也就是用定界符的时候,给字符串定界的方法是用定界符语法<<<,在该运算符后需要提供一个标识,然后换行,然后是字符串,然后回车顶格写标识符和前面一样作为结束标识
-
开始标识<<<EOT 后面不能有字符,回车写字符串,最后结尾顶格EOT,必须分号;结尾。
-
定界标识符必须前后一致,常用的可以EOT,EOD,EOF。保证正文中其他位置不出现。
-
开始标识<<<EOT中如果不带引号就是heredoc,带引号<<<'EOT'就是newdoc
-
而heredoc相当于双引号可以解析变量和转义字符,而newdoc相当于单引号的效果
echo <<<EOT
I am a student;
EOT;
echo <<<'EEE'
I have an apple;
EEE;
$name = 'tacks';
echo <<<EOT
My name is $name !
EOT;
echo <<<'EEE'
$name has an apple;
EEE;
//输出 I am a student; I have an apple; My name is tacks ! $name has an apple;
-
字符串并置运算符. 相当于把两个字符串连接在一起。
-
可以用[]来去访问字符串中对应的字符值
$a = 'you';
$b = ' and ';
$c = 'me';
$d = $a.$b.$c;
echo $d;//you and me
echo $d[0];//y
【5】 array(数组)
简单来说数组是一个能在单个变量中存储多个值的特殊变量。PHP中的数组实际上是一个有序的映射,就是一种把值(value)关联到键(key)的类型。数组的键的类型可以是int或者string。数组中的元素值可以是整型,字符串,布尔等任意类型,当然也可以是数组。php中的数组就可以实现栈,队列,集合,散列表,树等多种可能性。可以看出来它还是很厉害的。
- 创建数组可以利用array() ,在php5.4以后也可以用[]来直接创建。不给建名的话默认是下标从0开始。
$arr1 = array('PHP','JAVA','Python');
$arr2 = ['PHP','JAVA','Python'];
var_dump($arr1,$arr2);
/*
打印结果都是一样,可以看出来默认数组的键是从0开始自增。
array (size=3)
0 => string 'PHP' (length=3)
1 => string 'JAVA' (length=4)
2 => string 'Python' (length=6)
*/
- 如果自己指定键名可以是整型或者字符串(字符串要加'')。其他类型强制转化。
- 如果是字符串的整数会被转型成整型;
- 如果是浮点数则会强制省去小数后面的直接取整;
- 如果是布尔值true表示1,false表示0;
- 如果是null会被存储成空字符串;
- 不能是数组和对象。
上述打印,其中被强制转化为int或者string,而且发现了一个问题,我上面写了五个,可是打印就两个,这是因为后面的键名1的覆盖了前面的,如果指定的键名已经有了值,则该值会被覆盖。
另外我最后是不是多写了一个逗号,这个是php语法支持的,对多行数组添加新单元方便。
$arr3 = [
1=>'China0',
'1'=>'China1',
1.8=>'China2',
true=>'China3',
null=>'China4',
];
var_dump($arr3);
/*
array (size=2)
1 => string 'China3' (length=6)
'' => string 'China4' (length=6)
*/
- PHP 数组可以同时含有int和string类型的键名,因为 PHP 实际并不区分索引数组(键名为int)和关联(键名为string)数组
$arr4 = [
1=>'Qiusuo',
'name'=>'Qiusuo',
];
/*
array (size=2)
1 => string 'Qiusuo' (length=6)
'name' => string 'Qiusuo' (length=6)
*/
- 如果对给出的值没有指定键名,则取当前最大的整数索引值,而新的键名将是该值加一
$arr5 = ['a','b',9=>'c','d'];
var_dump($arr5);
/*
第三个元素键名被指定是9,所以第四个键名默认10
array (size=4)
0 => string 'a' (length=1)
1 => string 'b' (length=1)
9 => string 'c' (length=1)
10 => string 'd' (length=1)
*/
- 访问数组单元可以用[]来指定下标获取对应元素
$arr6 = ['a','b','c','d','end'=>'END'];
var_dump($arr6[0],$arr6{'end'});
/*
一般我们用[],其实利用[]和{}效果是一样的,如果键名是string要加引号
string 'a' (length=1)
string 'END' (length=3)
*/
- 追加数组单元。可以在数组变量名后加上一对方括号
$arr7 = [1,'10'=>'10'];
$arr7[] = 100;
$arr7['end'] = '0';
var_dump($arr7);
/*
上述,利用[]默认追加的是索引数组,也可以指定关联数组,
array (size=4)
0 => int 1
10 => string '10' (length=2)
11 => int 100
'end' => string '0' (length=1)
*/
- 遍历数组中所有的值,获取数组长度
#索引数组 遍历可以用for
$arr8 = ['China','America','Britain','Germany','Japan','Korea'];
$len = count($arr8);#获取数组长度
for($i=0;$i<$len;$i++){
echo $arr8[$i].'<br/>';
}
#关联数组 遍历可以用foreach语法,推荐使用此方法
$arr9 = ['Country'=>'China','Province'=>'Beijing','City'=>'HaiDingQu'];
foreach($arr9 as $key=>$value){
echo $key,'=>',$value,'<br/>';
}
【6】object(对象)
要创建一个新的对象,使用new去实例化一个类。随后再详细说。
class Person{
function eat(){echo 'eat food';}
}
$tacks = new Person();
var_dump($tacks);//object(Person)[1]
【7】callable(可调用)
PHP5.4后可以用callable类型指定回调类型callback,一些函数例如call_user_func()可以接收用户自定义回调函数作为参数,也可以是对象的方法等。
function my_callback_function() {
echo 'hello world!';
}
call_user_func('my_callback_function'); //hello world!
【8】resource(资源)
资源resource是一种特殊的变量,保存外部资源的引用,是通过专门的函数来建立使用的。例如打开文件的时候,数据库连接,画布等特殊句柄。如果计数系统自动检测到一个资源不再引用,回收系统会将其释放。
$res = opendir('../written');//打开一个文件夹返回一个资源句柄
var_dump($res);
【9】Null
特殊的Null值表示一个变量没有值,有三种情况,被赋值为Null;尚未赋值;被unset()。
$a = null;
$b = Null;
$c = 'nuLL';
var_dump($a,$b,$c);
unset($c);//变量被销毁了
/*
null
null
string 'nuLL' (length=4)
*/
类型转换
PHP在变量定义中不需要明确的类型定义,变量类型是根据使用该变量的上下文所决定的。如果大家实在不知道这个变量是什么类型可以用gettype()函数来获取变量类型。如果大家像判断是否是某类型可以用is_*()系列函数。下面就简单说一下常见的几种类型转化。
【1】强制类型转化
①在变量前添加()来指定目标类型:
PHP 中的类型强制转换和 C 中的非常像:在要转换的变量之前加上用括号括起来的目标类型。布尔值 true为1 false为0;如果转字符串,也可以直接加双引号实现;如果转整型,可以直接通过+0运算来实现;
$bar = true;
var_dump((int)$bar);//int 1
var_dump((float)$bar);//float 1
var_dump((string)$bar);//string 1
var_dump("$bar");//string 1
$bar = 10;
var_dump((boolean)$bar);//boolean true
var_dump((float)$bar);//float 10
var_dump((string)$bar);//string '10'
var_dump("$bar");//string '10'
$bar = 10.0;
var_dump((bool)$bar);//boolean true
var_dump((int)$bar);//int 10
var_dump((string)$bar);//string '10'
var_dump("$bar");//string '10'
$bar = '0';
var_dump((bool)$bar);//boolean false
var_dump((int)$bar);//int 0
var_dump("$bar");//string '0'
$bar = null;
var_dump((bool)$bar);// boolean false
var_dump((int)$bar);//int 0
var_dump((float)$bar);//float 0
var_dump((string)$bar);//string ''
②用具体的转换函数来实现:
$bar = "123.45abc";
$int = intval($bar); // int 123
$float = floatval($bar);// float 123.45
$str = strval(123.45);// string '123.45'
③利用settype()函数
以上两种并不是直接去改变变量的值,而是将变量转化得到的新类型赋值给了新的变量,原来的变量的值还是不变,类型也不变化。如果需要将变量本身变化成其他类型可以通过settype()函数实现。可以自己尝试一下吗,这里不过多演示。
$bar = "555bar";
var_dump($bar);//string '555bar' (length=6)
settype($bar,'int');
var_dump($bar);//int 555
【2】字符串转化成数值
PHP中字符串实现方式是一个由字节组成的数组再加上一个整数指明缓冲区长度。并无如何将字节转换成字符的信息,由程序员来决定。字符串的开始部分决定它的值,如果字符串以合法的数值开始,则使用该数值,否则其值为0。
转成int :字符串中没有(小数点. 科学计数法E e)并且数值在整型范围之内;
转成float: 其他的情况当作float;
$str1 = 0 + '10'; //int 10
$str2 = 0 + '-10ABC';//int -10
$str3 = 0 + 'ABC'; //int 0
$str4 = 0 + 'ABC999';//int 0
$str5 = 0 + '1.80'; //float 1.8
$str6 = 0 + '1.8E10AAA';//float 18000000000
$str7 = 0 + '0.18e-2'; //float 0.0018
$str8 = 0 + 'ABC1.8'; //int 0
$str9 = 1.0 + '10'; //float 11
$str10 = 1.0 + '1.1EEE';//float 2.1