web后端语言:PHP

web后端语言:PHP

一、开发环境准备
学习工具:trae + phpstudy
PHPStudy 是⼀个集成的 PHP 开发环境⼯具包,主要⽤于 Windows 平台,它简化了 PHP 开发环境的搭
建过程,特别适合初学者和快速开发需求。
主要特点
简单易⽤:图形化界⾯操作,降低开发环境配置难度
轻量快速:相⽐同类产品占⽤资源更少
多版本切换:可⾃由切换不同 PHP 版本
安全防护:内置防⽕墙和安全检测功能
扩展丰富:⽀持常⻅ PHP 扩展⼀键安装

1、安装学习工具
trae中安装php debug和PHPInteliSense后,
2、配置修改php执行路径:
在php debug和PHPInteliSense的扩展设置的json设置php执行路径
3、具体路径可以在phpstudy打开文件设置里选择一个版本的php

二:客户端与服务器交互
前端:HTML、CSS、JS 渲染网页的内容,在用户浏览器端,渲染和决定了网站网页的内容
后端:php 网站和核心业务逻辑都是由后端完成,运行在服务器端,定义了网站各项业务功能
PHP作为网站后端语言,主要处理的是处理网站中的业务逻辑部分
1、验证用户身份权限信息,处理登录,权限逻辑
2、接收用户上传的文件,表单信息,处理文件保存等逻辑
3、连接数据库,实现增删改查将数据结果返回给前端
4、处理用户前端请求,并将处理结果返回给前端
PHP核心特点:
服务器端运行,php代码只在服务器端运行
脚本语言,无需编译,php引擎直接解析执行,开发效率高
web后端:处理网站后端的业务逻辑
跨平台:可以在不同平台上运行 windows linux MACOS
兼容性强:与所有正在被使用的web服务器兼容:apache web nginx
数据库支持:提供了广泛的数据库支持
易学,并可高效运行

二、php基本语法
文件名以.php结尾,代码必须在标签中
代码语句以英文分号;结束。
注释: //当行注释 /多行注释/ 快捷键:ctrl + /
php代码通常也可以包含HTML标签

1、 打印输出helloword:

<?php
    // 这个是第一个php代码:helloworld
    echo 'hello world';
?>

2、 变量:存储信息的容器盒子,这个信息可以是接收的数据也可以是字符串等等
变量声明必须以$符号开头。
变量名必须以字⺟或者下划线字符开始,不能以数字开始
变量名只能包含字⺟、数字以及下划线(A-z、0-9 和 _ )
变量名不能包含空格
变量名是区分⼤⼩写的($y和$Y是两个不同的变量)
常⽤变量场景:$upload_dir (⽂件保存⽬录)、 $file_name (⽂件名)、 $file_path (⽂件完整路径)。
字符串拼接:英文符号“.”来拼接字符串
语法:$变量名=值

<?php
    // 定义一个变量
    $message="欢迎学习php";
    // echo $message;
    $name="张三";
    echo $name.","."你好".",".$message;
?>

3、数组:存储一连串同类型的信息,
数组是⼀种数据结构,数组可以在单个变量中存储多个值,可以根据索引访问其中的值。
创建数组:array() 函数或者"[ ]"用于创建数组
语法:$数组名=[元素值1,元素值2,元素值3,...],通过索引或者下角标取数组里的值
索引或者下角标是从0开始的。

<?php
    // 定义一个数组
    $names=array("张三","李四","王五");
    // 输出数组
    echo $names[0];
    echo $names[1];
    echo $names[2];
    $student=["张三","李四","王五"];
    // 利用索引获取数组里的值
    echo $student[0];
 ?>

4、流程控制语句
php代码:从上向下,从左向右执行
条件语句:根据不同的情况执行不同的代码
不同业务场景决定了不同的业务功能,不同的业务功能执行不同的语句
if语句:仅当条件判断成立时执行的代码
在一个if语句存在多个条件里,可能判断多次,但是只会执行一次条件成立的代码

