推荐阅读
智能化校园:深入探讨云端管理系统设计与实现(一)
智能化校园:深入探讨云端管理系统设计与实现(二)
文章目录
- 推荐阅读
- PHP语法
- 注释
- 变量
- 输出
- 定界符
- 数据类型
- var_dump() 方法
- PHP弱类型
- 弱类型比较
- 内置函数的参数的松散性
- 常量
- 运算符
- 算术运算符
- 取模运算
- 赋值运算符
- 字符串运算符
- 递增/递减运算符
- 比较运算符
- 逻辑运算符
- 数组运算符
- 顺序语句
- 条件语句
- if语句
- if-else语句
- if....elseif....if语句
- Switch语句
- 循环语句
- while循环语句
- do...while 循环语句
- for循环语句
- foreach语句
- 函数
- 用户定义函数
- 创建函数
- 函数参数
- 函数返回值
- 数组
- 创建数组
- 索引数组
- count() - 函数获得数组的长度
- 遍历索引数组
- 关联数组
- 遍历关联数组
- 数组排序
- sort()-对数组进行升序排序
- rsort()- 对数组进行降序排序
- asort()-根据值对数组进行升序排序
- arsort()- 根据值对数组进行降序排序
- ksort() -根据键对数组进行升序排序
- krsort() -根据键对数组进行降序排序
- 超全局变量
- $GLOBALS — 引用全局作用域中可用的全部变量
- $_SERVER
- $_REQUEST
- $_GET
- $_POST
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']; // 输出 2global $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
0e5093672134182067008420087635140e215962017
这个数加密前后皆以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 a% ab的结果与$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);
?>
顺序语句
所谓顺序结构就是自上而下一条一条执行,为什么是一条一条的,因为存储设备物理上是串行的,存储的指令也是一个一个摆放的。
它的执行顺序自上而下,一次执行。
<?php
$a=1;
$b=0;
$c=$a;
$a=$b;
$b=$c;
echo $a;
echo "\n";
echo $b;
?>
条件语句
条件语句用于基于不同条件执行不同的动作
在 PHP 中,我们可以使用以下条件语句:
- if 语句 - 如果指定条件为真,则执行代码
- if…else 语句 - 如果条件为 true,则执行代码;如果条件为 false,则执行另一端代码
- if…elseif…else 语句 - 根据两个以上的条件执行不同的代码块
- switch 语句 - 选择多个代码块之一来执行
if语句
if 语句用于_在指定条件为 true 时_执行代码。
if (条件) {当条件为 true 时执行的代码;
}
if-else语句
if…else 语句_在条件为 true 时执行代码,在条件为 false 时执行另一段代码_。
if (条件) {条件为 true 时执行的代码;
} else {条件为 false 时执行的代码;
}
if…elseif…if语句
if…elseif…else 语句来_根据两个以上的条件执行不同的代码_。
if (条件) {条件为 true 时执行的代码;
} elseif (condition) {在不符合前者条件的情况下,该条件为 true 时执行的代码;
} else {在前两者条件都不符合的情况下,该条件为 false 时执行的代码;
}
<?php
$t=25;if ($t<10) {echo "你好";
} elseif ($t<20) {echo "你能行";
} else {echo "加油";
}?>
//$t=5 ,输出 你好
//$t=15 ,输出 你能行
//$t=25 ,输出 加油
Switch语句
switch 语句用于基于不同条件执行不同动作。
switch (expression)
{
case label1:expression = label1 时执行的代码 ;break;
case label2:expression = label2 时执行的代码 ;break;
default:表达式的值不等于 label1 及 label2 时执行的代码;
}
工作原理:
- 对表达式(通常是变量)进行一次计算
- 把表达式的值与结构中 case 的值进行比较
- 如果存在匹配,则执行与 case 关联的代码
- 代码执行后,_break 语句_阻止代码跳入下一个 case 中继续执行
- 如果没有 case 为真,则使用 default 语句.
循环语句
在 PHP 中,我们有以下循环语句:
- while - 只要指定条件为真,则循环代码块
- do…while - 先执行一次代码块,然后只要指定条件为真则重复循环
- for - 循环代码块指定次数
- foreach - 遍历数组中的每个元素并循环代码块
while循环语句
while 循环在指定条件为 true 时执行代码块。
while (条件为真) {
要执行的代码;
}
<?php $x=1;
while($x<=5) {echo "这个数字是:$x <br>";$x++;
}
?>
do…while 循环语句
do {
要执行的代码;
} while (条件为真);
<?php
$x=1;
do {echo "这个数字是:$x <br>";$x++;
} while ($x<=5);
?>
do while语句,会在先执行行循环语句内的语句后,再次进行条件判断。
这意味着,该循环不论是否满足条件都会执行一次。
<?php
$x=6;
do {echo "这个数字是:$x <br>";$x++;
} while ($x<=5);
?>
for循环语句
** for 循环执行代码块指定的次数。**
<?php
for($x=0;$x<=10;$x++){
echo "数字是:$x<br>";
}
foreach语句
foreach 循环只适用于数组,并用于遍历数组中的每个键/值对。
foreach ($array as $value) {
code to be executed;
}
每进行一次循环迭代,当前数组元素的值就会被赋值给 $value 变量,并且数组指针会逐一地移动,直到到达最后一个数组元素。
<?php
$colors = array("red","green","blue","yellow"); foreach ($colors as $value) {echo "$value <br>";
}
?>
函数
用户定义函数
- 除了内建的 PHP 函数,我们可以创建我们自己的函数。
- 函数是可以在程序中重复使用的语句块。
- 页面加载时函数不会立即执行。
- 函数只有在被调用时才会执行。
创建函数
function functionName() {
被执行的代码;
}
函数名能够以字母或下划线开头(而非数字)。
函数名对大小写不敏感。
<?php
function say() {echo "nihao";
}say(); // nihao
?>
函数参数
- 可以通过参数向函数传递信息。参数类似变量。
- 参数被定义在函数名之后,括号内部。您可以添加任意多参数,只要用逗号隔开即可。
- 如果设置了默认参数,在没有传入参数时,会自动调用默认值。
function functionName( 参数1,参数2,…) {
被执行的代码;
}
<?php
function say($name) {echo "nihao,".$name;
}say("Alice"); // nihao,Alice
?>
函数返回值
<?php
function sum($x,$y) {$z=$x+$y;return $z;
}echo "5 + 10 = " . sum(5,10) . "<br>";
echo "7 + 13 = " . sum(7,13) . "<br>";
echo "2 + 4 = " . sum(2,4);
?>
数组
数组是特殊的变量,数组能够在单独的变量名中存储一个或多个值。
创建数组
array()函数用于创建数组。
索引数组
<?php
$names=array("Alice","Bob");
echo "you are".$names[0]."he is".$names[1];
?>
count() - 函数获得数组的长度
**count()**函数用于返回数组的长度。
<?php
$names=array("Alice","Bob");
echo cout($names);
?>
遍历索引数组
借助for循环,遍历输出索引数组的所有值。
<?php
$names=array("Alice","Bob");
$length=count($names);
for($i=0;$i<$length;$i++){
echo "name:".$names[$i];
echo "\n";
}
?>
关联数组
关联数组是使用您分配给数组的指定键的数组。
<?php
$names=array("He"=>"BOb","Her"=>"Alice");
echo "He is ".$names['He'];
?>
遍历关联数组
借用foreach循环语句,遍历并输出关联数组的所有值。
<?php
$names=array("He"=>"BOb","Her"=>"Alice");foreach($names as $x=>$x_value){echo "Key=".$x.",Value=".$x_value;echo "\n";}?>
数组排序
数组中的元素能够以字母或数字顺序进行升序或降序排序。
- sort() - 以升序对数组排序
- rsort() - 以降序对数组排序
- asort() - 根据值,以升序对关联数组进行排序
- ksort() - 根据键,以升序对关联数组进行排序
- arsort() - 根据值,以降序对关联数组进行排序
- krsort() - 根据键,以降序对关联数组进行排序
sort()-对数组进行升序排序
按照数字或者字母顺序进行升序
<?php
$names=array("BOb","Alice");
$length=count($names);
echo "排序前";
echo "\n";
for($i=0;$i<$length;$i++){
echo $names[$i];
echo "\n";
}
sort($names);echo "排序后";
echo "\n";
for($i=0;$i<$length;$i++){
echo $names[$i];
echo "\n";
}
?>
rsort()- 对数组进行降序排序
<?php
$names=array("BOb","Alice");
$length=count($names);
echo "排序前";
echo "\n";
for($i=0;$i<$length;$i++){
echo $names[$i];
echo "\n";
}
rsort($names);echo "排序后";
echo "\n";
for($i=0;$i<$length;$i++){
echo $names[$i];
echo "\n";
}
?>
asort()-根据值对数组进行升序排序
<?php
$age=array("Bill"=>"63","Steve"=>"56","Elon"=>"47");
asort($age);foreach($age as $x=>$x_value){echo "Key=" . $x . ", Value=" . $x_value;echo "<br>";}
?>
arsort()- 根据值对数组进行降序排序
ksort() -根据键对数组进行升序排序
<?php
$age=array("Bill"=>"28","Steve"=>"66","Elon"=>"47");
ksort($age);foreach($age as $x=>$x_value){echo "Key=" . $x . ", Value=" . $x_value;echo "\n";}
?>
krsort() -根据键对数组进行降序排序
<?php
$age=array("Bill"=>"28","Steve"=>"66","Elon"=>"47");
krsort($age);foreach($age as $x=>$x_value){echo "Key=" . $x . ", Value=" . $x_value;echo "\n";}
?>
超全局变量
PHP 中的许多预定义变量都是“超全局的”,这意味着它们在一个脚本的全部作用域中都可用。在函数或方法中无需执行 global $variable; 就可以访问它们。
- $GLOBALS
- $_SERVER
- $_REQUEST
- $_POST
- $_GET
- $_FILES
- $_ENV
- $_COOKIE
- $_SESSION
超全局变量在 PHP 4.1.0 中引入,是在全部作用域中始终可用的内置变量。
$GLOBALS — 引用全局作用域中可用的全部变量
$GLOBALS 这种全局变量用于在 PHP 脚本中的任意位置访问全局变量(从函数或方法中均可)。
PHP 在名为 $GLOBALS[index] 的数组中存储了所有全局变量。
变量的名字就是数组的键。
<?php
$x = 30;
$y = 65; function addition() {$GLOBALS['z'] = $GLOBALS['x'] + $GLOBALS['y'];
}addition();
echo $z;
?>// 95
$_SERVER
** S E R V E R 这种超全局变量保存关于报头、路径和脚本位置的信息。 ∗ ∗ < b r / > _SERVER 这种超全局变量保存关于报头、路径和脚本位置的信息。**<br /> SERVER这种超全局变量保存关于报头、路径和脚本位置的信息。∗∗<br/>_SERVER 是一个包含诸如头部(headers)、路径(paths)和脚本位置(script locations)的数组。数组的实体由 web 服务器创建。不能保证所有的服务器都能产生所有的信息;服务器可能忽略了一些信息,或者产生了一些未在下面列出的新的信息。
超级全局变量,在所有作用域中始终可用的内置变量。
在函数或方法中您不需要使用 global $_SERVER; 访问它,就如同使用 $HTTP_SERVER_VARS 一样。
$HTTP_SERVER_VARS 包含着同样的信息,但是不是一个自动全局变量。(注意: $HTTP_SERVER_VARS 和 $_SERVER 是不同的变量,PHP 处理它们的方式不同。)
(在 PHP 4.1.0 及以后版本使用。之前的版本,使用$HTTP_SERVER_VARS。)
$_SERVER['PHP_SELF'] //返回当前执行脚本的文件名。
$_SERVER['SERVER_NAME']
//返回当前运行脚本所在的服务器的主机名(比如 www.w3schools.cn)。
$_SERVER['SCRIPT_FILENAME'] //返回当前执行脚本的绝对路径。
$_SERVER['SCRIPT_URI'] //返回当前页面的 URI。
$_SERVER['SCRIPT_NAME'] //返回当前脚本的路径。
<?php
echo $_SERVER['PHP_SELF'];
echo "<br>";
echo $_SERVER['SERVER_NAME'];
echo "<br>";
echo $_SERVER['HTTP_HOST'];
echo "<br>";
echo $_SERVER['HTTP_REFERER'];
echo "<br>";
echo $_SERVER['HTTP_USER_AGENT'];
echo "<br>";
echo $_SERVER['SCRIPT_NAME'];
?>
PHP 全局变量 - 超全局变量
PHP $_SERVER 全局变量
$_REQUEST
PHP $_REQUEST 用于收集 HTML 表单提交的数据。
<html>
<body>
<form method="post" action="<?php echo $_SERVER['PHP_SELF'];?>">
Name: <input type="text" name="fname">
<input type="submit">
</form><?php
$name = $_REQUEST['fname'];
echo $name;
?></body>
</html>
$_GET
PHP G E T 也可用于收集提交 H T M L 表单 ( m e t h o d = " g e t " ) 之后的表单数据。 ∗ ∗ < b r / > ∗ ∗ _GET 也可用于收集提交 HTML 表单 (method="get") 之后的表单数据。**<br />** GET也可用于收集提交HTML表单(method="get")之后的表单数据。∗∗<br/>∗∗_GET 也可以收集 URL 中的发送的数据。
<html>
<body><a href="test_get.php?subject=PHP&web=W3school.com.cn">测试 $GET</a></body>
</html>
<html>
<body><?php
echo "在 " . $_GET['web'] . " 学习 " . $_GET['subject'];
?></body>
</html>
$_POST
PHP P O S T 广泛用于收集提交 m e t h o d = " p o s t " 的 H T M L 表单后的表单数据。 _POST 广泛用于收集提交 method="post" 的 HTML 表单后的表单数据。 POST广泛用于收集提交method="post"的HTML表单后的表单数据。_POST 也常用于传递变量。
<html>
<body><form method="post" action="<?php echo $_SERVER['PHP_SELF'];?>">
Name: <input type="text" name="fname">
<input type="submit">
</form><?php
$name = $_POST['fname'];
echo $name;
?></body>
</html>