变量是用于临时存储值的容器。PHP最基本的数据存储单元是变量和常量。
PHP是弱类型语言,在声明变量或者常量的时候,数据类型根据程序上下文决定,由于这个原因,使PHP和其他一些强类型语言(C、Java)有很大不同,也因此PHP可以更快的入门。
1、变量的声明
1)变量创建
PHP特性之一就是在使用变量之前,不要求声明变量。当你第一次给一个变量赋值时,你才创建了变量。一旦创建了一个变量,你可以在脚本中重复使用。在php中声明一个变量需要在变量名前跟一个“$”符号。
eg1:
相信你一眼就能看懂下边的代码。
<?php
$a = 123;
$b = 456;
$c = $a;
$a = $b = "abc";
echo $c;
echo $a;
上例将会输出“123abc”。
2)变量使用范围
变量范围就是变量的生效范围。大部分的变量如果不是在函数里边声明的,这个变量在声明处到文本结束的小范围内有效,这个“小范围”不是<?php ?>
开始和结束范围,还包括include和require的文件。还有另外一种叫全局变量,如COOKIE和SESSION可以在所有页面中使用。
在变量的使用范围内,可以用unset()函数释放指定变量(内存中释放),使用isset()来判断某个变量是否存在,empty()来判断某个变量是否为空。这几个函数,在我们写业务代码时经常用到。
#易混淆点
empty()和isset()区别:
如果empty()的参数是非空或者非零的值时,则返回false,否则返回true;如果isset()参数存在,则返回true,否则返回false。
需要注意的是:
①“”,0,“0”,NULL,false,array(),var $var
empty()判断这些值时返回的都是true(var 定义变量是在类中使用的,相当于public,不在类中使用会报错,反之,在类中定义变量不定义属性(public、protected、private),也会报错)。另外一个NULL字节("\0"
)并不等同于PHP的NULL常数。
②isset()判断被unset()处理后的变量返回的是false。
③推荐使用!empty($var)
判断某个变量存在且不为空。
④网上及相关资料说没有任何属性的对象,empty()会返回true,但实际情况是返回的是false。查了很多资料,说是php4版本会返回true,具体情况得测试之后才知晓。
eg2:下边举例了绝大部分例子
<?php
$var1 = '';//test1输出1,test2输出3
$var2 = ' ';//test1输出2,test2输出3
$var3 = 0;//test1输出1,test2输出3
$var4 = '0';//test1输出1,test2输出3
$var5 = null;//test1输出1,test2输出4
$var6 = false;//test1输出1,test2输出3
$var7 = array();//test1输出1,test2输出3
class a{};
$var8 = new a();//test1输出2,test2输出3
$var9 = (object)null;//test1输出2,test2输出3
$var10 = new StdClass();//test1输出2,test2输出3,此方法也是创建一个空对象
$var11 = 'this is a test';
unset($var11);//test1输出1,test2输出4
$var12;//test1输出1,test2输出4
$var13 = "/0";//直接var_dump($var13)会打印出string''(length=1),但是test1输出的是2,test2输出的是3,这里涉及到null和null字节("\0")不相等。
$var14 = '/0';//直接var_dump($var14)会打印出'/0',test1输出的是2,test2输出的是3,这里$var13和$var14涉及到反斜杠转义
function test1($var){
if(empty($var)){
echo 1;
}else{
echo 2;
}
}
function test2($var){
if(isset($var)){
echo 3;
}else{
echo 4;
}
}
test1($var1);//可以改变参数$var1来测试其他情况,下同
test2($var1);
2、变量的命名
变量名是严格区分大小写的,但是内置结构和关键字以及用户自定义的类名和函数名都是不区分大小写的。例如echo、while、class 名称、function 名称等都可以任意大小写。
eg: echo 1;与ECHO 1;是一样的。
变量命名规范:
①变量名严格区分大小写
②变量名以字母或者下划线开头,后面跟上任意的数量的字母、数字或者下划线。
③变量名不能以数字开头,中间不可以有空格,不能使用点分开
④php中有一些标识符是系统定义的,即关键字。不能用这些关键字作为常量名、函数名、类名。但是可以使用这些关键字作为变量名,例如$echo
,但是容易混淆,最好不要使用。
⑤一般变量命名都是有一定含义的,便于代码理解。一般多个单词构成的变量名,第一个单词全部小写,后边的每个单词首字母采用大写。eg:$aaaBbbCcc
3、可变变量
一个变量的名字是变量,即可变变量。
eg:
这个例子说
<?php
$a = 'hello';
$$a = 'world';
echo $$a;//输出world
echo $a.$$a;//输出helloworld,其中“.”是php的拼接符
echo "$a $$a";//输出hello $hello,双引号会解析变量
echo "$a ${$a}";//输出hello world
4、变量的引用赋值
引用赋值对初学者来说,相对比较难以理解,这里使用一个例子解释。
eg:假定$a
的值为1,将$a
的值引用赋值给$b
,然后当你改变$a
或者$b
的值为2时,这时$a
和$b
都将变为2。
代码:
<?php
$a = 1;
$b = &a;
$b = 2;
//$a = 2;注释$b=2,给$a赋值,结果一样
echo $a.$b;//输出22
从上面代码中可以看到,引用赋值用的是符号“&”,其$b
引用了$a
,可以理解成$b
引用了$a
的存值的地址,而不是复制其$a
值得操作,从而这种赋值操作更加快速,也可以理解成$b
是$a
的别名。但是只有在密集的循环中或者对很大的数组或者对象赋值时,才有可能注意到速度的提升。
注意事项:
①只有有名字的变量名才可以引用赋值。
②表达式不能作为引用赋值
③与C语言的地址指针不同的是,$a
和$b
在内存上并不是同体,只是把各自的值相关联起来。所以使用unset()其中一个变量,并不会导致另一个变量消失
<?php
$a = 1;
$b = &a;
//$b = &(2*2);//引用赋值无效,不能将表达式作为引用赋值,会报错
function test(){
retrn 3;
}
//$b = &test();//引用赋值失败,会报错
unset($a);
echo $b;//输出1
5、变量的类型
PHP是弱类型语言,其类型是根据存储的数据决定的。var_dump()可以查看变量类型,php中支持8种原始类型数据。
①标量类型:布尔型(boolean)、整型(int)、浮点型(float,也称作double)、字符串(string)
②复合型类型:数组(array)、对象(object)
③特殊类型:资源(resource)、NULL
1)布尔型
true或者false,即“真”或“假”。php进行关系运算(比较运算),以及逻辑运算时,返回true或false。
在php中一些情况下,需要一个boolean型值时,会自动转为布尔型,例如if(){},此时任何类型的值,在if判断中都会转换为布尔型。
以下会被转换为false,其他只会被转换为true
①false(字符串‘false’会被认为是true)
②整型值0,浮点型值0.0
③空白字符串(即”,不是’ ‘),字符串‘0’
④空数组(array())
⑤没有单元的对象(仅适用于php4)
⑥null(包括未被设定的变量)
eg:
<?php
$a;
$b = (object)null;//空对象
var_dump((bool)false);//输出false
var_dump((bool)'false');//输出true
var_dump((bool)0);//输出false
var_dump((bool)'0');//输出false
var_dump((bool)0.0);//输出false
var_dump((bool)'0.0');//输出true
var_dump((bool)'');//输出false
var_dump((bool)' ');//输出true
var_dump((bool)array());//输出false
var_dump((bool)null);//输出false
var_dump((bool)$a);//输出false
var_dump((bool)$b);//输出true,php7环境
2)整型
整型即整数,除了10进制以外,还有8、16进制也有整型。
①8进制,数字前需要加指定符号“0”,eg: echo $a = 0123;
会输出83
②16进制,数字前需要加指定符号“0x”,eg:echo $b = 0xA;
会输出10
整型有最大值和最小值范围,这个与平台有关。32位的操作系统,最大值整数位2^(32-1)-1,最小值是-2^(32-1),因为php不能像其他语言那样将整数变成正数,即前面都是含有符号(“+”和“-”),所以最大值和最小值都要2的(32-1)次方。
在php中,如果给一个变量的值大于最大值或者小于最小值,则会被php解释为float。
eg:var_dump(12345678912345678912),会输出float(1.23456789123456E+19);var_dump(1);会输出int(1)
3)浮点型
浮点型是包含小数的部分的数。浮点数只是一个近似值,例如使用浮点数表示2,该数值内部表示其实类似1.99999….,所以不要相信浮点数结果精确到了最后一位,也不要比较两个浮点数是否相等,这一点很重要,因为在码代码过程中,可能涉及到金钱,因此造成损失。如果需要更高精度,应该使用任意精度数学函数或者gmp()函数。浮点数的字长也是跟平台相关的,精度在小数点后15位。
eg:
<?php
$a = 0.1*100;
$b = 10;
var_dump($a<$b);//输出true
var_dump($a == $b);//输出false
$a = 0.1*100;
$b = 0.10000000000000001*100;
var_dump($a == $b);//输出true
如果非要比较两个浮点数大小,那么只能在精度范围内比较。以下是一些比较两个浮点数的方法。
<?php
// are 2 floats equal
function floatcmp($f1,$f2,$precision = 10)
{
$e = pow(10,$precision);
$i1 = intval($f1 * $e);
$i2 = intval($f2 * $e);
return ($i1 == $i2);
}
// is one float bigger than another
function floatgtr($big,$small,$precision = 10)
{
$e = pow(10,$precision);
$ibig = intval($big * $e);
$ismall = intval($small * $e);
return ($ibig > $ismall);
}
// is on float bigger or equal to another
function floatgtre($big,$small,$precision = 10)
{
$e = pow(10,$precision);
$ibig = intval($big * $e);
$ismall = intval($small * $e);
return ($ibig >= $ismall);
}
另外,在浮点数运算中,也是需要注意的,因为计算机计算是将数值转换成二进制计算的,而二进制中,你看似有穷的小数, 在计算机的二进制表示里却是无穷的。在计算浮点数时,可以将其计算结果先转换成转换成string类型。
这个网址有详细讲解其中原因:http://www.jb51.net/article/80734.htm
eg:
<?php
var_dump((int)(0.58*100));//输出57,这与二进制有关,因为二进制中0.58是无限延长的值
var_dump((int)(string)(0.58*100));//输出58
$a= 0.58;
var_dump(intval(strval($a*100)));//输出58
4)字符串
PHP没有对字符串大小强加实现范围,不必担心字符串长度。字符串可以用单引号、双引号、边界符三种方式定义,功能各不相同。
①单引号
单引号中不能再包含单引号,会发生错误,必须要在单引号中含有单引号,可以用反斜线(\)转义。如果在单引号之前或字符串结尾需要出现一个反斜线,需要用两个反斜线表示。
另外,单引号不会解析其中的变量,会原样输出,所以没有特别需求情况下,使用单引号定义字符串效率会更高,因为php在解析时省去了处理字符转义和变量上的开销。
eg:
<?php
//单引号中如果需要再包含单引号,需要使用转义字符“\”
echo 'this is a \'apple\'';//输出 this is a 'apple'
//单引号中不会转义其他转义符
echo 'this \n is \t a apple \\';//输出this \n is \t a apple \
//不会转义变量
$a = 1;
echo '$a';//输出$a
②双引号
双引号会解析其中的变量及转义字符,另外,复杂的语法可以用花括号({})括起一个表达式。如果想指定变量名字的结束,可以用{}括起来。
eg:
<?php
$var = 1;
//因为(')在变量名中是无效的
echo "$var's";//输出1's
echo "{$var}s";//输出1s
//{}指定变量名结束
echo "${var}s";//输出1s
③定界符
通常用于从文件或者数据库中大段地输出文档,几乎不用。
语法:使用“<<<”,在<<<后提供一个标识符开始,并以同样的标识符结束。
注意事项:
标识符命名规则和变量命名规则一样,只能含有字母、下划线、数字,且必须以下划线或者非数字字符开始。
标识符必须从行的第一列开始,后边除了分号以外不能包含任何其他字符、空格、空白制表符。
定界符不能初始化类成员,其他与双引号表现的一致。
eg:
<?php
$string=<<<TEST
结尾的ETO一定要顶头,在本行第一列,不然会如同双引号没有闭合,而且连注释都不能写\n
123
TEST;
echo $string;
//初始化类成员,以下会报错
class test{
public $a = <<<TEST
123
TEST;
}
5)数组
数组是php重要的复合型数据类型。前面所说的类型都是标量类型,只能存储一个数据,数组可以存储多个数据,而且可以存入任何类型的数据。
由于数组知识点较多,这里暂做简单介绍,后边会专门说明。
数组的格式如下:
eg:
<?php
/*
array(
key1=>value1,
key2=>value2,
...
)
key可以是string或者int
value可以是任意值
*/
$a = array("a"=>1,2=>"b");
6)对象
在php中,对象是比数组更高级的复合数据类型,一个对象是由一组属性值和一组方法构成的。初始化一个对象,用new语句讲对象实例化到一个变量中,这里只做简单介绍和示例。
eg:
<?php
class a{
public $b;
public function c(){
echo 123;
}
}
$p = new a();//实例化类a,创建对象。
$p->b = '345';//访问对象中的属性
$p->c();//访问对象中的方法
7)资源类型
8)NULL类型
null类型唯一的值时null,不区分大小写,表示一个变量没有值,null既不表示空格,也不表示0,也不是空字符串,而是一个变量的值为空。以下三种情况被认为是空。
①变量的值被设置为null
②声明的变量没有赋值
③被unset()函数销毁的变量
9)伪类型