PHP语法
PHP 脚本以 结束
<?php
// PHP 代码
?>
还有一些其他的格式,不过建议使用规范。
php文件默认扩展名“.php”
PHP语句是以分号结尾的(;),php代码块的关闭标签也会自动表明分号(即PHP代码块的最后一行不必使用分号。)
注释
注释作用是提供代码编辑者阅读,帮助理解代码。
// 这是 PHP 单行注释
# 这也是单行注释
/* */ 这是PHP多行注释
变量
变量可以视为存储数据的容器。
PHP变量规则
- 变量以 $ 符号开始,后面跟着变量的名称
- 变量名必须以字母或者下划线字符开始
- 变量名只能包含字母数字字符以及下划线(A-z、0-9 和 _ )
- 变量名不能包含空格
PHP 没有声明变量的命令。
变量在第一次赋值给它的时候被创建:
$num=123;
$a="hello";
如果赋值为文本,要使用引号。
- 变量名是区分大小写的($y 和 $Y 是两个不同的变量)
在PHP中,所有用户定义的函数名,方法名,类名和关键词(if ,else,echo)对大小写不敏感。
<?php
echo "hello";
Echo "hello";
ECHO "hello";
?>
这些语句等价。
但是在PHP变量中,所有变量名,常量名都对大小写敏感。
<?php
$num=1;
echo "$num";
echo "$Num";
?>
只会输出第一个语句。$num和$Num 为两个不同的变量。
PHP单引号和双引号的用法
- 在定义字符串时,可以使用单引号也可以使用双引号。
$a="ad";或者$b='a';合法
$c='afa";这个为非法字符。
在定义字符串时,只有最开始的字符串被分析器解析,若是双引号被解析,那么在双引号里可以包含任何其他字符。
$d="sad'af'faef";这个为合法字符串。
如果中间出现了双引号,那么就会被重新解析,如果要表示出双引号,可以加入转义字符“\(反斜线)”
"I do "this"things"这个正常解析为三段
转义输出双引号为,"I do\"this\"things"
- 字符串中的单双引号处理。
并置运算符(.)用于将两个字符串值连接起来。
<?php
$txt1="Hello world!";
$txt2="What a nice day!";
echo $txt1 . " " . $txt2;
?>
//Hello world! What a nice day!,在两个字符串中间插入了一个空格。
$num=a.''.c;
$num="a c";两个变量处理结果相同。
双引号的内容可以被解释和替换,但是单引号中内容却被当作普通字符,直接输出。
需要使用转义字符串时,使用双引号。
单引号在解析时,处理速度更快。
$num=2;
echo "num is $num";//num is 2;
echo 'num is $num';//num is $num;
echo 'num is $num\n';// num is $num\n
echo "num is $num\n";// num is 2(同时换行);
打印二维数组$a中的某个元素。
echo "a= $a[$i][$j]";
这种表达会报错。改为
echo 'a='.$a[$i][$j];
或者 复杂变量用花括号括起来。
echo "a={$a[$i][$j]}"
- 在sql语句中。
在插入数据库的SQL语句是采用单引号来定义字符串,如果要将一个含有单引号的字符串插入数据库,这个SQL语句就会出错。
PHP 变量作用域
- local (局部作用域)
- global (全局作用域)
- static (静态作用域)
- parameter (函数参数作用域)
在所有函数外部定义的变量,拥有全局作用域。除了函数外,全局变量可以被脚本中的任何部分访问,要在一个函数中访问一个全局变量,需要使用 global 关键字,或者使用 $GLOBALS[index] 数组。
- 函数之外声明的变量拥有 Global 作用域,只能在函数以外进行访问。
- 函数内部声明的变量拥有 LOCAL 作用域,只能在函数内部进行访问。
因此可以在不同函数中创建相同的局部变量名,但是局部变量只能在其中被创建它的函数识别。
<?php
$x=5; // 全局作用域
function myTest() {
$y=10; // 局部作用域
echo "<p>测试函数内部的变量:</p>";
echo "变量 x 是:$x";
echo "<br>";
echo "变量 y 是:$y";
}
myTest();
echo "<p>测试函数之外的变量:</p>";
echo "变量 x 是:$x";
echo "<br>";
echo "变量 y 是:$y";
?>
- local关键字的使用
在 PHP 函数内部声明的变量是局部变量,仅能在函数内部访问。
<?php
function test()
{
$a = 15;
echo "内部输出结果:" . $a;
}
echo "外部输出结果:" . $a; // 无法访问变量 a
test();
?>
//
外部输出结果:
内部输出结果:15
- global 的关键字的使用
global 关键字用于函数内访问全局变量。在函数内调用函数外定义的全局变量,我们需要在函数中的变量前加上 global 关键字。
<?php
$a=5;
$b=3;
function t2()
{
echo $GLOBALS['a']-$GLOBALS['b']; // 输出 2
global $a,$b;
$x=$a-$b;
echo $x;
}
t2();
?>//输出两个2
- static的关键字的使用
当一个函数完成时,它的所有变量通常都会被删除。然而,有时候您希望某个局部变量不要被删除。要做到这一点,请在您第一次声明变量时使用 static 关键字,这样之后每一次调用该函数时,该变量将会保留函数前一次被调用时的值。
- parameter关键字的使用
参数是通过调用代码将值传递给函数的局部变量。
关于局部变量和全局变量的优先级,因为在PHP中函数都有自己单独的作用域,所以在局部变量的优先级要大于全局变量(在你不声明这个变量之前),声明之后此变量就变成了局部变量如果修改值那么全局变量的值也会改变。
<?php
$a = 10;
$b = 5;
function test()
{
$a = 15;
$b = 5;
$z = $a-$b;
echo $z;
}
test();
function test1()
{
global $a,$b;
$a = 15;
$b = 5;
$z = $a-$b;
echo PHP_EOL;
echo $z;
}
test1();
function test2()
{
global $a,$b;
$z= $a-$b;
echo PHP_EOL;
echo $z;
}
test2();
?>
//结果都是10;
输出
echo 和 print 区别:
- echo - 可以输出一个或多个字符串
- print - 只允许输出一个字符串,返回值总为 1
echo /echo()
print /print()
echo "hello";
print "hello";
定界符
EOF(heredoc)
- 必须后接分号,否则编译通不过。
- EOF 可以用任意其它字符代替,只需保证结束标识与开始标识一致。
- 结束标识必须顶格独自占一行(即必须从行首开始,前后不能衔接任何空白和字符)。
- 开始标识可以不带引号或带单双引号,不带引号与带双引号效果一致,解释内嵌的变量和转义符号,带单引号则不解释内嵌的变量和转义符号。
- 位于开始标记和结束标记之间的变量可以被正常解析,但是函数则不可以。在 heredoc 中,变量不需要用连接符 . 或 , 来拼接。
<?php
$name="变量会被解析";
$a=<<<EOF
$name<br><a>html格式会被解析</a><br/>双引号和Html格式外的其他内容都不会被解析
"双引号外所有被排列好的格式都会被保留"
"但是双引号内会保留转义符的转义效果,比如table:\t和换行:\n下一行"
EOF;
echo $a;
?>
- .PHP 定界符 EOF 的作用就是按照原样,包括换行格式什么的,输出在其内部的东西;
- 2.在 PHP 定界符 EOF 中的任何特殊字符都不需要转义;
数据类型
php 数据类型
- String(字符串)
- Integer(整型)
- Float(浮点型)
- Boolean(布尔型)
- Array(数组)
- Object(对象)
- NULL(空值)
- Resource(资源类型)
<?php
$a = "字符串类型";
$b = 1234;//整形
$c = -3.1415;//浮点型
$d = 8E-3;
$e = true;//boolean类型
$f = array("A","B","C");//数组类型
class obj{//php对象的声明
var $num;
function name() { }
}
$o = new obj();//对象实例化类型
$g = NULL;//NULL
var_dump($a);
var_dump($b);
var_dump($c);
var_dump($d);
var_dump($e);
var_dump($f);
var_dump($o);
var_dump($g);
?>
var_dump() 方法
var_dump() 方法,判断一个变量的类型与长度,并输出变量的数值,如果变量有值,则输出是变量的值,并返回数据类型。显示关于一个或多个表达式的结构信息,包括表达式的类型与值。数组将递归展开值,通过缩进显示其结构。
PHP弱类型
弱类型比较
弱类型的语言对变量的数据类型没有限制,你可以在任何地时候将变量赋值给任意的其他类型的变量,同时变量也可以转换成任意地其他类型的数据。
$a=1;
$a="abc";
$a=array();
比较操作符
类型转换
类型相同不会进行转换,直接比较。
在$a==$b的比较中
$a=null;$b=flase ; //true
$a='';$b=null; //true
==:先将字符串类型转化成相同,再比较
===:先判断两种字符串的类型是否相等,再比较
字符串和数字比较使用==时,字符串会先转换为数字类型再比较
0 =='0' //true
0 == 'abcdefg' //true
0 === 'abcdefg' //false
1 == '1abcdef' //true
var_dump('a123' == 123);//false,因为php中有这样一个规定:字符串的开始部分决定了它的值,如果该字符串以合法的数字开始,则使用该数字至和它连续的最后一个数字结束,否则其比较时整体值为0。
举例:
var_dump('123a1' == 123);//true
var_dump('1233a' == 123);//false
<、>、<=、>=都存在和==相同的弱类型,原理相同
当字符串与数字使用==进行比较时,会将字符串类型转换成数字型再进行比较(如果两边都是字符串,则双方都转换为数字型),只比较转换后的数值的大小.
字符串的开始部分决定了它的值,如果该字符串以合法的数值开始,则使用该数值,否则其值为0。
var_dump('0e170' == '0e180');
//true//分析:因为字符串中含有e开头的值,那么php代码会将其整体看成科学记数法,最后0的170次方==0的180次方,即0==0,所以成立
var_dump(0 === 'root');
//false//分析:=== 在进行比较的时候,会先判断两边类型是否相等,这里数值和字符串类型明显不等,因此不成立
var_dump ("0e830400451993494058024219903391" == 0);
//true//分析:先将字符串0e830400451993494058024219903391转化成和0同等类型即数字型,因为字符串开始有合法数值,则字符串0e830400451993494058024219903391转换为0,最后0==0,所以成立。
var_dump ("0e830400451993494058024219903391" == "0e830400451993494058024219904444");
//true//分析:先将字符串0e830400451993494058024219903391与0e830400451993494058024219904444分别转化成数字型,因为两个字符串开始都有合法数值,则字符串0e830400451993494058024219903391转换为0,字符串0e830400451993494058024219904444转换为0,最后0==0,所以成立。
就是如果字符串中出现的"."或"e"或"E",那么,此类字符串和数字进行比较时,会有所区别。
var_dump("123.2abc"==123);//false
var_dump("123.2abc"==1232);//false
var_dump("123e2abc"==123);//false
var_dump("123E2abc"==123);//false
.就表示了浮点数,e和E表示了科学计数法
Hash 比较
"0e132456789"=="0e7124511451155" //true
"0e123456abc"=="0e1dddada" //false
"0e1abc"=="0" //false
在进行比较运算时,如果遇到了0e\d+这种字符串,就会将这种字符串解析为科学计数法。所以上面例子中2个数的值都是0因而就相等了。如果不满足0e\d+这种模式就不会相等。
\d+表示1个或多个0到9的数字
十六进制转换
"0x1e240"=="123456" //true
"0x1e240"==123456 //true
"0x1e240"=="1e240" //false
当其中的一个字符串是0x开头的时候,PHP会将此字符串解析成为十进制然后再进行比较,0x1240解析成为十进制就是123456.
内置函数的参数的松散性
内置函数的松散性说的是,调用函数时给函数传递函数无法接受的参数类型。
md5()
md5()中的需要是一个string类型的参数。但是当你传递一个array时,md5()不会报错,只是会无法正确地求出array的md5值,这样就会导致任意2个array的md5值都会相等。
$array1[] = array("foo" => "bar","bar" => "foo",);
$array2 = array("foo", "bar", "hello", "world");
var_dump(md5($array1)==var_dump($array2)); //true
md5()函数不能处理数组,数组返回null,md5(a[ ])结果为null。
加密后以0e开头的值
QNKCDZO
0e830400451993494058024219903391
s878926199a
0e545993274517709034328855841020
s155964671a
0e342768416822451524974117254469
s214587387a
0e848240448830537924465865611904
s878926199a
0e545993274517709034328855841020
s1091221200a
0e940624217856561557816327384675
s1885207154a
0e509367213418206700842008763514
0e215962017
这个数加密前后皆以0e开头。可以绕过一些弱类型比较。
strcmp()
strcmp()函数在PHP官方手册中的描述是int strcmp ( string $str1 , string $str2 ) ,需要给strcmp()传递2个string类型的参数。
如果str1小于str2,返回-1,相等返回0,否则返回1。strcmp函数比较字符串的本质是将两个变量转换为ascii,然后进行减法运算,然后根据运算结果来决定返回值。
如果传入给出strcmp()的参数是数字呢?
$array=[1,2,3];
var_dump(strcmp($array,'123')); //null 在某种意义上null也就是相当于false。
switch()
如果switch是数字类型的case的判断时,switch会将其中的参数转换为int类型.
$i ="2abc";
switch ($i) {
case 0:
case 1:
case 2:
echo "i is less than 3 but not negative";
break;
case 3:
echo "i is 3";
}
//i is less than 3 but not negative
in_array()
在PHP手册中,in_array()函数的解释是bool in_array ( mixed $needle , array $haystack [, bool $strict = FALSE ] ) .
如果strict参数没有提供,那么in_array就会使用松散比较来判断haystack中。当strince的值为true时,in_array()会比较needls的类型和haystack中的类型是否相同。
$array=[0,1,2,'3'];
var_dump(in_array('abc', $array)); //true 'abc'==0
var_dump(in_array('1bc', $array)); //true '1bc'==1
常量
常量值被定义后,在脚本的其他任何地方都不能被改变。
有效的常量名以字符或下划线开头(常量名称前面没有 $ 符号)。
常量无需定义其作用域,自动就是全局的。
设置常量需使用define()函数,设置三个参数
- 首个参数定义常量的名称
- 第二个参数定义常量的值
- 可选的第三个参数规定常量名是否对大小写不敏感。默认是 false。
<?php
define("NIHAO", "欢迎");
function myTest() {
echo NIHAO;
}
myTest();
?>
//欢迎
运算符
算术运算符
运算符 |
名称 |
例子 |
结果 |
+ |
加法 |
$x + $y |
$x 与 $y 求和 |
- |
减法 |
$x - $y |
$x 与 $y 的差数 |
* |
乘法 |
$x * $y |
$x 与 $y 的乘积 |
/ |
除法 |
$x / $y |
$x 与 $y 的商数 |
% |
取模 |
$x % $y |
$x 除 $y 的余数 |
<?php
$a=1;
$b=2;
echo ($a+$b);//3
echo ($b-$a);//1
echo ($a*$b);//2
echo ($b/$a);//2
echo ($b%$a);//0
?>
取模运算
取模运算的结果与和被除数的符号(正负)相同。
$a%$b的结果与$a相同。
echo (5 % 3)."\n";
echo (5 % -3)."\n";
echo (-5 % 3)."\n";
echo (-5 % -3)."\n";
fmod()函数
float fmod ( float $x , float $y )
返回除法的浮点数余数。
返回被除数(x)除以除数(y)所得的浮点数余数。
余数(r)的定义是:x = i * y + r,其中 i 是整数。如果 y 是非零值,则 r 和 x 的符号相同并且其数量值小于 y。 其实实质就是x/y的浮点数余数。
<?php
$x = 5;
$y = 2;
echo '我是fmod($x, $y)输出的值:'.fmod($x, $y);
echo "\n";
echo '我是$x % $y输出的值:'.$x % $y;
echo "\n";
$a=5.8;
$b=2.5;
echo '我是fmod($a, $b)输出的值:'.fmod($a, $b);
echo "\n";
echo intval($a);
echo "\n";
echo intval($b);
echo "\n";
echo '我是$a % $b输出的值:'.$a % $b;
?>
%求余的时候,就是先把运算之前的被除数和除数都转换成整数(除去小数部分),之后在进行求余。
涉及到取模运算精度问题解析。
<?php
$n = 1.45;
$result = $n*100;
echo gettype($result);//double
echo "\n";
var_dump($result);//double(145)
echo "\n";
echo intval($n*100);//145
echo "\n";
echo $result%100;//45
echo"\n";
?>
这上面的结果比较正常,但是换个数就会有点惊奇。
<?php
$n = 8.45;
$result = $n*100;
echo gettype($result);
echo "\n";
var_dump($result);
echo "\n";
echo intval($n*100);
echo "\n";
echo $result%100;
echo"\n";
?>
是不是结果有些出乎意料。
这主要是PHP遵循IEEE754双精度,由于取整而导致的最大相对误差为 1.11e-16。非基本数学运算可能会给出更大误差,并且要考虑到进行复合运算时的误差传递。
以十进制能够精确表示的有理数如 0.1 或 0.7,无论有多少尾数都不能被内部所使用的二进制精确表示,因此不能在不丢失一点点精度的情况下转换为二进制的格式。这也就造成了混乱的结果。
<?php
$f= 8.45;
var_dump(intval($f* 100)); //输出844
?>
intval()函数采取的是截断法取整。同时看下图,就清楚了为啥.
echo intval(8.45*100);//844
echo intval(1.45*100);//145
IEEE-754 Floating Point Converter
赋值运算符
PHP 中基础的赋值运算符是 "="。
这意味着右侧赋值表达式会为左侧运算数设置值。
赋值 |
等同于 |
描述 |
x = y |
x = y |
右侧表达式为左侧运算数设置值。 |
x += y |
x = x + y |
加 |
x -= y |
x = x - y |
减 |
x *= y |
x = x * y |
乘 |
x /= y |
x = x / y |
除 |
x %= y |
x = x % y |
模数 |
<?php
$x=17;
echo $x; // 输出 17
$y=17;
$y += 8;
echo $y; // 输出 25
$z=17;
$z -= 8;
echo $z; // 输出 9
$i=17;
$i *= 8;
echo $i; // 输出 136
$j=17;
$j /= 8;
echo $j; // 输出 2.125
$k=17;
$k %= 8;
echo $k; // 输出 1
?>
字符串运算符
运算符 |
名称 |
例子 |
结果 |
. |
串接 |
$txt1 = "Hello" $txt2 = $txt1 . " world!" |
现在 $txt2 包含 "Hello world!" |
.= |
串接赋值 |
$txt1 = "Hello" $txt1 .= " world!" |
现在 $txt1 包含 "Hello world!" |
<?php
$a = "Hello";
$b = $a . " world!";
echo $b; // 输出 Hello world!
$x="Hello";
$x .= " world!";
echo $x; // 输出 Hello world!
?>
递增/递减运算符
运算符 |
名称 |
描述 |
++$x |
前递增 |
$x 加一递增,然后返回 $x |
$x++ |
后递增 |
返回 $x,然后 $x 加一递增 |
--$x |
前递减 |
$x 减一递减,然后返回 $x |
$x-- |
后递减 |
返回 $x,然后 $x 减一递减 |
<?php
$x=17;
echo ++$x; // 输出 18
$y=17;
echo $y++; // 输出 17
$z=17;
echo --$z; // 输出 16
$i=17;
echo $i--; // 输出 17
?>
比较运算符
PHP 比较运算符用于比较两个值(数字或字符串):
运算符 |
名称 |
例子 |
结果 |
== |
等于 |
$x == $y |
如果 $x 等于 $y,则返回 true。 |
=== |
全等(完全相同) |
$x === $y |
如果 $x 等于 $y,且它们类型相同,则返回 true。 |
!= |
不等于 |
$x != $y |
如果 $x 不等于 $y,则返回 true。 |
<> |
不等于 |
$x <> $y |
如果 $x 不等于 $y,则返回 true。 |
!== |
不全等(完全不同) |
$x !== $y |
如果 $x 不等于 $y,或它们类型不相同,则返回 true。 |
> |
大于 |
$x > $y |
如果 $x 大于 $y,则返回 true。 |
< |
小于 |
$x < $y |
如果 $x 小于 $y,则返回 true。 |
>= |
大于或等于 |
$x >= $y |
如果 $x 大于或者等于 $y,则返回 true. |
<= |
小于或等于 |
$x <= $y |
如果 $x 小于或者等于 $y,则返回 true。 |
<?php
$x=17;
$y="17";
var_dump($x == $y);//true
echo "<br>";
var_dump($x === $y);//false
echo "<br>";
var_dump($x != $y);//false
echo "<br>";
var_dump($x !== $y);//true
echo "<br>";
$a=17;
$b=8;
var_dump($a > $b);//true
echo "<br>";
var_dump($a < $b);//false
?>
具体比较可以参照本文的PHP弱类型比较。
逻辑运算符
运算符 |
名称 |
例子 |
结果 |
and |
与 |
$x and $y |
如果 $x 和 $y 都为 true,则返回 true。 |
or |
或 |
$x or $y |
如果 $x 和 $y 至少有一个为 true,则返回 true。 |
xor |
异或 |
$x xor $y |
如果 $x 和 $y 有且仅有一个为 true,则返回 true。 |
&& |
与 |
$x && $y |
如果 $x 和 $y 都为 true,则返回 true。 |
|| |
或 |
$x || $y |
如果 $x 和 $y 至少有一个为 true,则返回 true。 |
! |
非 |
!$x |
如果 $x 不为 true,则返回 true。 |
在PHP中,&&与and都表示逻辑与,||与or都表示逻辑或,并且它们都是短路运算符。但是两者的区别在于其优先级不同。
运算符 and、=、&&的优先级为
&& >=>and
在以下代码中,
第一行代码将会先把TRUE 的值赋值给t1,忽略t2。
第二行代码中,会先进行&& 运算,在将结果FALSE 赋值t2.
<?php
$t1=true and false;//true
$t2=true && false;//false
var_dump($t1,$t2);
?>
运算符 ||,or,=优先级为
||>=>or
在以下代码中,
第一行代码,会先将FALSE赋值给t1,忽略TRUE。
第二行代码中,会先进行||运算,在赋值给t2.
<?php
$t1=false or true;//false
$t2=false || true;//true
var_dump($t1,$t2);
?>
数组运算符
PHP 数组运算符用于比较数组:
运算符 |
名称 |
例子 |
结果 |
+ |
联合 |
$x + $y |
$x 和 $y 的联合(但不覆盖重复的键) |
== |
相等 |
$x == $y |
如果 $x 和 $y 拥有相同的键/值对,则返回 true。 |
=== |
全等 |
$x === $y |
如果 $x 和 $y 拥有相同的键/值对,且顺序相同类型相同,则返回 true。 |
!= |
不相等 |
$x != $y |
如果 $x 不等于 $y,则返回 true。 |
<> |
不相等 |
$x <> $y |
如果 $x 不等于 $y,则返回 true。 |
!== |
不全等 |
$x !== $y |
如果 $x 与 $y 完全不同,则返回 true。 |
<?php
$x = array("a" => "apple", "b" => "banana");
$y = array("c" => "orange", "d" => "peach");
$z = $x + $y; // $x 与 $y 的联合
var_dump($z);
var_dump($x == $y);
var_dump($x === $y);
var_dump($x != $y);
var_dump($x <> $y);
var_dump($x !== $y);
?>