智能化校园:深入探讨云端管理系统设计与实现(一)
智能化校园:深入探讨云端管理系统设计与实现(二)
PHP 脚本以 结束
还有一些其他的格式,不过建议使用规范。
php文件默认扩展名“.php”
PHP语句是以分号结尾的(;),php代码块的关闭标签也会自动表明分号(即PHP代码块的最后一行不必使用分号。)
注释作用是提供代码编辑者阅读,帮助理解代码。
// 这是 PHP 单行注释
# 这也是单行注释
/* */ 这是PHP多行注释
变量可以视为存储数据的容器。
PHP变量规则
PHP 没有声明变量的命令。
变量在第一次赋值给它的时候被创建:
$num=123;
$a="hello";
如果赋值为文本,要使用引号。
在PHP中,所有用户定义的函数名,方法名,类名和关键词(if ,else,echo)对大小写不敏感。
这些语句等价。
但是在PHP变量中,所有变量名,常量名都对大小写敏感。
只会输出第一个语句。$num和$Num 为两个不同的变量。
PHP单引号和双引号的用法
$a="ad";或者$b='a';合法
$c='afa";这个为非法字符。
在定义字符串时,只有最开始的字符串被分析器解析,若是双引号被解析,那么在双引号里可以包含任何其他字符。
$d="sad'af'faef";这个为合法字符串。
如果中间出现了双引号,那么就会被重新解析,如果要表示出双引号,可以加入转义字符“\(反斜线)”
"I do "this"things"这个正常解析为三段
转义输出双引号为,"I do\"this\"things"
并置运算符(.)用于将两个字符串值连接起来。
$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语句就会出错。
PHP 变量作用域
在所有函数外部定义的变量,拥有全局作用域。除了函数外,全局变量可以被脚本中的任何部分访问,要在一个函数中访问一个全局变量,需要使用 global 关键字,或者使用 $GLOBALS[index] 数组。
因此可以在不同函数中创建相同的局部变量名,但是局部变量只能在其中被创建它的函数识别。
测试函数内部的变量:";
echo "变量 x 是:$x";
echo "
";
echo "变量 y 是:$y";
}
myTest();
echo "测试函数之外的变量:
";
echo "变量 x 是:$x";
echo "
";
echo "变量 y 是:$y";
?>
在 PHP 函数内部声明的变量是局部变量,仅能在函数内部访问。
//
外部输出结果:
内部输出结果:15
global 关键字用于函数内访问全局变量。在函数内调用函数外定义的全局变量,我们需要在函数中的变量前加上 global 关键字。
//输出两个2
当一个函数完成时,它的所有变量通常都会被删除。然而,有时候您希望某个局部变量不要被删除。要做到这一点,请在您第一次声明变量时使用 static 关键字,这样之后每一次调用该函数时,该变量将会保留函数前一次被调用时的值。
参数是通过调用代码将值传递给函数的局部变量。
关于局部变量和全局变量的优先级,因为在PHP中函数都有自己单独的作用域,所以在局部变量的优先级要大于全局变量(在你不声明这个变量之前),声明之后此变量就变成了局部变量如果修改值那么全局变量的值也会改变。
//结果都是10;
echo 和 print 区别:
echo /echo()
print /print()
echo "hello";
print "hello";
EOF(heredoc)
html格式会被解析
双引号和Html格式外的其他内容都不会被解析
"双引号外所有被排列好的格式都会被保留"
"但是双引号内会保留转义符的转义效果,比如table:\t和换行:\n下一行"
EOF;
echo $a;
?>
php 数据类型
var_dump() 方法,判断一个变量的类型与长度,并输出变量的数值,如果变量有值,则输出是变量的值,并返回数据类型。显示关于一个或多个表达式的结构信息,包括表达式的类型与值。数组将递归展开值,通过缩进显示其结构。
弱类型的语言对变量的数据类型没有限制,你可以在任何地时候将变量赋值给任意的其他类型的变量,同时变量也可以转换成任意地其他类型的数据。
$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()函数,设置三个参数
//欢迎
运算符 | 名称 | 例子 | 结果 |
---|---|---|---|
+ | 加法 | $x + $y | $x 与 $y 求和 |
- | 减法 | $x - $y | $x 与 $y 的差数 |
* | 乘法 | $x * $y | $x 与 $y 的乘积 |
/ | 除法 | $x / $y | $x 与 $y 的商数 |
% | 取模 | $x % $y | $x 除 $y 的余数 |
取模运算的结果与和被除数的符号(正负)相同。
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遵循IEEE754双精度,由于取整而导致的最大相对误差为 1.11e-16。非基本数学运算可能会给出更大误差,并且要考虑到进行复合运算时的误差传递。
以十进制能够精确表示的有理数如 0.1 或 0.7,无论有多少尾数都不能被内部所使用的二进制精确表示,因此不能在不丢失一点点精度的情况下转换为二进制的格式。这也就造成了混乱的结果。
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 | 模数 |
运算符 | 名称 | 例子 | 结果 |
---|---|---|---|
. | 串接 | $txt1 = “Hello” $txt2 = $txt1 . " world!" | 现在 $txt2 包含 “Hello world!” |
.= | 串接赋值 | $txt1 = “Hello” $txt1 .= " world!" | 现在 $txt1 包含 “Hello world!” |
运算符 | 名称 | 描述 |
---|---|---|
++$x | 前递增 | $x 加一递增,然后返回 $x |
$x++ | 后递增 | 返回 $x,然后 $x 加一递增 |
–$x | 前递减 | $x 减一递减,然后返回 $x |
$x– | 后递减 | 返回 $x,然后 $x 减一递减 |
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。 |
";
var_dump($x === $y);//false
echo "
";
var_dump($x != $y);//false
echo "
";
var_dump($x !== $y);//true
echo "
";
$a=17;
$b=8;
var_dump($a > $b);//true
echo "
";
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.
运算符 ||,or,=优先级为
||>=>or
在以下代码中,
第一行代码,会先将FALSE赋值给t1,忽略TRUE。
第二行代码中,会先进行||运算,在赋值给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。 |
"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 中,我们可以使用以下条件语句:
if 语句用于_在指定条件为 true 时_执行代码。
if (条件) {
当条件为 true 时执行的代码;
}
if…else 语句_在条件为 true 时执行代码,在条件为 false 时执行另一段代码_。
if (条件) {
条件为 true 时执行的代码;
} else {
条件为 false 时执行的代码;
}
if…elseif…else 语句来_根据两个以上的条件执行不同的代码_。
if (条件) {
条件为 true 时执行的代码;
} elseif (condition) {
在不符合前者条件的情况下,该条件为 true 时执行的代码;
} else {
在前两者条件都不符合的情况下,该条件为 false 时执行的代码;
}
//$t=5 ,输出 你好
//$t=15 ,输出 你能行
//$t=25 ,输出 加油
switch 语句用于基于不同条件执行不同动作。
switch (expression)
{
case label1:
expression = label1 时执行的代码 ;
break;
case label2:
expression = label2 时执行的代码 ;
break;
default:
表达式的值不等于 label1 及 label2 时执行的代码;
}
工作原理:
在 PHP 中,我们有以下循环语句:
while 循环在指定条件为 true 时执行代码块。
while (条件为真) {
要执行的代码;
}
";
$x++;
}
?>
do {
要执行的代码;
} while (条件为真);
";
$x++;
} while ($x<=5);
?>
do while语句,会在先执行行循环语句内的语句后,再次进行条件判断。
这意味着,该循环不论是否满足条件都会执行一次。
";
$x++;
} while ($x<=5);
?>
";
}
foreach 循环只适用于数组,并用于遍历数组中的每个键/值对。
foreach ($array as $value) {
code to be executed;
}
每进行一次循环迭代,当前数组元素的值就会被赋值给 $value 变量,并且数组指针会逐一地移动,直到到达最后一个数组元素。
";
}
?>
function functionName() {
被执行的代码;
}
函数名能够以字母或下划线开头(而非数字)。
函数名对大小写不敏感。
function functionName( 参数1,参数2,…) {
被执行的代码;
}
";
echo "7 + 13 = " . sum(7,13) . "
";
echo "2 + 4 = " . sum(2,4);
?>
数组是特殊的变量,数组能够在单独的变量名中存储一个或多个值。
array()函数用于创建数组。
**count()**函数用于返回数组的长度。
借助for循环,遍历输出索引数组的所有值。
关联数组是使用您分配给数组的指定键的数组。
"BOb","Her"=>"Alice");
echo "He is ".$names['He'];
?>
借用foreach循环语句,遍历并输出关联数组的所有值。
"BOb","Her"=>"Alice");
foreach($names as $x=>$x_value){
echo "Key=".$x.",Value=".$x_value;
echo "\n";
}
?>
数组中的元素能够以字母或数字顺序进行升序或降序排序。
按照数字或者字母顺序进行升序
"63","Steve"=>"56","Elon"=>"47");
asort($age);
foreach($age as $x=>$x_value)
{
echo "Key=" . $x . ", Value=" . $x_value;
echo "
";
}
?>
"28","Steve"=>"66","Elon"=>"47");
ksort($age);
foreach($age as $x=>$x_value)
{
echo "Key=" . $x . ", Value=" . $x_value;
echo "\n";
}
?>
"28","Steve"=>"66","Elon"=>"47");
krsort($age);
foreach($age as $x=>$x_value)
{
echo "Key=" . $x . ", Value=" . $x_value;
echo "\n";
}
?>
PHP 中的许多预定义变量都是“超全局的”,这意味着它们在一个脚本的全部作用域中都可用。在函数或方法中无需执行 global $variable; 就可以访问它们。
超全局变量在 PHP 4.1.0 中引入,是在全部作用域中始终可用的内置变量。
$GLOBALS 这种全局变量用于在 PHP 脚本中的任意位置访问全局变量(从函数或方法中均可)。
PHP 在名为 $GLOBALS[index] 的数组中存储了所有全局变量。
变量的名字就是数组的键。
// 95
** S E R V E R 这种超全局变量保存关于报头、路径和脚本位置的信息。 ∗ ∗ < b r / > _SERVER 这种超全局变量保存关于报头、路径和脚本位置的信息。**
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'] //返回当前脚本的路径。
";
echo $_SERVER['SERVER_NAME'];
echo "
";
echo $_SERVER['HTTP_HOST'];
echo "
";
echo $_SERVER['HTTP_REFERER'];
echo "
";
echo $_SERVER['HTTP_USER_AGENT'];
echo "
";
echo $_SERVER['SCRIPT_NAME'];
?>
PHP 全局变量 - 超全局变量
PHP $_SERVER 全局变量
PHP $_REQUEST 用于收集 HTML 表单提交的数据。
PHP G E T 也可用于收集提交 H T M L 表单 ( m e t h o d = " g e t " ) 之后的表单数据。 ∗ ∗ < b r / > ∗ ∗ _GET 也可用于收集提交 HTML 表单 (method="get") 之后的表单数据。**
** GET也可用于收集提交HTML表单(method="get")之后的表单数据。∗∗<br/>∗∗_GET 也可以收集 URL 中的发送的数据。
测试 $GET
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 也常用于传递变量。