PHP("PHP: Hypertext Preprocessor",超文本预处理器的字母缩写)是一种被广泛应用的开放源代码的多用途脚本语言,它可嵌入到 HTML中,尤其适合 web 开发。
1.PHP的起始与结束标记:<?php 和 ?>,如示例
<?php echo "this is test"; ?>
2.注释:单行注释用 // ,多行注释用 /* */
<?php echo "this is test"; //这是单行注释 /* 这是多行注释 这是多行注释 */ echo "this is test"; ?>
3.变量:PHP中变量以 $ 符号后面加变量名来表示,变量名由字母或下划线开头,后面跟任意的字母、数字或下划线,同时区分大小写。(注意 $this是个特殊的变量,不能被赋值)
<?php $a2 = "xiaofan"; //合法变量 $2a = "xiaofan"; //非法变量 ?>
另一种方式给变量赋值:引用赋值,在将要赋值的变量前加一个 & 符号
<?php $a = "xiaofan"; $b = &$a; //通过 $b 引用 $a echo $b; //会输出 xiaofan $b = "xiaofan's blog"; //给 $b 赋值会同时改变$a里面的值 echo $a; //会输出 xiaofan's blog ?>
注意:虽然PHP的变量并不需要初始化,但是给变量初始化是个好习惯。
4.变量范围:变量范围也就是变量的作用域,指的是在脚本的一次生命周期内变量的有效范围。
PHP的变量作用域可以分为:超全局变量、全局变量、局部变量、静态变量。
4.1超全局变量:是在全部作用域都始终可以使用的内置变量,这些变量是
$GLOBALS
$_SERVER
$_GET
$_POST
$_FILES
$_REQUEST
$_SESSION
$_COOKIE
$_ENV
4.2全局变量:声明的变量不在 class, function语言结构内部就是全局变量。如果想在 class, function语言结构内部使用,需要使用关键词 global 或者超全局变量 $GLOBALS。
<?php $a = 1; $b = 2; function Sum(){ global $a, $b; //使用global调用全局变量 $b = $a + $b; } Sum(); echo $b; //会显示结果为 3 ?>
使用超全局变量 $GLOBALS 同样可以实现上面的功能
<?php $a = 1; $b = 2; function Sum(){ $GLOBALS["b"] = $GLOBALS["a"] + $GLOBALS["b"]; //使用超全局变量$GLOBALS调用全局变量 } Sum(); echo $b; //会显示结果为 3 ?>
区别:global与$GLOBALS之间的区别是什么?
$GLOBALS['var']是外部的全局变量$var本身;
global $var是外部全局变量$var的同名引用或指针;
<?php $var1 = 1; $var2 = 2; function test(){ $GLOBALS['var2'] = &$GLOBALS['var1']; } test(); echo $var2; //结果显示为 1 ?>
<?php $var1 = 1; $var2 = 2; function test(){ global $var1, $var2; $var2 = &$var1; echo $var2; //结果显示为 1 $var1 = "xiaofan's blog"; } test(); echo $var2; //结果显示为 2 echo $var1; //结果显示为 xiaofan's blog ?>
test()函数中的$var1,$var2都是局部变量,只不过是加了global关键字后,分别引用指向全局变量$var1,$var2了,当 $var2 = &$var1; 时,局部变量$var2不再指向全局变量$var2,而重新指向全局变量$var1,换句话来说,局部变量$var2的改变,不会再影响到全局变量$var2,而会影响到重新指向的全局变量$var1。
4.3局部变量:在 class, function结构语句内部声明的变量
<?php function test(){ $a = 1; } echo $a; //不会显示任何内容 ?>
4.4静态变量:在 function 中使用关键字 static 声明的变量,静态变量只在局部函数中存在,但当程序执行离开此作用域时,其值并不会丢失,会保留到整个脚本执行结束。
<?php function test1(){ $a = 1; echo $a; $a++; } test1(); //结果为 1 test1(); //结果仍然为 1 function test2(){ static $a = 1; echo $a; $a++; } test2(); //结果为 1 test2(); //结果为 2 ?>
以上的例子说明,静态变量只被初始化赋值一次,其值一直保留可以实现递归。
5.数据类型:PHP支持8种原始数据类型,分别是:boolean(布尔型)、integer(整型)、float(浮点型)、string(字符串)、array(数组)、object(对象)、resource(资源)、NULL(无类型)
变量的类型通常不是由程序员设定的,而是由PHP根据该变量使用的上下文在运行时决定的。
注意double(双精度)与float(浮点型)是相同的,由于历史原因,这两个名称同时存在。
如果想同时查看某个变量的值和类型,可以使用var_dump()函数。只查看变量的类型,可以使用gettype()函数。判断变量的类型,可以使用is_type函数。
<?php $a = 123; $b = "xiaofan"; var_dump($a); //结果为 int(123) 数据类型和值都会显示出来 echo gettype($b); //结果为 string 只显示变量的类型 if(is_string($b)){ echo "String: $b"; //is_string函数判断$b的数据类型,返回值为布尔类型 } ?>
如果要将一个变量强制转为某类型,可以使用强制转换或settype()函数。
允许的类型强制转换有:
(int), (integer) - 转换为整型 integer
(bool), (boolean) - 转换为布尔型 boolean
(float), (double), (real) - 转换为浮点型 float
(string) - 转换为字符串 string
(array) - 转换为数组 array
(object) - 转换为对象 object
(resource) - 转换为资源 resource
(NULL) - 转换为 NULL(PHP5)
<?php $a = 10; //变量a为整型 $b = "$a"; //把变量a放在双引号内同样可以转换为字符串 $c = (string)$a; //变量c为字符串 ?>
5.1 boolean(布尔型):只有两种取值,分别是TRUE和FALSE,不区分大小写
<?php $a = TRUE; //为变量a指定布尔值为TURE; ?>
要将一个值转换为布尔型,使用(bool)或(boolean)。同时,以下值在转换为布尔值时被认为 FALSE:
布尔值 FALSE本身
整型值 0
浮点值 0.0
空字符串 "" 或字符串 "0"
不含任何元素的数组
特殊类型 NULL (包含尚未赋值的变量)
5.2 integer (整型):可以使用十进制、十六进制、八进制或二进制表示,前面可以加上可选符号(+ 或 -)代表数值的正负。要表达八进制,数字前加 0 ;要表达十六进制,数字前加0x;要表达二进制,数字前加0b。
<?php $a = 1234; //十进制数 $a = -1234; //负数 $a = 0123; //八进制数(等于十进制数 83) $a = 0x1A; //十六进制数(等于十进制数 26) ?>
整型值是有范围的,跟平台有关,对于32位系统而言范围是 -2147483648(负的2的32次方)到 2147483648(2的32次方),PHP不支持无符号的整数。如果超出范围则变成浮点型。
强制转换为整型,可以使用(int) 或 (integer) ;或者使用函数intval()。
从布尔型转换为整型:FALSE将产出为0,TRUE产出为1;
从浮点型转换为整型:将向下取整,如果浮点数超出整数范围,则会出现不可预料的结果。
5.3 float(浮点型),也叫双精度数 double 或者实数 real。
比较浮点数:浮点数精度有限,浮点数不会精确到最后一位,因为也不能比较两个浮点数是否相同。不过有个迂回的办法,要测试浮点数是否相等,可以使用最小误差值(也就是计算中能接受的最小差别值)。
<?php $a = 1.2345688; $b = 1.2345605; $epsilon = 0.00001; if(abs($a-$b) < $epsilon){ //abs函数是取两个数值的绝对值 echo "true"; //结果会显示true; } ?>
5.4 string(字符串):是由一系列的字符组成,其中每个字符等同于一个字节。
一个字符串可以有两种方式表达: ''(单引号)、""(双引号)。单引号的效率比双引号更快,但是如果你的字符串中含有变量或者转义字符,就必须使用双引号。
单引号:定义一个字符串最简单的方式,单引号中的 \n \r等不会被转移。
<?php echo 'This will not expend: \n a newline'; //结果显示为 This will not expend: \n a newline,不会转义\n ?>
双引号:会对一些特殊字符进行解析转移,同时也能解析变量。
\n 换行
\r 回车
\t 水平制表符
\v 垂直制表符
\e escape
\f 换页
\\ 反斜线
\$ 美元符
\" 双引号
\[1-7]{1,3} 符合该正则表达式序列的是一个以八进制方式来表达的字符
\x[0-9A-Fa-f]{1,2} 符合该正则表达式序列的是一个以十六进制方式来表达的字符
变量解析:当字符串用双引号结构,其中的变量将会被解析。语法规则分为简单规则和复杂规则。
- 简单规则:是最常用和方便的规则,它可以用最少的代码在一个string中嵌入一个变量、一个array的值或一个object对象的属性。当PHP解析器遇到一个 $ 符号时,它会组合尽可能多的标识以形成一个合法的变量名。数组索引要用 ](方括号)来表示索引的结束,对象属性则与变量规则相同。数组的索引不能带引号,如果必须用,只能用复杂规则{}。
<?php $juice = 'apple'; echo "He drank some $juice juice."; //解析变量$juice,结果为 He drank some apple juce. echo "He drank some juice made of $juices." //由于解析器会组合尽可能多的标识,因此解析不到变量$juices,结果为 He drank some juice made of . ?>
<?php $name = Tom; echo "$name's a policeman."; //解析到的变量是$name,不会是$name's。因为's并不符合变量规则 //结果显示为 Tom's a policeman. ?>
<?php $juices = array("apple", "orange", "a" => "banana"); echo "He drank some $juices[0] juice."; //正确显示 echo "He drank some $juices[a] juice."; //正确显示 echo "He drank some juice made of $juices[1]s."; //由于数组索引是以]结束,这里同样正确显示 ?>
<?php class name{ public $name1 = Tom; public $name2 = Jim; public $name3 = Andy; } $name = new name(); echo "$name->name1 is a policeman."; //正确显示 echo "$name->name2's a policeman."; //正确显示 echo "$name->name3s is a policeman." //错误,无法找到变量$name->name3s ?>
- 复杂规则:最显著的标志就是使用 {}(花括号)包围的表达式。可以使用复杂的表达式。由于 { 无法被转移,变量的 $ 必须紧挨着 { 才会被识别。
<?php $a = 'pen'; echo "This is a {$a}"; //正确解析,显示结果是 This is a pen echo "This is a { $a}"; //由于{和$之前有空格,显示结果是 This is a { pen} echo "This is a ${a}"; //正确解析,显示结果是 This is a pen $arr1 = array("key1" => "a", "key2" => "b"); echo "This is a {$arr1['key']}"; //只有{}内才能正确解析带''(引号)的键名 $arr2 = array("key1" => "a", "key2" => array(a, b, c)); echo "This is a {$arr2[key2][1]}"; //正确解析二位数组,结果是 This is a b echo "This is a $arr2[key2][1]"; //无法解析,结果是This is a Array[1] echo "I'm xiaofan\n"; //\n会被转义成换行 只能在Unix平台会换行 echo "This is my blog\n"; ?>
字符串可以用 . (点)运算符连接起来。
强制转换为字符串:使用(string)强制转换为字符串,或用 strval()函数。在一个需要字符串的表达式中,会自动转换为 string。比如在使用函数 echo 或 print 时,或在一个变量和一个 string 进行比较时,就会发生这种转换。
布尔型FALSE转换为字符串为空字符串""
布尔型TRUE转换为字符串为"1"
布尔型和字符串可以相互转换
整数或浮点数也转换为字面样式的 string 字符串
数组总是转换为字符串"Array"
资源型总是转换为字符串"Resource id #1"
NULL转换为空字符串""
字符串转为数值:如果字符串中没有'.'、'e'或'E'并且数值在整型范围内,则会转换为一个integer(整数),其他情况则会转换为float(浮点数)。该字符串的开始部分决定了它的值。如果该字符串以合法的数值开始,则使用该数值。否则其值为 0(零)。合法数值由可选的正负号,后面跟着一个或多个数字(可能有小数点),再跟着可选的指数部分。指数部分由 'e' 或 'E' 后面跟着一个或多个数字构成。
<?php $a = 1 + "10.1"; //结果为浮点数 11.1 $b = 1 + "-1.3e3"; //结果为浮点数 -1299 $c = 1 + "10adfg"; //结果为整数11 $d = 1+ "afa10"; //结果为整型1 ?>
5.5 array(数组):PHP的数组实际上是一个有序映射,把键(key)映射到值(value)。使用array()定义数组 array( "key" => "value", ... )。
<?php $array = array( "key1" => "value1", "key2" => "value2" ); //PHP5.4版本后可以使用[]定义数组 $array1 = [ "key1" => "value1", "key2" => "value2" ] ?>
key可以是 integer 或 string ,value可以是任意类型。key会有以下的强制转换
包含有合法整型值的字符串会被转换为整型。例如键名 "8" 实际会被储存为 8。但是 "08" 则不会强制转换,因为其不是一个合法的十进制数值。
浮点数也会被转换为整型,意味着其小数部分会被舍去。例如键名 8.7 实际会被储存为 8。
布尔值也会被转换成整型。即键名 true 实际会被储存为 1 而键名 false 会被储存为 0。
Null 会被转换为空字符串,即键名 null 实际会被储存为 ""。
数组和对象不能被用为键名。坚持这么做会导致警告:Illegal offset type
如果在数组定义中多个单元都使用了同一个键名,则只使用了最后一个,之前的都被覆盖了。
<?php $array = array( 1 => "a", "1" => "b", //字符串"1"会转换为整数1 1.5 => "c", //浮点数1.5会转换为整数1 TRUE => "d" //布尔型TRUE会转换为整数1 ); var_dump($array); ?>
key 为可选项。如果未指定,PHP 将自动使用之前用过的最大 integer 键名加上 1 作为新的键名。
unset()函数删除数组中某个键,但不会重建索引。如果想重建索引可以使用函数array_values()。
为什么$foo[bar]是错误的?
应该始终在用字符串表示的数组索引上加上引号。例如用 $foo['bar'] 而不是 $foo[bar]。但是为什么呢?可能在老的脚本中见过如下语法:
<?php $foo[bar] = 'enemy'; echo $foo[bar]; // etc ?>这样是错的,但可以正常运行。那么为什么错了呢?原因是此代码中有一个未定义的常量(bar)而不是字符串('bar'-注意引号),而 PHP 可能会在以后定义此常量,不幸的是你的代码中有同样的名字。它能运行,是因为 PHP 自动将裸字符串(没有引号的字符串且不对应于任何已知符号)转换成一个其值为该裸字符串的正常字符串。例如,如果没有常量定义为 bar,PHP 将把它替代为 'bar' 并使用之。
强制转换为数组:对于任意 integer,float,string,boolean 和 resource 类型,如果将一个值转换为数组,将得到一个仅有一个元素的数组,其下标为 0,该元素即为此标量的值。换句话说,(array)$scalarValue 与 array($scalarValue) 完全一样。
5.6 object(对象):要创建一个新的object对象,需要new实例化一个类。
5.7 resource(资源):资源 resource 是一种特殊变量,保存了到外部资源的一个引用。资源是通过专门的函数来建立和使用的。
5.8 NULL:表示一个变量没有值。
以下情况一个变量被认为是NULL:
变量被赋值为 NULL
尚未被赋值的变量
unset()的变量
判断数据类型的函数
is_bool() 判断是否为布尔型
is_int() 、is_integer()或 is_long() 判断是否为整型
is_float()、is_double()或 is_real() 判断是否为浮点型
is_string() 判断是否为字符串
is_array() 判断是否为数组
is_object() 判断是否为对象
is_resource() 判断是否为资源
is_null() 判断是否为NULL
is_scalar() 判断是否为标量(标量即是包含boolean integer float string)
is_numeric() 判断是否为任何类型的数字或数字字符串
is_callable() 判断是否是有效的函数名
6.常量:合法的常量名以字母或下划线开始,后面跟着任何字母,数字或下划线。
使用define()函数定义常量,一个常量一旦被定义,就不能被改变或者取消定义。
bool define(string name, mixed value [, bool case_insensitive]),解释:返回布尔值,定义的第一个值是常量名,第二个值是变量的值(必须是标量),第三个值可选是定义是否对大小写敏感(TRUE是不敏感,FALSE是敏感),默认是FALSE敏感。
<?php define("USERNAME", "root"); //常用定义常量方法 define("Password", "pw123", TRUE); //常量名对大小写不敏感的常量 echo USERNAME; echo password; echo constant("USERNAME"); var_dump(get_defined_constants()); ?>
注意可以使用constant()函数获取常量的值,使用get_defined_constants()获取所有已定义的常量列表。
常量与变量的区别
常量前面没有 $ 符号
常量只能用 define()函数定义,不能用赋值语句
常量不用理会变量的作用域,可以在任何地方定义和访问
常量一旦被定义,就不能被修改或取消定义
常量的值只能是标量
注意:常量还可以用 const 定义。在php5.4以上,const可以在类的内部和类的外部都可以定义常量,define()仅在类外部使用。
预定义常量:PHP提供有大量的预定义常量。以下有八个魔术常量它们的值会随着所处代码的位置改变而改变。
__LINE__ 当前代码所处的行号,不区分大小写
__FILE__ 当前代码文本所处的完整路径(包含文本本身),不区分大小写
__DIR__ 当前代码文本所处的目录,不区分大小写
__FUNCTION__ 返回该函数被定义的名字,区分大小写
__CLASS__ 返回该类被定义的名字,区分大小写
__TRAIT__ Trait的名字,区分大小写
__METHOD__ 类的方法名,区分大小写
__NAMESPACE__ 当前namespace的名字,区分大小写