if (判断条件){
      条件成立执行的代码;
}else{
      条件不成立执行的代码;
}
<?php
    // 判断语句
    $score=50;
    if ($score>=90){
        echo "成绩优秀!";
    }elseif ($score>=80){
        echo "成绩良好!";
    }elseif ($score>=60){
        echo "成绩一般";
    }else {
        echo "还需努力";
    }
?>

5、循环语句:重复的业务场景使用循环语句
for循环:习惯当知道循环次数的时候使用for循环
当for循环条件成立时,执行代码,迭代后继续判断,直到不成立时退出循环
从初始值到条件不成立,迭代了几次,执行几次代码
当条件一直成立时,会一直执行,形成死循环。

语法:for(初始值,条件,迭代){ 
	条件成立时执行的代码;
}
<?php
   $stduent=["小李","小丽","小高","小陈"];
   for ($i = 0; $i <= 3; $i++) {  
        echo $stduent[$i].' ';
   }
?>

while循环语句:当不知道要循环的次数的时候,使用while循环
while当条件成立时,执行循环体代码,然后迭代,直到条件不成立退出循环
语法:while (条件){
条件成立时执行代码
迭代
}

<?php
    $count=3;
    $student=array("小李","小丽","小高","小陈");
    // 当不直到循环次数的时候使用while循环
    While ($count >= 0) {
        // $count=$count-1;
        echo $student[$count].' ';
        $count=$count-1;
    }
?>

6、类与函数
类:一个抽象的概念,可以理解为用来存储不同类型信息的集合体,但是不能直接使用 ----群体
对象:从类中创造一个具体的集合体,类的实例化,具体化-----个体来使用
属性:类中定义的变量就是属性,用于存储信息
函数:一段完成特定功能的代码集合体,完成一系列的事情
函数的名称应该提示出它的功能
函数名称以字⺟或下划线开头(不能以数字开头)
PHP⾃定义函数

<?php
  function functionName()
  {
  // 要执⾏的代码
  }
?>

语法:class MyClass {
//类可以包含属性(变量)和方法(函数)
//属性用于存储数据,而方法用于执行操作
//new关键字直接跟类名来创建对象
}

<?php
    header("Content-Type: text/html; charset=utf-8");
    Class MyStudent {
        // 定义两个类中两个属性(变量)name和age,Public 是指谁都可以使用获取这个属性,或者说是共有属性
        public $name;
        public $age;
        public function say(){
            echo $this -> name. " 你好! ";
        }
    }
    $stu1 = New MyStudent();
    // 获取类中属性时不需要$
    $stu1 -> name = "张三";
    $stu1 -> age = 18;
    echo $stu1 -> name;
    echo $stu1 -> age;
    $stu1 -> say();
?>

7、魔术方法:特定的名称和功能
魔术方法不需要调用,php解释器只在特定的时机下才会执行
通常两个下划线开头,后面跟方法名称

<?php
    class Person{
        public function __construct(){
            echo "construct is coming";
        }
    }
    // 创建对象时会自动调用构造方法,并执行echo语句
    $p1 = new Person();  
?>

8、超全局变量
⽤户提交数据通常是使⽤表单进⾏提交,也可以使⽤⽹址中的参数传递数据,这些数据通过HTTP请求的
⽅式发送,使web服务器获取。
获取后,php通过几个超全局变量拿到用户提交的http请求数据
$_GET
收集通过URL参数(GET⽅法)提交的数据
$_POST
收集通过HTTP POST⽅法提交的表单数据
$_FILES
处理通过HTTP POST上传的⽂件
超全局变量
全局:在PHP代码的任何位置都可以直接使⽤,不需要提前定义;
超:PHP官⽅内置的变量,专⻔⽤来接收⽤户传递的各种数据,天⽣存在,直接调⽤即可
核⼼特点:
所有超全局变量都是⼤写的数组形式;
专⻔⽤来接收⽤户从浏览器传递给服务器的数据;
是后端接收前端参数的核⼼⽅式。
$_GET 超全局变量 —— 接收GET请求传递的参数
$_GET 专⻔⽤来接收⽤户通过GET请求传递的所有数据,数据来⾃于浏览器地址栏的URL中。
语法: $_GET['参数名']
案例:访问⽹址 http://www.xxx.com/index.php?user=admin&pwd=123 ,后端接收参数:
$_POST 超全局变量 —— 接收POST请求传递的参数
$_POST 专⻔⽤来接收⽤户通过「POST请求」传递的所有数据,数据藏在请求体中,URL中不可⻅。
语法:$_POST['参数名']
案例:⽤户登录时输⼊账号密码,点击登录,后端接收参数:
准备前端页面:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>表单信息</title>
</head>
<body>
    <h3>注册表单</h3>
    <!-- form表单,GET方法 -->
    <!-- <form action="test10.php" method="GET"> -->
    <!-- //form表单,POST方法 -->
    <form action="test10.php" method="POST">
        姓名:<input type="text" name="name"><br>
        年龄:<input type="text" name="age"><br>
        账号:<input type="text" name="account"><br>
        密码:<input type="password" name="pwd"><br>
        <input type="submit" value="提交">
    </form>
