php基本语法复习
php
一种创建动态交互性站点的强有力的服务端脚本语言
环境:phpstudy搭建而成
- 在phpstudy下的WWW下的文件夹下编写php程序
- 保存到WWW的下一级目录下
- 可以使用回环地址加上php文件名运行程序
- 例如:127.0.0.1/文件名.php
什么是php文件
- php文件可以包含文本、HTML、CSS、以及PHP代码
- php代码在服务器上执行,而结果以纯文本的形式返回浏览器
- 文件名后缀为.php
php能够做什么
语法知识
php脚本可以放在文档中的任何位置
开头结尾
- php脚本以’ <?php ‘开头
- 以’ ?> ‘结尾
内建php输出文本函数
- echo
<!DOCTYPE html> <html> <body> <h1>我的第一张 PHP 页面</h1> <?php echo "Hello World!"; ?> </body> </html>
php语句以分号结尾(;)
- php代码块的关闭标签也会自动表明分号,因此在php代码的最后一行不必使用分号
注释
- php的注释和c++的注释符号一样
// # /* 此处为注释 */
php对大小写敏感性问题
<!DOCTYPE html>
<html>
<body>
<?php
ECHO "Hello World!<br>";
echo "Hello World!<br>";
EcHo "Hello World!<br>";
?>
</body>
</html>
- 以上的三种方法等价
- 所有用户定义的****函数,类和关键词都对大小写不敏感,例如if else echo等等
- 在php中所有变量都对大小写敏感,试运行以下代码
<!DOCTYPE html> <html> <body> <?php $color="red"; echo "My car is " . $color . "<br>"; echo "My house is " . $COLOR . "<br>"; echo "My boat is " . $coLOR . "<br>"; ?> </body> </html>
变量
变量的命名规则
- 变量以$符号开头,其后是变量的名称
- 变量名称必须以字母或者下划线开头
- 变量名称不能以数字开头
- 变量名称只能包含字母数字下划线
- 变量名称对大小写敏感
变量的创建
- php没有创建变量的命令
- 变量会在首次赋值时被创建
- 如果为变量赋值为文本,用引号包围该值
变量的引用
- 变量的引用也需要加‘$’
- 取数组中的某一个元素加大括号{数组[index]}
PHP 是一门类型松散的语言
- php在创建变量的时候不必告知php变量的数据类型
php变量作用域
- 可以在任意位置对变量进行声明
- 三个作用域:local global static
local和global
- global是全局作用域,可以在函数外访问
- local是局部作用域,只能在函数内部进行访问
- 在函数外部定义的是global
- 函数内部定义的是local
- global关键词,用于在函数内部访问全局变量,要做到这一点,要在函数内部变量前面使用global关键词,(这一点和python不同,python中global是将局部变量转换为全局变量,而php中是在函数内部调用全局变量),如果删除global,将不能在函数内部调用全局变量
- php同时在名为 $GLOBALS[index]的数组中存储了所有的全局变量,下标存有变量名,用 \ $GLOBALS[index]即可访问到名为index的全局变量
static关键词
- 通常,在函数完成或执行后,会删除所有变量,不过有时我需要不删除某个局部变量
- 使用static关键词
<?php function myTest() { static $x=0; echo $x; $x++; } myTest(); myTest(); myTest(); ?>
- 每当函数被调用时,这个变量所存储的信息都是函数最后一次被调用时包含的信息(不会重新赋值)
- 但是这个变量仍然是局部变量
echo和print
差异
- echo能够输出一个以上的字符串
- print只能输出一个字符串,始终返回值为1
- echo比print稍快,因为他不返回任何值
- 有无括号都可使用(**print和print()**)
<?php $txt1="Learn PHP"; $txt2="W3School.com.cn"; $cars=array("Volvo","BMW","SAAB"); print $txt1; print "<br>"; print "Study PHP at $txt2"; print "My car is a {$cars[0]}"; ?>
- 取数组中的某一个元素需要加大括号,大括号内部是数组名[index]
字符串
- 字符串是字符序列
- 单双括号等价
数据类型
var_dump()函数
- 返回变量的数据类型和值
- 值自动转化为十进制的值
php对象
- 对象是存储数据和有关如何处理数据的信息的数据类型
- php中必须明确地声明对象
- 首先必须声明对象的类,使用class关键词,类是包含属性和方法的结构
- 在对象类中定义数据类型,然后在该类的实例中使用此数据类型
NULL值
- 表示变量无量
- NULL是NULL唯一可能的值
- NULL值表示变量是否为空,用于区分字符串与空值数据库
字符串函数
strlen()
- 返回字符串的长度
<?php echo strlen("hello world"); ?>
字符串中单词个数的统计
- str_word_count()
<?php echo str_word_count("hello world"); ?>
strrev()
- 用于反转字符串
<?php echo strrev("hello world"); //输出dlrow olleh ?>
strpos()
- 用于检索字符串内指定的字符或文本
- 如果找到匹配,则会返回首个匹配的字符位置,如果未找到,则会返回false
- strpos(“原字符串”,“待检索字符串”);
<?php echo strpos("hello world","world"); //输出为6,下标从0开始(很特殊的是sql中的substr); ?>
str_replace()
- 用一些字符串替换字符串中的另一些字符
<?php echo str_replace("被替换字符","替换字符",“原string”); echo str_replace("world","kitty","hello world"); //结果为hello kitty ?>
常量
常量是单个值的标识符,脚本中无法改变该值
有效的常量名以字符或下划线开头,(常量名称前面没有$符号)
设置php变量
- define()函数,一共三个参数
- 首个参数定义常量的名称
- 第二个参数定义常量的值
- 第三个参数规定常量名对大小写是否敏感,默认为false
<?php define("GREETING","Welcome"); echo GTEETING; //创建了一个对大小写不敏感的GREETING常量,值为Welcome; ?>
常量是全局的,而且可以贯穿整个脚本使用
<?php
define("GREETING","Welcome");
function mytest() {
echo GREETING;
}
?>
- 在函数内使用了一个常量,即使它在函数外定义
运算符
+ - * / %
- $x + $y
- $x - $y
- $x * $y
- $x / $y
- $x % $y
<?php $x=17; $y=8; echo ($x+$y); ?>
赋值运算符
- 用于向变量写值
- 基础赋值运算符为=
- 右赋给左
字符串运算符
.
- . 表示串接,$txt1=”hello” $txt2=$txt1.”world”;//$txt2为hello world
- .= 串接赋值,$txt1=”hello” $txt1.=”world”;//$txt1为hello world (类似于+=)
递增递减
- ++$x
- –$x
- $x++
- $x–
逻辑运算符
- and
- or 至少有一个就返回true
- xor 有且仅有一个为true,则返回true
- &&
- ||
- !
数组运算符
- 联合
- == 相等
- === 全等
- !=
- <>
- !==
if else
if elseif else
if (条件) {
语句;
}
if elseif else
<?php
if(){
}
elseif(){
}
else{
}
?>
switch
- 有选择地执行若干代码
switch(expression){ case label1: expression = label1时执行的代码; break; case label2: expression = label2时执行的代码; break; default: 表达式的值不等于label1和label2时执行的代码 }
- 如果没有case为真,才使用default
while循环
- while只要条件为真,循环执行
- do while先执行一次代码块,然后只要指定条件为真,则重复循环(先做一次do,再判断while),即至少会执行一次语句,即使条件测试在第一次就失败了
for循环
- 提前确定了脚本运行的次数,用for循环
for(init counter;test counter;increment counter){ code to be executed; }
- 第一个参数是初始化循环计数器的值
- 第二个参数是判断每个循环迭代,true继续,false结束
- 第三个参数是增加循环计数器的值
<?php for($x=0;$x<=10;$x++){ echo "xxx"; } ?>
执行顺序
- 定义(1)
- 判断(2)
- 执行循环体语句
- 改变循环变量(3)
foreach
- foreach循环只用于数组,用于遍历数组中的每个键值对
foreach($array as $value){ 执行代码 }
- 每一次循环迭代,当前数组的值就会赋给$value变量,并且数组指针会逐一移动,直到到达最后一个数组元素
<?php $color = array("red","green","blue"); foreach($color as $value){ //类似于c++中的范围遍历,将$color数组中的每一个元素作为value echo "value"; } ?>
函数
php真正的力量,来自于它的函数,php拥有超过1000个内建的函数
用户定义函数
- 以单词function开头
function functionname(){ 被执行的代码; }
- 函数名对大小写不敏感
php函数参数
- 通过参数向函数传递信息,参数类似于变量
- 逗号隔开参数
<?php function family($name){ echo "$name"; } ?>
默认参数值
- 如果调用没有参数的函数,参数会取默认值
- 默认参数值只会发生在函数的调用过程中
<?php function setheight($min=60){ echo "height is $min"; } setheight(); //无参数,使用默认值60 setheight(100); //有参数,不适用默认值,使用传入的100 ?>
php函数返回值
- 使用返回值,用return
- 当函数内部使用形参时,想要往外输出参数,则需要return,因为形参不是全局变量、
数组
数组能够在单独的变量名中存储一个或多个值
<?php
$cars=array("a","b","c");
echo "I like" . $cars[0] . "," . $cars[1] . "," . cars[2] . ".";
?>
定义方法
索引数组
索引是自动分配的
- 索引自动分配,从0开始
$cars=array('a','b','c'); 等价于 $cars[0] = 'a'; $cars[1] = 'b'; $cars[2] = 'c';
获取数组的长度
- count()函数,即返回元素个数
<?php $cars=array("a","b","c"); echo count($cars); //运行结果即为3 ?>
遍历索引函数
- 可以使用for循环遍历并输出索引数组的所有值
<?php $cars=array('a','b','c'); $arrlength=count($cars); for($x=0;$x < $arrlength;$x++){ echo $cars[x]; echo "<br>"; } ?>
关联数组
- 关联数组是使用分配给数组的指定键的数组
$age=array("bill" => "35","steve" => "36","elon" => "37"); 等价于 $age["bill"]="35"; $age["steve"]="36"; $age["elon"]="37";
- 语法:array(“键”=>”值”,”键”=>”值”);
遍历关联数组
- 使用foreach循环,遍历并输出关联数组的所有值
foreach($age as $x=>$x_value){ echo "key=".$x.",value=".$x_value; echo "<br>"; }
数组排序
sort()
- 以升序对数组排序
<?php $cars=array('a','b','c'); sort($cars); ?>
rsort()
- 按照ascii码降序对数组进行排序,reverse的sort();
<?php $cars=array('a','b','c'); rsort($cars); ?>
asort()
- 根据值对数组进行升序排序
- 排序对象是关联数组,排序的根据是键值对的值"63","Steve"=>"56","Elon"=>"47"); asort($age); ?>
ksort()
- 根据键对关联数组进行排序
- 排序对象是关联数组,排序的根据是键值对的键
<?php $age=array("Bill"=>"63","Steve"=>"56","Elon"=>"47"); ksort($age); ?>
arsort()
- 根据值对关联数组进行降序排序
krsort()
- 根据键对关联数组进行降序排序
超全局变量
定义
- php中许多预定义变量都是超全局的,这意味着他们在一个脚本的全部作用域中都可用,无需执行global
$GLOBALS $_SERVER $_REQUEST $_POST $_GET $_FILES $_ENV $_COOKIE $_SESSION
$GLOBALS
- 用于在PHP脚本中的任意位置访问全局变量
- PHP在名为$GLOBALS[index]的数组中存储了所有全局变量,变量的名字就是数组的键(逐一这个地方是数组的名字,是去掉$的数组名字再加上单引号括起来)
<?php $x=1; $y=2; function addition() { $GLOBALS['$z'] = $GLOBALS['$x'] + $GLOBALS['$y']; } addition(); echo $z; ?>
$_server
- $_server这种超全局变量保存关于报头,路径和脚本位置的信息
<?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']; ?>
- $_server中访问的最重要的元素
- 重要的
$_server['REQUEST_METHOD'];返回访问页面使用的请求方法,例如post和get $_server['SERVER_ADDR'];返回当前脚本所在的服务器的IP地址 $_server['PHP_SELF'];返回当前执行脚本的文件名 $_server['SERVER_NAME'];返回当前运行脚本所在的服务器的主机名
$_REQUEST
- 用于收集HTML表单提交的数据
- 下面是一个包含输入字段和提交按钮的表单,当用户通过点击提交按钮来提交表单数据时,表单将发送到
- 在这个例子中,我们指定文件本身来处理表单数据。如果您需要使用其他的 PHP 文件来处理表单数据,请修改为您选择的文件名即可。然后,我们可以使用超级全局变量 $_REQUEST 来收集 input 字段的值:
<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>
$_post
- 广泛用于收集method=”post”的HTML表单后的表单数据
<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>
$_get
- 用于提交HTML表单(method=”get”)之后的表单数据
- $GET 也可以收集URL中发送的数据
注意
- 上面的$_POST和$_GET都是变量,类似于$GLOBAL,存储了脚本中的所有POST或者GET方法传入的参数
- 使用方法和$GLOBAL类似
echo $_GET["name"]; echo $_POST["age"];
区别
- $_GET是通过URL参数传递到当前脚本的变量数组
- $_POST是通过HTTP POST传递到当前脚本的变量数组
何时使用
- GET 方法从表单发送的信息对任何人都是可见的(所有变量名和值都显示在 URL 中)。GET 对所发送信息的数量也有限制。GET 可用于发送非敏感的数据。
- GET可以看见注入点(发送的信息的变量名)
- POST 方法从表单发送的信息对其他人是不可见的(所有名称/值会被嵌入 HTTP 请求的主体中)并且对所发送信息的数量也无限制。
PHP文件处理
readfile()
- readfile()函数读取文件,并把它写入输出缓冲
- 假设我们有一个名为 “webdictionary.txt” 的文本文件,存放在服务器上,就像这样:
AJAX = Asynchronous JavaScript and XML CSS = Cascading Style Sheets HTML = Hyper Text Markup Language PHP = PHP Hypertext Preprocessor SQL = Structured Query Language SVG = Scalable Vector Graphics XML = EXtensible Markup Language
- 读取此文件并且写到输出流的PHP代码如下:读取成功则readfile()函数返回字节数
<?php echo readfile(webdictionary.txt); ?>
fopen()
- 提供比readfile()更多的选项
- fopen的第一个参数包含被打开的文件名,第二个参数规定打开文件的模式
<?php $myfile=fopen("webdictionary.txt","r") or die("unable to open file"); fclose($myfile); ?>
文件打开的模式
- 带+的读写都有
- r读
- w重写
- a追加写
- x执行
fread()
- fread()读取打开的文件
- fread()的第一个参数包含待读取文件的文件名,第二个参数规定待读取的最大字节数
fclose()
- fclose()函数用于关闭打开的文件
- 用完文件后把它们全部关闭是一个良好的编程习惯。您并不想打开的文件占用您的服务器资源。
- fclose需要待关闭的文件的名称,或者存有文件名的变量
fgets()
- fgets()函数用于从文件中读取单行
- 调用fgets()函数之后,文件指针会移动到下一行
feof()
- feof()函数检查是否已经到达end of file
- feof()对于遍历未知长度的数据很有用
<?php $myfile=fopen("a.txt","r") or die("unable to open file"); while(!feof($myfile)){ echo fgets($myfile).<br>; } fclose($myfile); ?>
fgetc()
- fgetc()函数用于从文件中读取单个字符
<?php fopen("a.txt","r") or die("unable"); while(!feof($myfile)){ echo fgetc($myfile); } fclose($myfile); ?>
fopen()
- fopen()函数用于创建文件
- 在php中,创建文件所用的函数和打开文件的相同
- 如果fopen()没有遍历到文件,就会创建一个文件
$myfile=fopen("a.txt","w");
fwrite()
- fwrite()函数用于写入文件
- fwrite()的第一个参数包含要写入的文件的文件名,第二个参数是被写的字符串
<?php $myfile=fopen("newfile.txt","w") or die("unable"); $txt="a"; fwrite($myfile,$txt);//写a $txt="b"; fwrite($myfile,$txt);//写b fclose($myfile); ?>
PHP文件上传
创建一个文件上传表单
<form action="upload_file.php" method="post" enctype='multipart/form-data'>
- <\form>标签的enctype属性规定了在提交表单时要使用哪种内容类型,在表单需要使用二进制数据时,比如文件内容,请使用”multipart/form-data”
- <\input>标签的type=”file”属性规定了应该把输入作为文件来处理,举例来说,当在浏览器中预览时,会看到输入框旁边有一个浏览按钮。
创建上传脚本
- upload_file.php文件含有供文件上传的代码
- 通过使用PHP的全局数组$_FILE,可以从客户端计算机向远程服务器上传文件
$_FILES
- 第一个参数是input name
- 第二个下标可以是name type size tmp_name error
$_FILES["file"]["name"] 被上传文件的名称 $_FILES["file"]["type"] 被上传的文件类型 $_FILES["file"]["size"] 被上传的文件大小,以字节计算 $_FILES["file"]["tmp_name"] 存储在服务器的文件的临时副本名称 $_FILES["file"]["error"] 由文件上传导致的错误代码
- 总之$_FILES超全局变量的作用就是用来上传文件的
设置上传限制
- 只能上传gif或者jpeg文件
if((($_FILES['file']['type'] == 'image/gif') || $_FILES['file']['type'] == 'image/jpeg' || $_FILES['file']['type'] == 'image/pjpeg')) && ($_FILES['file']['size'] < 20000>)) { if($_FILES['file']['error'] > 0) // 这个地方如果为error则错误代码>0 { echo "ERROR" . $_FILES['file']['error'] . "<br />" } else{ echo "UPLOAD-name" . $_FILES["file"]["name"] . <br /> echo "Type" . $_FILES["file"]["type"] . <br /> echo "Size" . $_FILES['file']['size'] . "byte" . <br /> } }
保存被上传的文件
- 上面的例子在服务器的PHP临时文件夹中创建了一个临时副本
- 这个临时副本会在脚本结束时消失,要保存被上传的文件,我们需要把它拷贝到另外的位置
if(file_exists("upload/" . $_FILES["file"]["name"])){ echo $_FILES["file"]["name"] . "already exists."; } else{ move_uploaded_file($_FILES["file"]["tmp_name"],"upload/" . $_FILES["file"]["name"]); echo "stored in:" . "upload/" . $_FILES["file"]["name"]; }
- 上面的脚本检测了是否已经存在了此文件,如果不存在,则把文件拷贝到指定的文件夹
- file_exists() 检测在指定目录下是否有文件名的文件存在
- move_uploaded_file() 移动文件
cookie
什么是cookie
- cookie常用于识别用户,cookie是服务器留在用户计算机中的小文件,每当相同的计算机通过浏览器请求页面时,它同时会发送cookie.通过php,您能够创建并取回cookie的值
- 注意一定是服务器留在用户计算机中的,服务器->用户计算机
创建cookie
- setcookie()函数用来设置cookie
- setcookie()函数必须位于<\html>标签之前
setcookie(name,value,expire,path,domain)
- 创建用户名为user的cookie,将它赋值为alex port,规定在一小时后过期
<?php setcookie("user","alex port",time()+3600); ?>
- 在发送cookie时,cookie的值会自动进行URL编码,在取回时自动解码
- 为了防止URL编码,使用setrawcookie()函数取代,set 设置,raw 生的,没有改变进行URL编码的cookie
取回cookie的值
- $_COOKIE超全局变量用于取回cookie的值
- 取回名为user的cookie值,并且显示
echo $_COOKIE['user'];
- 使用isset()函数来确认是否已经设置了cookie
<?php if(isset($_COOKIE["user"])) echo "welcome" . $_COOKIE['user'] . <br /> else echo "welcome guest" . <br /> ?>
删除cookie
- 当删除cookie时,应该使用过期日期变更为过去的时间点
- 如果过期日期在过去的时间点,则认为过去已经过期
<?php setcookie("user","",time()-3600);//默认为cookie的名称为user,值为空,时间在过去一个小时的时候已经过期 ?>
php错误处理
方式
- 在php中,默认的错误处理很简单,一条消息会被发送到浏览器,这条消息带有文件名,行号,以及一条错误的信息
php错误处理
- 在创建脚本和web应用程序时,错误处理是一个重要的部分。
基本的错误处理:使用die()函数
- die()函数的错误处理机制,在错误之后终止了脚本
过滤器
概念
- PHP过滤器用于验证和过滤来自非安全来源的数据
- 验证和过滤用户输入或自定义是任何web应用程序的重要组成部分
为什么使用过滤器
- 几乎所有的web应用程序都依赖外部的输入,这些数据通常都来自用户或其它应用程序
- 使用过滤器,能确保所有应用程序都获得正确的输入类型
什么是外部数据?
来自表单的输入数据
Cookies
服务器变量
数据库查询结果
函数和过滤器
- 如果需要过滤变量,使用以下的过滤器函数之一
filter_var() 通过一个指定的过滤器来过滤单一的变量 filter_var_array() 通过相同的或不同的过滤器来过滤多个变量 filter_input() 获取一个输入变量,并对它进行过滤 filter_input_array() 获取多个输入变量,并通过相同的或不同的过滤器对他们进行过滤
- https://www.w3school.com.cn/php/php_ref_filter.asp php-filter函数
PHP表单
PHP表单处理
<html>
<body>
<form action='welcome.php' method='post'>
Name: <input type='text' name='name'><br>
E-mail: <input type='text' name='email'><br>
<input type='submit'>
</body>
</html>
- 用户填写此表单并点击提交按钮后,表单数据会发送到名为welcome.php的文件供处理,表单数据是通过HTTP POST的方式发送的
- 如需显示出被提交的数据,您可以简单地输出(echo)所有变量。”welcome.php” 文件是这样的:
<html> <body> welcome <?php echo $_POST["name"];?><br> your email address is: <?php echo $_POST["email"]?><br> </body> </html>
表单验证
文本字段
Name: <input type="text" name='name'>
E-mail: <input type="text" name='email'>
website: <input type='text' name='website'>
单选按钮
- gender字段是单选按钮,其中,radio的type类型是单选框
gender: <input type='radio' name='gender' value='female'> female <input type='radio' name='gender' value='male'> male
表单元素
<form method='post' action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
- 当提交此表单时,通过method=’post’发送表单数据
$_SERVER[“PHP_SELF”]
- $_SERVER[“PHP_SELF”]是一种超全局变量,它返回当前执行脚本的文件名
- 因此,$_SERVER[“PHP_SELF”]将表单数据发送到页面本身,而不是跳转到另一张页面,这样用户就能在表单页面获得错误提示信息
表单验证
验证名字
- 检查name字段是否包含字母和空格,如果name字段无效,则存储一条错误信息
$name=test_input($_POST["name"]); if(!preg_match("/^[a-zA-Z]*$/",name)){ $emailErr='无效的email格式'; }
- preg_match()函数检索字符串的模式,如果模式存在则返回true,否则返回false
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 h3110w0r1d's Blog!