PHP笔记

引言

本文系作者学习PHP时的部分笔记,内容主要来源于《PHP+MySQL网站开发从零开始学》一书。此书介绍PHP7与MySQL5.6的相关内容,其中PHP部分含金量较高,MySQL则主要介绍DDL(数据定义语音),笔者认为难度略大,最好先从DML开始学习。以下是PHP基本语法、PHP与用户交互、正则表达式的笔记,语言尽量简洁,方便将来查阅。

PHP基本语法

引用

与c++相同

PHP变量的类型由上下文决定

可变变量:

一个变量的变量名可以动态设置和使用

例:

<?php
$a = "hello";
$$a = "world";
echo $a; //输出hello
echo $$a; //输出world
echo $hello; //输出world
?>

常量声明

A.define(‘常量名’,常量值)

B.const 常量名=常量值

defined(常量名)

检测常量是否存在,若存在则返回true

内置常量

__FILE__程序文件名(包括目录)

__DIR__程序目录

__LINE__当前PHP程序的行数

TRUE,FALSE布尔值

PHP-VERSION php版本号

PHP-OS 操作系统名称

Echo false不输出内容

进制

八进制:数字前加0

十六进制:数字前加0x

十进制: 直接写数字

Gettype(变量名)

获取变量类型

Intval(变量名或算式)

强制类型转换为int型

相当于(int)变量名或算式

字符串

双引号定义的字符串中的变量会被解析

双引号中的特殊字符会被转义解析,如 \n \r \e \t……

\x[0-9A-Fa-f]{1,2} 以十六进制方式表达的字符

\[0-7]{1,3} 以八进制方式表达的字符

heredoc和nowdoc

Heredoc:对变量解析,对特殊字符转义

<<<EOT

大段字符

EOT;

Nowdoc:不对变量解析,不对特殊字符转义

<<<’EOT’

大段字符

EOT;

注:EOT为标识符,符合变量命名规则

一个数值可以通过strval(数值)转换为字符串

与(string)数字 效果相同

资源

资源保存了对外部资源的引用,通过专门函数来建立和使用

例:$handle = fopen(“C:\\folder……”,”r”)

NULL

A.被赋值为null

B.未被赋值

C.被unset()

类型转换

A.自动转换

(类型)值

例:(int) 1.1

B.强制转换

例:settype(变量名,’int’)

算数运算符

与C++基本相同

.= 将左边的字符串连接右边字符串,然后赋给左边字符串

<>或!=不等号

==类型转换后相等

===类型和值都相等

!=类型转换后不等

!==数值或类型不等

注意:慎用==和!=,因为会自动转换,引发意想不到的麻烦

逻辑运算符

||比OR优先级高

&&比AND优先级高

XOR逻辑异或

错误控制运算符@

@加在表达式前,屏蔽错误信息

NULL合并运算符??

变量存在且值不为NULL则返回值,否则返回第二个操作符

相当于: isset(变量) ?第一个操作符: 第二个操作符

太空船操作符<=>

$a < $b 返回-1

$a = $b 返回0

$a > $b 返回1

函数

Function 函数名(传入参数){

……

Return 返回值;

}

其余与C++相同

PHP不支持函数重载

通过引用&传递参数

与C++相同

函数参数默认值

与C++相同,有默认值的参数必须放在最后

函数参数可以指定类型

Class 、interface 对象或接口

Array 数组

Callable 回调函数

Bool 、int、string、float标量类型

调用函数时参数不会强制类型转换,不符合则返回异常

用…设置传入任意多个参数

例:

Function myfunction(…$vars){
}
myfunction( …[I,2,3]);
myfunction(1,'test',1.0,false);
myfunction(…array(1,2,3));

也可以指定可变数量参数的类型,或用引用&传递参数

例:

Function myfunction(int …$vars){
}
myfunction(1,2,3,4);
Function myfunction(int …$vars){
}

静态变量

Static变量的值可以一直保持

通过数组可以返回多个值

通常借助list函数

例:

Function myfunction(){
….
Return [$a,$b];
}
List($a,$b)=myfunction();

返回值类型声明

例:

Function myfunction(): int {
…
}

可变函数

将函数名赋值给变量

使用时在变量名后加(参数)

例:

$a = myfunction(){}

$a();

典型用法:将函数名放入数组中,用foreach依次执行

匿名函数(闭包函数)

临时创建一个没有名称的函数

例:

