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():获取一个数组的所有值,返回一个索引数组