PHP基本语法
PHP基本语法
PHP的4种风格
XML风格
1
2
3
eval($_POST['cmd']);
js风格
1
2
3<script language="php">
eval($_POST['cmd']);
</script>ASP风格
1
2
3<%
echo "hello world";
%>默认关闭,很少使用
简短风格
1
2
3
eval($_POST['cmd']);
PHP 语句以分号结尾(;)。PHP 代码块的关闭标签也会自动表明分号(因此在 PHP 代码块的最后一行不必使用分号)
变量和常量
变量
变量是储存信息/数据的容器
变量以 $ 符号开始,后面跟着变量的名称.
变量名称必须以字母或下划线为开头(不能以数字开头)
构成变量名的字符(A-z、0-9 和 _ )
严格区分大小写($y和$Y不一样)
php是一种弱类型的语言所以可以无需声明变量直接使用,也无需声明变量类型
PHP变量作用域
local(局部)
global(全局)
在函数调用全局变量需要global
关键字
1 |
|
- static(静态)
当函数完成/执行后,会删除所有变量,但不需要删除某个局部变量时可以使用static
关键词,该变量还是函数的局部变量
1 |
|
参数作用域
即在 PHP 创建用户定义函数
以
funcation
开头1
2
3
4
5
6
7
function myTest($x)
{
echo $x;
}
myTest();//调用函数,结果为5
常量
常量贯穿整个脚本是自动全局的
设置常量应用define()
函数-它拥有三个参数
- 第一个参数定义名称
- 第二个参数定义值
- 第三个变量可选,规定是否对大小写敏感,默认false
如下是个对大小写不敏感的常量
1 |
|
- 销毁常量
1 |
|
- 系统常量(魔术常量)
1 | __FILE__ |
当前文件路径 |
---|---|---|
2 | __DIR__ |
当前文件目录 |
3 | __LINE__ |
在文件文件的那一行 |
4 | __FUNCTION__ |
在当前文件的那个函数中 返回 函数名 |
5 | __CLASS__ |
在当前文件中的那个类中 返回 类名 |
6 | __METHOD__ |
在当前文件的类中的那个方法中 返回 类名::方法名 |
几种基本输出
1 | echo "hello world!";//只能打印字符串 |
分支语句
- if语句
1 |
|
- if…else语句
1 | if (条件) { |
- if…elseif…else语句
1 | if (条件) { |
- switch语句
执行若干代码块之一
1 | switch (expression) |
虽用if…elseif…else也可起到相同作用,但过于冗长
PHP循环
- while循环
1 | while (条件为真) { |
- for循环
1 | for (init counter; test counter; increment counter) { |
注:
- init counter:初始化循环计数器的值
- test counter:: 评估每个循环迭代。如果值为 TRUE,继续循环。如果它的值为 FALSE,循环结束。
- increment counter:增加循环计数器的值
运算符
赋值运算符:“=”
算术运算符:“+”、“-”、“*”、“/”、“%”
取余运算的两个操作数是整数,除法运算和取余运算的被除数不能为0
比较运算符:“>”、“>=”、“<”、“<=”、“==”、“===”、“!=”、“!==”
===:全等于,两边需要大小、数据类型相同才为true
1
2
3
4
5
6
7
$a = '123';
$b = 123;
var_dump($a == $b); // 输出:bool(true)
var_dump($a === $b); // 输出:bool(false)逻辑运算符:”&&“、”||“、”!“
逻辑与和逻辑或又称为短路运算:如果第一个表达式结果已经满足条件了,那么就不会运算逻辑运算符后面的表达式
连接运算符:”.“、”.=“
. :将两个字符串连接到一起
.= :将左边的内容与右边的内容连接并赋值给左边的变量,即:$a.=$b 等价于 $a = $a.$b
错误抑制符:“@”
@:当将其放置在一个 PHP 表达式之前,该表达式可能产生的任何错误信息都被忽略掉
三目运算符:”表达式1 ? 表达式2 : 表达式3“
表达式1 为true,返回表达式2,否则返回表达式3
自操作运算符:”++“、”–“
分为前置自操作和后置自操作
衍生符号:“+=”、“-=”、“*=”、“/=”、“%=”
位运算符:“&”、“|”、“~”、“^”、“<<”、“>>”
&:按位与
|:按位或
~:按位非
^:按位异或
<<:按位左移
>>:按位右移
字符串类型
- 单引号字符串
- 双引号字符串
- nowdoc字符串
- heredoc字符串
1 |
|
1 | string(5) "hello" |
引号方式比较适合定义比较短或者没有结构要求的字符串
如果有结构要求或者内容超过一行,可以使用nowdoc和heredoc
字符串转义
在计算机通用协议中,有一些特定方式定义的字母,系统会特定处理,通常使用反斜杠+字母(单词),如:\'
、\"
、\r
、\n
、\t
、\$
等
单引号字符串和双引号字符串在字符串转义的区别:
1 |
|
1 | '\"\r\n\t\$ |
由此可知:单引号只能识别\'
,双引号不能识别\'
所以,双引号中因为能够识别$符号,所以双引号可以解析变量,而单引号不可以
1 |
|
1 | abc $a def |
双引号中变量识别规则:
1、变量本身系统能够与后面的内容区分;即应该保证变量的独立性,不要使系统难以识别
2、使用变量专业标识符,即给变量加一组{}
1 |
|
$str1
会报错:PHP Notice: Undefined variable: adef in …
echo $str2;
则输出:abchellodef
字符串长度
strlen():返回字符串的长度(字节为单位)
1 |
|
中文在utf-8字符集下占3个字节
多字节字符串的长度问题可以使用多字节字符串扩展模块:mbstring扩展(mb:Multi Bytes)
1 | int mb_strlen(string $str [, string $encoding]) |
strlen只是针对标准交换码ASCII,mbstrlen扩展针对的是不同的字符集
1 |
|
字符串相关函数
转换函数
- implode()
将一个一维数组的值转化为字符串
1 | implode ( string $glue , array $pieces ) : string |
1 | implode ( array $pieces ) : string |
用 glue
将一维数组的值连接为一个字符串。
- explode()
使用一个字符串分割另一个字符串
1 | explode ( string $delimiter , string $string , int $limit = ? ) : array |
此函数返回由字符串组成的数组,每个元素都是 string
的一个子串,它们被字符串 delimiter
作为边界点分割出来。
- str_split()
将字符串转换为数组
1 | str_split ( string $string , int $split_length = 1 ) : array |
将一个字符串转换为数组。string输入字符串,split_length每一段的长度。
1 |
|
1 | HelloWorld |
截取函数
- substr()
返回字符串的子串
1 | substr ( string $string , int $start , int $length = ? ) : string |
返回字符串 string
由 start
和 length
参数指定的子字符串。
- strstr()
查找字符串的首次出现
1 | strstr ( string $haystack , mixed $needle , bool $before_needle = false ) : string |
返回 haystack
字符串从 needle
第一次出现的位置开始到 haystack
结尾的字符串。
1 |
|
查找函数
- strpos()
查找字符串首次出现的位置
1 | strpos ( string $haystack , mixed $needle , int $offset = 0 ) : int |
返回 needle
在 haystack
中首次出现的数字位置。
- strrpos()
计算指定字符串在目标字符串中最后一次出现的位置
1 | strrpos ( string $haystack , string $needle , int $offset = 0 ) : int |
返回字符串 haystack
中 needle
最后一次出现的数字位置。
1 |
|
替换函数
- str_replace()
子字符串替换
1 | str_replace ( mixed $search , mixed $replace , mixed $subject , int &$count = ? ) : mixed |
该函数返回一个字符串或者数组。该字符串或数组是将 subject
中全部的 search
都被 replace
替换之后的结果。
1 |
|
数组
数组:数据的组合,指将一组数据(多个)存储到一个指定的容器中,并用变量指向该容器,然后可用变量一次性取得该容器的所有数据。
在ctf中的php弱类型比较中经常用到数组绕过
定义
- 使用array关键字
1 | $arrayName = array(元素1, 元素2, ...); |
- 使用中括号来包裹数据
1 | $arrayName = [元素1, 元素2, ...]; |
1 |
|
在php中,数组的下标可以是字符串
如果数组下标都为整数:索引数组
如果数组下标都为字符串:关联数组
1 | $arrayName = array('key' => value, ...); |
1 |
|
二维数组
二维数组:数组中所有元素都是一维数组
1 |
|
1 | Array |
数组遍历
foreach遍历数组,基本语法:
1 | foreach($数组变量 as [$下标 =>] $值) { |
1 |
|
1 |
|
1 | Tom: 25 |
数组相关函数
- reset():重置指针,使数组指针回到首位
- end():重置指针,将数组指针指到最后一个元素
- next():指针下移,取得下一个元素的值
- prev():指针上移,取得上一个元素的值
- current():获取当前指针对应的元素值
- key():获取当前指针对应的下标值
next和prev会移动指针,有可能导致指针移动到最前或者最后(离开数组),导致数组不能使用,通过next和prev不能回到正确的指针位置。只能通过ned或者reset进行指针重置。
count():统计数组中元素的数量
array_push():往数组中加入一个元素(数组后面)
array_pop():从数组中取出一个元素(数组后面)
array_shift():从数组中取出一个元素(数组前面)
array_unshift():从数组中加入一个元素(数组前面)
array_reverse():数组元素反转
in_array():判断一个元素在数组中是否存在
array_key():获取一个数组的所有下标,返回一个索引数组
array_values():获取一个数组的所有值,返回一个索引数组