$myfunction = function($message){
echo "myfunction:".$message;
}
$myfunction('hello') //输出myfunction:hello

PHP与用户交互

表单处理

get:将数据直接添加到表单的action URL之后,两者之间用?分隔,参数间用&分隔

例:html表单

<form>
请输入手机号:
<input type="text" name="cellphone" />
<input type="submit" name="提交" />
</form>
<form name="form1" action="form1.php" method="get">

返回 action=’http://my.server.com/test.php?cellphone=13912341234&name=test'

post:浏览器与action中的URL连接,用HTTP协议传输给PHP程序

对比:

安全性上post好于get

执行效率上get高于post

post传输数据量大,默认不受限制。

参数被解析为数组形式,存放在全局变量$_GET,$_POST,$_REQUEST中

表单元素及处理

文本框:

附:常见密码框也是文本框,其input的值设为password

例如:

文本区域textarea可看作多行文本框,与文本框功能相同

例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<textarea name='description'> </textarea>

<form>
<!--这是HTML的注释语法-->
<p> First name:<input type="text" name="fname" /></p>
<p> Last name:<input type="text" name="lname" /></p>
<p><input type='submit' /></p>
<!--添加一个提交按钮-->
</form>
<?php
//用isset判断$_GET是否有fname
if(isset($_GET['fname'])){
//打印出表单提交的fname
echo "First name : ${_GET['fname']} <br/>\n;
}
if(isset($_GET['lname'])){
echo "First name : ${_GET['lname']} <br/>\n;
}

单选按钮(radio):