</body>
</html>

后端接收数据页面

<?php
    header("Content-Type: text/html; charset=utf-8");
    Class Person{
        public $name;
        public $age;
        public $account;
        public $passwd;
    }
    $p1 = new Person();
    // 超全局变量$_GET获取网页传给后端的数据
    // $p1 -> name = $_GET['name'];
    // $p1 -> age = $_GET['age'];
    // $p1 -> account = $_GET['account'];
    // $p1 -> passwd = $_GET['pwd'];
    //超全局变量$_POST来获取用户网页传的数据,注意:参数值与前端页面里的name里的值要一致。
    $p1 -> name = $_POST['name'];
    $p1 -> age = $_POST['age'];
    $p1 -> account = $_POST['account'];
    $p1 -> passwd = $_POST['pwd'];
    echo "姓名:{$p1 -> name}<br>";
    echo "年龄:{$p1 -> age}<br>";
    echo "账号:{$p1 -> account}<br>";
    echo "密码:{$p1 -> passwd}<br>";
    echo "<a href='test8.php'>返回填写表单</a>";
?>

9、序列化和反序列化
传递多个数据可以用序列化对象
序列化serialize():是将⼀个 PHP 对象(包括它的类名、所有属性和属性值)转换为⼀个可存
储、可传输的字符串的过程。
反序列化unserialize():是将这个字符串还原回原来的 PHP 对象。
serialize()与 unserialize()都是php自带的函数,可以直接使用
接着上面的案例代码操作:
// 将一个p1对象打散拆解打包为一个字符串,便于存储与传输。

    $serialize1=serialize($p1);
    echo "序列化后的数据是:<br>{$serialize1}<br>";
    //将上面序列化的数据进行反序列化,还原为p1对象。
    $unserializa1=unserialize($serialize1);
    echo "反序列化后的数据是: <br>";
    echo $unserializa1->name;
    echo "<br>";
    echo $unserializa1->age;
    echo "<br>";
    echo $unserializa1->account;

10、web交互练习

 <?php
error_reporting(0);
include "flag.php";
$KEY = "ZS";
$str = $_GET['str'];
if(unserialize($str)===$KEY){
    echo "$flag" ."</br>";
}
show_source(__FILE__);
?> 
  • 让代码执行echo语句,就打印flag
  • 发现echo语句是被包含在if语句里,且条件为真时执行,那么要使if条件语句为真
  • 那就使条件语句$str的反序列化之后与变量$key的值一致为真
  • 前面申明变量$key的值为字符串:"ZS"(大写)
  • 因此只要变量$str的反序列化的值就是"ZS",那么条件就为真了
  • 这个$str的变量是通过GET方法获取的,参数是str
  • 那么综上,参数str就是"ZS"的序列化值。
    测试代码:
<?php
    $str=serialize("ZS");
    echo $str;
?>

打印输出结果为s:2:"ZS";
通过url传入该参数即可,另外双引号需要转义,如下
http://localhost/fan/index.php?str=s:2:%22ZS%22

posted @ 2026-02-11 17:32  无锋夹克  阅读(1)  评论(0)    收藏  举报