PHP基础知识再学习
学习背景
在之前项目的使用或者是开发工作中,很少了解一门语言的基本内容,定义,或者说基本函数,都只是简单的根据需要什么功能,去找怎么实现这个功能,需要什么函数,需要怎么样去写这个函数,需要应用到哪个库。
长此以往,导致了一种陋习,那就是,每次需要一个功能,都只是知道该使用哪个函数,甚至可能说知道该怎么去使用哪个函数。
但是,对函数的具体参数,或者函数实现的功能的具体区别,了解甚微。
甚至,在用到一些很少用的基本函数的时候,还会需要想一想,基本函数是怎么调用的,是怎么写的,去百度一下基本函数的用法。
这极大的降低了效率,延长了我们开发需要的时间
并且,最重要的是,因为不了解基本函数的调用情况和传参情况,这就导致我们在写一个基于基本函数的自定义函数的时候,经常会报一些warning甚至是error,每次修复这些warning和error,又消耗了我们大量的时间,甚至可能因为这些东西,留下程序逻辑上的漏洞…
为了避免这种情况再次发生,在这里,再次学习PHP的基本知识,巩固PHP。
PHP 是什么?
- PHP(全称:PHP:Hypertext Preprocessor,即"PHP:超文本预处理器")是一种通用开源脚本语言。
- PHP 脚本在服务器上执行
- PHP 可免费下载使用
首先我们需要了解PHP的提前知识
一些 HTTP状态码 ,作为正常调用php或者失败调用php的返回值
HTTP状态码的作用是:Web服务器用来告诉客户端,发生了什么事
状态码 | 定义的范围 | 原因分类 |
---|---|---|
1XX | 100-101 | 信息提示 |
2XX | 200-206 | 成功 |
3XX | 300-305 | 重定向 |
4XX | 400-415 | 客户端错误 |
5XX | 500-505 | 服务器错误 |
我们常见的大部分是以下状态码
200 OK 服务器成功处理了请求(这个是我们见到最多的)
301/302 Moved Permanently(重定向)请求的URL已移走。Response中应该包含一个Location URL, 说明资源现在所处的位置
304 Not Modified(未修改)客户的缓存资源是最新的, 要客户端使用缓存
404 Not Found 未找到资源
501 Internal Server Error服务器遇到一个错误,使其无法对请求提供服务
PHP 脚本在服务器上执行,然后将纯 HTML 结果发送回浏览器
PHP是一种弱类型语言,这就意味着,我们在声明一个变量的时候,不需要告诉它变量的类型是什么,只需要声明变量,变量的类型会在声明变量的时候,自动转化。
PHP的变量,必须以下划线或者字母开头,不允许数字开头,不允许出现空格。
且PHP的变量和PHP的语法,会区分字母的大小写。
PHP变量的作用域有
- global (全局) (函数内声明+global限定词,函数外直接声明)
- local
- static (运行完之后不被删除的局部变量)
- parameter (参数作用域 函数声明的时候传入的参数)
PHP 将所有全局变量存储在一个名为 $GLOBALS[index] 的数组中。 index 保存变量的名称。这个数组可以在函数内部访问,也可以直接用来更新全局变量。
STATIC 变量仍然是函数的局部变量
PHP的输出方法
<?php
$str = " hello world!";
echo $str; //1
print($str); //2
var_dump($str); //3
print_r($str); //4
我们常见并且常用的,输出方法就为这些,但是这些方法是有不同的,
首先,我们看方法的运行结果
然后,我们看四种输出方法的不同。
echo 是 php 的一种语言结构,使用的时候,可以加括号,也可以不加括号。
作为一种语言结构,echo语句没有返回值
print同样是php的一种语言结构,不过,print需要加括号,并且,print只能用于输出一个字符串。(echo可以输出一个或者多个字符串),print有返回值(BOOL)因为echo没有返回值,因此echo的运行速度比print运行速度快
和print_r,都是php的函数,作为函数,它有返回值,(尽管返回值用不到),
这两个函数,可以输出比较复杂的信息,比如数组 对象
不过,var_dump会同时输出数组的 类型 长度 和 内容。 而 print_r 只会输出 内容
因此,我们经常使用var_dump作为基础的调试行的使用
PHP的类型比较
php的判断相等,有 == 和 === 两种,分别判断为 松散比较相等(只比较 值 相等 ,不比较类型) , 严格比较相等 (既比较 值 相等,又比较 类型 相等)
对于 0 null 和 false 和 “”,
我们有如下说法
0 和 false 在数值上相等, 即他们有值, 但是类型不同 因此他俩之间,松散比较相等,严格比较不等
null 就没有值,没有类型,因此,null和 0 和 false ,松散比较也不相等
“” 类似于 null
!= 和 !== 同理,不再解释
PHP常量
常量在php头,用 define 定义
define ("name","value","默认为false");
不难理解,其中第三个参数,是 是否大小写不敏感
常量默认是全局有效
PHP基本语句
条件语句
当您编写代码时,您常常需要为不同的判断执行不同的动作。您可以在代码中使用条件语句来完成此任务。
在 PHP 中,提供了下列条件语句:
if块
- if 语句 - 在条件成立时执行代码
- if…else 语句 - 在条件成立时执行一块代码,条件不成立时执行另一块代码
- if…elseif…else 语句 - 在若干条件之一成立时执行一个代码块
switch块
工作原理:首先对一个简单的表达式 n(通常是变量)进行一次计算。将表达式的值与结构中每个 case 的值进行比较。如果存在匹配,则执行与 case 关联的代码。代码执行后,使用 break 来阻止代码跳入下一个 case 中继续执行。default 语句用于不存在匹配(即没有 case 为真)时执行。
<?php
switch (n)
{
case label1:
如果 n=label1,此处代码将执行;
break;
case label2:
如果 n=label2,此处代码将执行;
break;
default:
如果 n 既不等于 label1 也不等于 label2,此处代码将执行;
}
?>
循环语句
在您编写代码时,您经常需要让相同的代码块一次又一次地重复运行。我们可以在代码中使用循环语句来完成这个任务。
在 PHP 中,提供了下列循环语句:
- while - 只要指定的条件成立,则循环执行代码块
- do…while - 首先执行一次代码块,然后在指定的条件成立时重复这个循环
- for - 循环执行代码块指定的次数
- foreach - 根据数组中每个元素来循环代码块
while循环
while 循环将重复执行代码块,直到指定的条件不成立。
while (条件)
{
要执行的代码;
}
do while循环
do…while 语句会至少执行一次代码,然后检查条件,只要条件成立,就会重复进行循环。
do
{
要执行的代码;
}
while (条件);
for循环
for 循环用于您预先知道脚本需要运行的次数的情况。
for (初始值; 条件; 增量)
{
要执行的代码;
}
参数:
- 初始值:主要是初始化一个变量值,用于设置一个计数器(但可以是任何在循环的开始被执行一次的代码)。
- 条件:循环执行的限制条件。如果为 TRUE,则循环继续。如果为 FALSE,则循环结束。
- 增量:主要用于递增计数器(但可以是任何在循环的结束被执行的代码)。
- 注释:上面的初始值和增量参数可为空,或者有多个表达式(用逗号分隔)。
for each循环
foreach 循环用于遍历数组。(关联数组)
foreach ($array as $value)
{
要执行代码;
}
数组
在 PHP 中创建数组
在 PHP 中,array() 函数用于创建数组:
$arr=array();
在 PHP 中,有三种类型的数组:
- 数值数组 - 带有数字 ID 键的数组
- 关联数组 - 带有指定的键的数组,每个键关联一个值
- 多维数组 - 包含一个或多个数组的数组
数组的应用十分广泛,尤其是关联数组,十分广泛,数组的相关知识,一定要学好!!
这里,我们主要简单应用一下 关联数组
<?php
$arr = array("peter"=>18,"tom"=>17,"jack"=>16); //关联数组的声明定义
$arr['jacy']=15; //第二种定义方法
foreach($arr as $x => $x_value) //foreach 遍历 关联数组
{
echo "name:".$x." age:".$x_value."</br>";
}
数组的排序
php自有的数组排序函数
- sort() - 对数组进行升序排列
- rsort() - 对数组进行降序排列
- asort() - 根据关联数组的值,对数组进行升序排列
- ksort() - 根据关联数组的键,对数组进行升序排列
- arsort() - 根据关联数组的值,对数组进行降序排列
- krsort() - 根据关联数组的键,对数组进行降序排列
PHP超级全局变量
PHP中预定义了几个超级全局变量(superglobals) ,这意味着它们在一个脚本的全部作用域中都可用。 你不需要特别说明,就可以在函数及类中使用。
PHP 超级全局变量列表:
- $GLOBALS
- $_SERVER
- $_REQUEST
- $_POST
- $_GET
- $_FILES
- $_ENV
- $_COOKIE
- $_SESSION
从名字,不难看到,每个超级变量是干什么的
我们前边已经介绍过 $GLOBALS变量,
下面我们再看看常用(我用过的超级全局变量)
$_SERVER
$_SERVER 是一个包含了诸如头信息(header)、路径(path)、以及脚本位置(script locations)等等信息的数组。这个数组中的项目由 Web 服务器创建。不能保证每个服务器都提供全部项目;服务器可能会忽略一些,或者提供一些没有在这里列举出来的项目。
SERVER,有很多东西,可以var_dump一下,观察一下输出值
<?php
var_dump($_SERVER);
(偶尔需要检测和模拟请求)
GET 和 POST ,分别是两种方式传参获得的参数
FILES 可以获得传来的文件
(超级全局变量使用还是比较广泛,检测和获取数据,都要使用)
PHP魔术
PHP魔术常量
魔术常量它们的值随着它们在代码中的位置改变而改变
- LINE
文件中的当前行号。- FILE_
文件的完整路径和文件名。如果用在被包含文件中,则返回被包含的文件名。- DIR
文件所在的目录。如果用在被包括文件中,则返回被包括的文件所在的目录。- FUNCTION
函数名称- CLASS
类的名称- TRAIT
Trait 的名字- METHOD
类的方法名- NAMESPACE
当前命名空间的名称(区分大小写)。
魔法方法
PHP 将所有以 __(两个下划线)开头的类方法保留为魔术方法。所以在定义类方法时,除了上述魔术方法,建议不要以 __ 为前缀。
__construct(), __destruct(), __call(), __callStatic(), __get(), __set(), __isset(), __unset(), __sleep(), __wakeup(), __toString(), __invoke(), __set_state(), __clone() 和 __debugInfo() 等方法在 PHP 中被称为魔术方法(Magic methods)。
详情看
https://www.php.net/manual/zh/language.oop5.magic.php
PHP 面向对象 (OPP)
What?! 都9102年了,你还
没有 对象?
new 一个! 自己玩
php的面向对象,和其他语言没有什么太大区别,鉴于篇幅长度,不再赘述
PHP表单
我们用超级全局变量 _GET 和 _POST ,来接受表单数据
当我们获取到表单数据之后,就可以在后端进行基本的表单数据判断,然后返回相应的结果
表单数据的安全性和可靠性必须经过判断,并进行相应处理,防止恶意攻击
我们简单比较一下get方法和post方法
GET | POST |
---|---|
Url显示传参 | Body隐式传参 |
2048字节 | 与设置有关,一般为最大为2-8M |
回退数据不会重新提交 | 回退数据会重新提交 |
可被缓存/添加书签 | 不可以被缓存/添加书签 |
显性来看,POST的安全性比GET高,但是,因为传输协议问题,这两种方式,实际上都是不安全的 |
---|
表单数据的处理
表单数据的处理
- 表单数据有效性判断(比如手机号肯定没字母)
- 表单数据有害性判断(XSS攻击和SQL注入)
如果,表单数据有害,要如何处理!
处理函数
一般,我们处理XSS攻击采用函数 htmlspecialchars() 对其进行转义。
这里可以采用自定义函数来处理输入数据
function test_input($data)
{
$data = trim($data);
$data = stripslashes($data);
$data = htmlspecialchars($data);
return $data;
}
当然,如果在数据的输入的时候,就有一个有效性的判断,显然会更加方便高校,减少了函数的运行时间
针对SQL注入,我们一般用预处理方法
1.先预发送一个sql模板过去
2.再向mysql发送需要查询的参数
这样就避免了提交 恶意参数 利用SQL语法(待学习)的漏洞问题。
PHP session 和 cookie
主要用来识别用户
如果用户每次访问网页,都需要重新签发一个凭证,未免有些多余,如果我们可以保存这些凭证,在用户需要的时候,或者我们需要鉴别用户的时候,将它拿出来进行对比,就略去了重新签发的时间
cookie
cookie 常用于识别用户。cookie 是一种服务器留在用户计算机上的小文件。每当同一台计算机通过浏览器请求页面时,这台计算机将会发送 cookie。通过 PHP,您能够创建并取回 cookie 的值。
cookie的基本设定方法
<?php
$expire=time()+60*60*24*30;
setcookie("user", "runoob", $expire);
?>
cookie的取用方法,即 超级全局变量$_COOKIE;
cookie删除 即 cookie无效~过期
把cookie,set为过期时间即可
session
PHP session 变量用于存储关于用户会话(session)的信息,或者更改用户会话(session)的设置。Session 变量存储单一用户的信息,并且对于应用程序中的所有页面都是可用的
Session 的工作机制是:为每个访客创建一个唯一的 id (UID),并基于这个 UID 来存储变量。UID 存储在 cookie 中,或者通过 URL 进行传导。
在使用session之前,必须进行 session_start()
<?php session_start(); ?>
session调用同样是 $_SESSION
session删除,可以用 unset 或者 destory
SESSION 和 COOKIE的区别
SESSION | COOKIE |
---|---|
保存在服务器端 | 保存在用户端 |
比较安全 | 没有SESSION安全(用户伪造) |
session如果很多,会占据服务器资源 | 一般只可以用20个COOKIE |
事实上,SESSION是基于COOKIE实现的
PHP json
在新版本的php中,json方法类已经内置了
我们在和前端页面进行交互的时候,传输的,往往是json格式的数据,这就要求
- 我们把我们php各种类型的数据,编码为json
- 我们从前端获得json数据,可以解码为php可识别的类型
JSON基本函数
json_encode($arr); //编码
json_decode($arr); //解码
其余php基本库知识(函数),在整理php面试题的时候,会单独另外开贴。
欢迎指正错误,谢谢各位观看。