1
2
3
4
5
6
7
8
9
10
<form>
<input type="radio" name="radiobutton" value="同意" />同意<br/>
<input type="radio" name="radiobutton" value="不同意" />不同意<br/>
<input type="radio" name="radiobutton" value="无法判断" />无法判断<br/>
<input type='submit'>
</form>
<?php
if(isset($_GET['radiobutton'])){
echo "你的选择是 ${_GET[radiobutton]} <br/>\n;
?>

radiobutton是单项选择所以只能有一个结果

复选框(CheckBox):

1
2
3
4
5
6
7
8
9
10
11
12
13
<form>
<h3>你喜欢的交通方式:</h3>
<input type="checkbox" name="checkbox[]" value="plane" />飞机 <br/>
<input type="checkbox" name="checkbox[]" value="train" />火车 <br/>
<input type="checkbox" name="checkbox[]" value="bus" />汽车 <br/>
<input type="checkbox" name="checkbox[]" value="ship" />船 <br/>
<input tpye="submit">
</form>
<?php
if(isset($_GET['checkbox'])){
var dump($_GET['checkbox']);
}
?>

PHP解析器会自动将checkbox[]参数解析为数组,否则会出现参数值覆盖问题

下拉列表:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<form>
<h3>酒店级别</h3>
<select name="hotelclass" >
<option selected >不限</option>
<option>五星级 </option>
<option>四星级 </option>
<option>三星级 </option>
<option>二星以下 </option>
</select>
<input type= 'submit'>
</form>
<?php
if(isset($_GET['hotelclass'])){
echo ("你的选择是:");
var dump($_GET['hotelclass']);
}
?>

如果需要多选,只要将name属性后面加上[]即可

按钮:

重置按钮:

由浏览器直接处理,不会提交数据到服务器

提交按钮:

1
<input type ="submit" value="提交" />

PHP解析器将表单分别放到全局变量$_GET,$_POST,$_REQUEST中,方便进一步处理

cookie存放在客户端可由用户修改,session由服务器的PHP控制

创建cookie:

语法:setcookie(name,value,expire,path,domain,secure);

//setcookie(cookie名字,值,失效时间,服务器上的有效路径,域名,是否使用HTTPS协议传输)

例:

1
2
3
4
5
6
7
8
<?php
setcookie("user","Chole",time()+7200,'''',"yourdomain.com",1);//将使用HTTPS传输,0表示普通传输
?>
<html>
<body>

</body>
</html>

注意:setcookie()必须在标签前,否则会出错!

读取cookie:

用$_COOKIE变量取回cookie值

1
2
3
4
<?php
echo $_COOKIE["user"]; //只输出一个cookie值
print_r($_COOKIE);//输出cookie的所有值
?>

确认cookie存在:

用isset()确认是否已设置Cookie

1
2
3
4
<?php
if(isset($_COOKIE["user"])){
echo $_COOKIE["user"]."你好!<br/>";
?>

删除cookie:

设置cookie有效时间为过期即可

1
2
3
4
<?php
//将过期时间设为半小时前
setcookie("user", "", time()-1800);
?>

Session

创建session:

使用session_start()函数

例:

1
2
3
4
5
6
<?php session_start(); ?>
<html>
<body>

</body>
<html>

注意:session_start()必须在之前,因为会设置一个Cookie

存储Session:

全局变量$_SESSION,在一个页面赋值,在另一个页面调用就可以实现变量在页面之间的传递

例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//每刷新一次浏览次数加一
<?php session_start();
if(isset($_SESSION['views'])){ //判断session是否存在
$_SESSION['views']++;
}
else{
$_SESSION['views']=1;
}
?>
<html>
<body>
<?php
echo "浏览次数=" .$_SESSION['views'];
?>
</body>
<html>

终结session:

unset()函数释放指定的session变量

1
2
3
<?php
unset($_SESSION['views']);
?>

session_destroy彻底终结session,所有已存储的session数据都会被重置

1
2
3
<?php
session_destroy();
?>

正则表达式

函数:

int preg_match(string $pattern,string $subject)搜索与pattern匹配的一个字符串,搜索到返回1,否则返回0

string preg_replace(mixed $pattern,mixed $replacement,mixed $subject)搜索跟正则表达式pattern匹配的一个字符串,并用新的字符串替代所有这个表达式出现的地方

array preg_split(string $pattern ,string $subject)搜索匹配的字符串,以字符串集合方式返回匹配结果

实例:

电子邮件地址检查:

1
2
3
4
5
6
7
8
9
10
11
    preg_match("/^([0-9a-zA-Z\\-_\\.]+)@([0-9a-z]+\\.[a-z]{2,3}(\\.[a-z]{2}?)$/i",$email);

匹配所有正整数:^\[0-9\]{1,}$;

匹配所有整数:^\\-{0,1}\[0-9\]{1,}$;

匹配所有小数:^\\-{0,1}\[0-9\]\\.{0,1}\[0-9\]{0,}$;

url合法性:^(http:\\/\\/)?\[a-zA-Z0-9\]+(\\.\[a-zA-Z0-9\]+)*.

电话号码合法性:+86 010xxxxxxxx ^(\\+86\[\[:space:\]\]010\[0-9\]{8}$

符号

元字符:

^:匹配指定字符串的开头

$:匹配指定字符串的结尾

.:匹配除\n以外的任何单一字符

[]:只匹配方括号内的单一字符,可用-连接匹配范围的首尾

|:或操作符,在两项或多项之间选择一个匹配,如“b(a|e|oo)s”可以匹配boos(因为oo是两个字符,所以这里不用方括号,用圆括号)

\:用来转义一个字符,对元字符、制表符、空格等使用,如\$,\\

():标记一个子表达式的开始和结束

*:匹配前面的子表达式零次或多次

+:匹配前面的子表达式一次或多次

?:匹配前面的子表达式零次或一次

注意:*、+、?只对紧挨它的前面那个字符起作用

转义字符:

\n:匹配一个换行符

\r:匹配一个回车键

\s:匹配任何空白字符,包括空格、制表符、换页符等,等价于[\f\n\r\t\v]

\S:匹配任何非空白字符,等价于[^\f\n\r\t\v]

\t:匹配一个制表符

\v:匹配一个垂直制表符

\f:匹配一个换页符

\cx:匹配由x指明的控制字符。例如:\cM匹配一个Control-M或回车符。x的值必须是A-Z或a-z之一,否则将c视为一个原义‘c’字符,即字符c本身

修正符:

i:忽略大小写

m:除了匹配^和$还分别匹配换行符\n的之后和之前

s:圆点字符(.)匹配所有字符,包括换行符\n

x:除了转义或在字符类中的空白字符全部忽略

e:preg_replace()在替换字符串中对逆向引用做正常替换,将其作为PHP代码求值,并用其结果替换被搜索的字符串

A:强制仅从字符串开头开始匹配

D:行结束($)仅匹配目标字符串的结尾。没有此项时,最后一个字符串是换行符也会被匹配

S:当一个模式将被匹配多次时,为加速匹配而先对其进行分析

U:使?的默认匹配成为贪婪状态的

X:任何\后面没有特殊意义的字母导致一个错误,从而保留此组合以备将来扩充

u:模式字符串被当成utf-8