php基础笔记一直更新

编辑: admin 分类: 电脑知识 发布时间: 2023-06-14 来源:互联网
一、 PHP简介认识PHP
  1. PHP Hypertext Preprecessor 超文本预处理器 可以嵌入到html代码中的

  2. PHP通用开源动态脚本语言,运行在服务端,适合高效快捷的进行web开发

  3. 通常用于创建动态生成的网页,支持常用的数据库 MySql, mariaDB ,Oracle, MongoDB

php发展史
  1. PHP Personal Home Page 1994 Perl Rasmus Lerdorf 来统计个人网站访问量的程序,C重写后,1995 php1 php2 加入了对mysql

  2. php5 2004-7 引入了面向对象编程 5.4 trait 5.6

  3. php7 2015-12 性能是 php5.6提高了2倍
    php7.4 提供了pre-loading预加载机制,实现了部分程序的常驻内存

4 2020-11 PHP8.0问世 高效的JIT just-in-time(即使编译)运算支持,PHP 已经应用到 websocket服务,高性能web,物联网,即时通讯,游戏,微服务等非web领域的系统开发

PHP 工作运行原理

image.png

二、 PHP语法第一课PHP include request区别(1)、include 遇到错误还继续,非常适合模版(2)、request遇到错误就停止

include: 加载失败不中断 常用于加载模板或页面
require: 加载失败中断,常用于加载对象或数据

PHP 函数不区分大小写、php变量大小敏感索引数组关联数组

image.png

二维数组遍历for

image.png

foreach

image.png

image.png

list()数组找那个的值赋给一组变量

image.png

extract

image.png

php 变量1. 数据类型转换 转换方式 函数 临时转换 (int),(string),(array),(object)… 自动转换 根据操作符对操作数的类型要求进行 强制转换 settype()

PHP的数据类型转换属于强制转换,允许转换的PHP数据类型有:

(int)、(integer):转换成整形

(float)、(double)、(real):转换成浮点型

(string):转换成字符串

(bool)、(boolean):转换成布尔类型

(array):转换成数组

(object):转换成对象

第一种转换方式: (int) (bool) (float) (string) (array) (object)

$num1=3.14;

$num2=(int)$num1;

var_dump($num1); //输出float(3.14)

var_dump($num2); //输出int(3)

?>

第二种转换方式: intval() floatval() strval()

$str=”123.9abc”;

$int=intval($str); //转换后数值:123

$float=floatval($str); //转换后数值:123.9

$str=strval($float); //转换后字符串:”123.9”

?>

第三种转换方式: settype();

$num4=12.8;

$flg=settype($num4,”int”);

var_dump($flg); //输出bool(true)

var_dump($num4); //输出int(12)

?>

2. 类型检测 转换方式 函数 标量 is_int(),is_string(),is_bool()… 复合 is_array(),is_object() 特殊 is_null(),is_resource()

PHP有很多资源类型:数据库连接、结果、图像、PDF等

is_resource():判断一个变量是否是一个资源类型

null讲解

image.png

@var_dump 有错误可以忽略不在页面显示null 类型不等于下面任何:

false(布尔值) 0(数字类型) ‘’(字符串)

如何能获得null 三种方法

1、直接赋值$var =nul
2、unset($fp)
3、var_dump($emp) $emp 不存在

3. 变量命名
  • 仅允许使用: 英文字母(a-z,A-Z),数字(0-9),下划线(_)或他们的组合
  • 不允许使用数字开头
  • 必须使用”$”美元符为前缀
  • 严格区分大小写
  • 驼峰命名法
4. 常量
  • define(): 函数
  • const: 关键字
    1. 固定的值(圆周率), 常量不能重新被定义 或者取消定义
    1. 常量的命名前不能加 $
    1. 常量推荐全部大写,多个单词之间用下划线连接_
    1. 变量不属于全局成员, 常量、类、接口、函数属于全局成员 不受作用域限制
  • 5、类常量只能用const定义

常量类型
系统常量 魔术常量 DIR

  1. const APP_PATH = '/phpEnv/www/chloe.io/0302';
  2. echo APP_PATH;
  3. define('NATION', '中国');
  4. echo NATION;
  5. printf('国籍:%s', NATION);
  6. class User
  7. {
  8. //类常量只能用const定义
  9. const APP_PATH = '/phpEnv/www/chloe.io/0302';
  10. }
  11. // 常量必须初始化赋值
  12. $height;
  13. const HEIGHT = '183cm';
  14. ob_clean();
  15. // 系统常量
  16. // print_r(get_defined_constants(true));
  17. // 魔术常量
  18. echo __FILE__; //当前执行PHP脚本的完整路径和文件名, 绝对路径
  19. echo dirname(__FILE__); //当前执行PHP脚本的完整路径
  20. echo __DIR__;//当前执行PHP脚本的完整路径
5. 全局变量 无法在函数内部直接调用

image.png
//系统预定义变量
// 超全局变量: 数组,任何地方都可以访问,不受作用域限制
// $GLOBALS: 引用全局作用域中可用的全部变量
// $_SERVER: 服务器和执行环境信息
// $_GET :通过 URL 参数(又叫 query string)传递给当前脚本的变量的数组
// $_POST:当 HTTP POST 请求的 Content-Type 是 application/x-www-form-urlencoded 或 multipart/form-data 时,会将变量以关联数组形式传入当前脚本
// $_FILES:通过 HTTP POST 方式上传到当前脚本的项目的数组
// $_COOKIE:通过 HTTP Cookies 方式传递给当前脚本的变量的数组
// $_SESSION:当前脚本可用 SESSION 变量的数组
// $_REQUEST: 默认情况下包含了 $_GET,$_POST 和 $_COOKIE 的数组
// $_ENV: 通过环境方式传递给当前脚本的变量的数组

流程控制1. 单一条件分支结构

if (1 == 1) {
echo 111;
}

2.双向条件分支结构 if…else

if(条件表达式)
{

  1. #满足条件执行的代码块

} else{

不满足条件执行的代码块

}

3. 多向条件分支结构
  1. $age = 85;
  2. $gender = '女';
  3. if ($gender == '女' && $age < 55) :
  4. echo "您好女士,距离您退休还有" . (55 - $age) . "年<br>";
  5. elseif ($gender == '女' && $age > 55) :
  6. echo "您好女士,您已经退休" . ($age - 55) . "年了<br>";
  7. elseif ($gender == '男' && $age < 60) :
  8. echo "先生您好,距离您退休还有" . (60 - $age) . "年<br>";
  9. elseif ($gender == '男' && $age > 60) :
  10. echo "先生您好 ,您已经退休" . ($age - 60) . "年了<br>";
  11. else :
  12. echo '很抱歉,您输入的信息不正确';
  13. endif;
  14. ob_clean();
  15. $d = date("w"); //0-6
  16. switch ($d):
  17. case 1:
  18. echo '今天是工作日星期一';
  19. break;
  20. case 2:
  21. echo '今天是工作日星期二';
  22. break;
  23. case 3:
  24. echo '今天是工作日星期三';
  25. break;
  26. case 4:
  27. echo '今天是工作日星期四';
  28. break;
  29. case 5:
  30. echo '今天是工作日星期五';
  31. break;
  32. default:
  33. echo "今天休息!";
  34. endswitch;
  35. // break 退出当前循环 continue 跳过此次循环,进入下一轮循环
php 模版
  1. $nav = '';
  2. for ($i = 0; $i < count($navs); $i++) {
  3. $nav .= "<a href='{$navs[$i]['url']}' style='padding: 0 15px' >{$navs[$i]['name']}</a>";
  4. }

js 模版

  1. // 商品信息模板
  2. const tr = `
  3. <tr>
  4. <td><input type="checkbox" name="" class="check" checked /></td>
  5. <td>${item.id}</td>
  6. <td>${item.name}</td>
  7. <td>${item.unit}</td>
  8. <td class="price">${item.price}</td>
  9. <td><input type="number" name="" value="${item.num}" min="1"></td>
  10. <td class="money">${item.money}</td>
  11. </tr>
  12. `
运算符
  1. <?php
  2. /**
  3. * ; php指令分隔符
  4. * php 功能执行语句 必须以;结束
  5. * 结构定义语句
  6. *
  7. */
  8. //! PHP运算符
  9. function demo()
  10. {
  11. }
  12. class demo
  13. {
  14. }
  15. // 算数运算符 + - * / % 去余
  16. // 能被4整除但不能被100整除的都是闰年,其余的年份均为平年
  17. $year = date("Y");
  18. // echo $year;
  19. if ($year % 4 == 0 && $year % 100 !== 0) {
  20. echo "{$year}是闰年";
  21. } else {
  22. echo "{$year}是平年";
  23. }
  24. // 控制随机数的范围 0-50
  25. // echo mt_rand() % 50;
  26. echo mt_rand(0, 50);
  27. // 比较运算符 返回布尔型 用在流程控制语句
  28. var_dump(11 > 10);
  29. // 逻辑运算符 || && ! 返回布尔型 用在流程控制语句
  30. /**
  31. * || 或 两边的表达式只要一个为true 返回true
  32. *
  33. * && 且 两边的表达式全部为true 返回true
  34. *
  35. * !
  36. * */
  37. /**
  38. * = 赋值运算符
  39. * == 值比较
  40. * === 严格比较 值 类型
  41. */
  42. var_dump(1 > 0 || 4 > 5);
  43. var_dump(0 === '0');
  44. $username = 'admin';
  45. if (isset($username) && $username === 'admin') {
  46. echo "欢迎管理员{$username}回来";
  47. }
  48. $email = $_GET['email'];
  49. if (isset($email) && filter_var($email, FILTER_VALIDATE_EMAIL)) {
  50. echo '邮箱验证通过';
  51. } else {
  52. echo '请输入有效的邮箱';
  53. }
  54. ob_clean();
  55. //三元运算符 表达式 ? :
  56. // $pwd = sha1('wwwphpcn');
  57. $pwd = isset($pwd) ? $pwd : 'root';
  58. // 检测页码
  59. // $page = isset($_GET['p']) ? $_GET['p'] : 1;
  60. // ?? null合并运算符 告别isset()
  61. $page = @$_GET['p'] ?? 1;
  62. echo $page;
  63. 以前的写法
  64. $info = isset($_GET[’email’]) ? $_GET[’email’] : ‘noemail’;
  65. 现在直接这样写就可以了
  66. $info = $_GET[’email’] ?? noemail;
循环
  1. <?php
  2. // ! 循环 while
  3. $cities = ['合肥', '南京', '杭州', '苏州', '上海', '北京'];
  4. next($cities);
  5. next($cities);
  6. next($cities);
  7. next($cities);
  8. reset($cities);
  9. // echo current($cities);
  10. // while循环 入口判断型循环
  11. // while ($city = current($cities)) {
  12. // echo $city . '<br>';
  13. // next($cities);
  14. // }
  15. // while ($city = current($cities)) :
  16. // echo $city . '<br>';
  17. // next($cities);
  18. // endwhile;
  19. // do..while出口型判断循环
  20. // $i = 0;
  21. // do {
  22. // echo $cities[$i];
  23. // $i++;
  24. // } while ($i < count($cities));
  25. // for 计数型循环
  26. // for ($i = 0; $i < count($cities); $i++) {
  27. // // break 提前结束循环
  28. // if ($i > 2) break;
  29. // echo $cities[$i];
  30. // }
  31. // continue 跳出某一轮循环 选择性输出
  32. for ($i = 0; $i < count($cities); $i++) {
  33. if ($i == 2 || $i == 3) continue;
  34. echo $cities[$i];
  35. }
  36. foreach ($cities as $k => $v) {
  37. }
session cokioo

http: 无状态

cookie 储存用户信息在客户端

<img src="cookie.png">

cookie特点
  1. 保存在客户端,容易被篡改(删除、禁用)
  2. 保存的数据大小受限,本身最大4kb
session 储存用户信息在服务端

<img src="session.png">

  • 会话 ID: 服务器设置,保存在客户端cookie
3. php 会话流程
  1. 客户端->服务器: http 请求
  2. 服务器->客户端: 设置会话 ID(cookie)
  3. 客户端->服务器: http 请求(会话 ID)
  4. 服务器->客户端: 验证会话,状态保持
三、 PHP项目实例

image.png

目录结构config/common.php 存储各种复杂路径,都用常量表示data存储是数据template\public存储是网页头、网页底公共模版,都是用include 引用static存储js css等lib/user/check.php 用户登录界面后台验证

lib/user/check.php

  1. <?php
  2. // 获取用户登录数据 不能用传统的表单格式提交 ($_POST) , json
  3. // json当成文本流原始数据来接收
  4. $json = file_get_contents('php://input');
  5. // echo $json;
  6. // $json并非php能识别的数据类型,它只是json格式的字符串而已
  7. // json -> php.array , true: 数组
  8. $user = json_decode($json, true);
  9. // var_dump($user);
  10. echo json_encode($user);

config\common.php

  1. <?php
  2. // 根路径
  3. // date() 格式化一个时间戳
  4. // echo date("Y-m-d", time());
  5. define('DAY', date('/md', time()));
  6. define('ROOT_PATH', $_SERVER['DOCUMENT_ROOT'] . DAY . '/web');
  7. // echo ROOT_PATH;
  8. // 数据路径
  9. define('DATA_PATH', ROOT_PATH . '/data');
  10. // 模板路径
  11. define('TMPL_PATH', ROOT_PATH . '/template');
  12. // 公共模板路径
  13. define('TMPL_PATH_PUBLIC', TMPL_PATH . '/public');
  14. // 静态资源路径
  15. define('STATIC_PATH', ROOT_PATH . '/static');
  16. // css
  17. define('STATIC_CSS_PATH', STATIC_PATH . '/css');
  18. // js
  19. define('STATIC_JS_PATH', STATIC_PATH . '/js');
  20. // images
  21. define('STATIC_IMG_PATH', STATIC_PATH . '/images');

login.php

  1. <!-- 引入页眉 -->
  2. <?php include 'template/public/header.php' ?>
  3. <!-- 主体 -->
  4. <main>
  5. <!-- 用户登录 -->
  6. <form class="login">
  7. <table>
  8. <caption>
  9. 用户登录
  10. </caption>
  11. <tbody>
  12. <tr>
  13. <td><label for="email">邮箱:</label></td>
  14. <td><input type="email" name="email" id="email" /></td>
  15. </tr>
  16. <tr>
  17. <td><label for="password">密码:</label></td>
  18. <td><input type="password" name="password" id="password" /></td>
  19. </tr>
  20. <tr>
  21. <td colspan="2"><button onclick="doLogin(this)" type="button">提交</button></td>
  22. </tr>
  23. </tbody>
  24. </table>
  25. </form>
  26. <p>
  27. <a href="register.php">没有帐号,请先注册</a>
  28. </p>
  29. </main>
  30. <script>
  31. async function doLogin(obj) {
  32. // console.log(obj.form.email.value);
  33. const email = obj.form.email.value;
  34. const password = obj.form.password.value;
  35. // 非空验证
  36. if (email.length > 0 && password.length > 0) {
  37. // 异步提交 fetch API
  38. const response = await fetch('./lib/user/check.php', {
  39. // 请求方法
  40. method: 'POST',
  41. // 请求头
  42. headers: {
  43. 'Content-Type': 'application/json;charset=utf-8'
  44. },
  45. body: JSON.stringify({
  46. email,
  47. password
  48. })
  49. });
  50. // 解析数据
  51. const result = await response.json();
  52. console.log(result);
  53. } else {
  54. alert('邮箱或密码不能为空');
  55. }
  56. }
  57. </script>
  58. <!-- 引入页脚 -->
  59. <?php include 'template/public/footer.php' ?>

template\public 头部底部模板如下

  1. 头部模板
  2. <!DOCTYPE html>
  3. <html lang="zh-CN">
  4. <head>
  5. <?
  6. $arr = require 'data/data.php';
  7. $navs = require 'data/nav.php';
  8. ?>
  9. <meta charset="UTF-8" />
  10. <meta http-equiv="X-UA-Compatible" content="IE=edge" />
  11. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  12. <meta name="keywords" content="<?= $arr['keywords'] ?>" />
  13. <meta name="description" content="<?= $arr['des'] ?>" />
  14. <link rel="stylesheet" href="static/css/style.css" />
  15. <title><?= $arr['title'] ?></title>
  16. </head>
  17. <body>
  18. <!-- 页眉 -->
  19. <!-- 修改php.ini open_short_tag On-->
  20. <header>
  21. <nav>
  22. <a href="index.php">首页</a>
  23. <? foreach ($navs as $k => $v) : ?>
  24. <a href="news.php"><?= $v['name'] ?></a>
  25. <? endforeach; ?>
  26. </nav>
  27. </header>
  1. <!-- 页脚 -->
  2. <footer>
  3. <div>海外运维网&copy;版权所有(2022-2025)</div>
  4. </footer>
  5. </body>
  6. </html>

data存储是数组

  1. return [
  2. ["id" => 1, 'name' => '新闻'],
  3. ["id" => 2, 'name' => '产品'],
  4. ["id" => 3, 'name' => '联系'],
  5. ["id" => 4, 'name' => '登录'],
  6. ];
  7. return array("keywords" => "新闻,产品,合肥", "des" => "专业生产中高档办公家具,行业畅销20年", "title" => "首頁");

首页如下

  1. <!-- 引入页眉 -->
  2. <?php include 'template/public/header.php' ?>
  3. <!-- 主体 -->
  4. <main>
  5. <!-- 新闻列表 -->
  6. <div class="news">
  7. <h3>新闻列表</h3>
  8. <div class="list">
  9. <a href="">切实做好高风险岗位从业人员疫情防控。</a>
  10. <a href="">切实做好高风险岗位从业人员疫情防控。</a>
  11. <a href="">切实做好高风险岗位从业人员疫情防控。</a>
  12. <a href="">切实做好高风险岗位从业人员疫情防控。</a>
  13. <a href="">切实做好高风险岗位从业人员疫情防控。</a>
  14. </div>
  15. </div>
  16. <!-- 产品列表 -->
  17. <div class="items">
  18. <h3>产品列表</h3>
  19. <div class="list">
  20. <div class="item">
  21. <img src="static/images/item1.jpeg" alt="" />
  22. <a href="">最新产品1</a>
  23. </div>
  24. <div class="item">
  25. <img src="static/images/item2.jpeg" alt="" />
  26. <a href="">最新产品2</a>
  27. </div>
  28. <div class="item">
  29. <a href=""><img src="static/images/item3.jpeg" alt="" /></a>
  30. <a href="">最新产品3</a>
  31. </div>
  32. <div class="item">
  33. <img src="static/images/item4.jpeg" alt="" />
  34. <a href="">最新产品4</a>
  35. </div>
  36. </div>
  37. </div>
  38. </main>
  39. <!-- 引入页脚 -->
  40. <?php include 'template/public/footer.php' ?>
重点例子代码

fetch的使用 注意await async

  1. <form class="login">
  2. <table>
  3. <caption>
  4. 用户登录
  5. </caption>
  6. <tbody>
  7. <tr>
  8. <td><label for="email">邮箱:</label></td>
  9. <td><input type="email" name="email" id="email" /></td>
  10. </tr>
  11. <tr>
  12. <td><label for="password">密码:</label></td>
  13. <td><input type="password" name="password" id="password" /></td>
  14. </tr>
  15. <tr>
  16. <td colspan="2"><button onclick="doLogin(this)" type="button">提交</button></td>
  17. </tr>
  18. </tbody>
  19. </table>
  20. </form>
  21. <script>
  22. async function doLogin(obj) {
  23. // console.log(obj.form.email.value);
  24. const email = obj.form.email.value;
  25. const password = obj.form.password.value;
  26. // 非空验证
  27. if (email.length > 0 && password.length > 0) {
  28. // 异步提交 fetch API
  29. const response = await fetch('./lib/user/check.php', {
  30. // 请求方法
  31. method: 'POST',
  32. // 请求头
  33. headers: {
  34. 'Content-Type': 'application/json;charset=utf-8'
  35. },
  36. body: JSON.stringify({
  37. email,
  38. password
  39. })
  40. });
  41. // 解析数据
  42. const result = await response.json();
  43. console.log(result);
  44. } else {
  45. alert('邮箱或密码不能为空');
  46. }
  47. }
  48. </script>
  49. 后端代码
  50. <?php
  51. // 获取用户登录数据 不能用传统的表单格式提交 ($_POST) , json
  52. // json当成文本流原始数据来接收
  53. $json = file_get_contents('php://input');
  54. // echo $json;
  55. // $json并非php能识别的数据类型,它只是json格式的字符串而已
  56. // json -> php.array , true: 数组
  57. $user = json_decode($json, true);
  58. // var_dump($user);
  59. echo json_encode($user);

登录判断使用 登录退出 全部写入到一个函数中

  1. / 获取对用户的操作动作
  2. $action = strtolower($_GET['action']);
  3. $prompt = false;
  4. switch ($action):
  5. case 'login':
  6. $json = file_get_contents('php://input');
  7. $user = json_decode($json, true);
  8. $email = $user['email'];
  9. $salt = 'wwwphpcn';
  10. $password = md5($user['password'] . $salt);
  11. $result = array_filter($users, function ($user) use ($email, $password) {
  12. return $user['email'] === $email && $user['password'] === $password;
  13. });
  14. $result = array_values($result);
  15. if (count($result) === 1) {
  16. $prompt = true;
  17. $_SESSION['user']['email'] = $result[0]['email'];
  18. $_SESSION['user']['name'] = $result[0]['name'];
  19. }
  20. break;
  21. case 'logout':
  22. if (session_destroy()) {
  23. $prompt = true;
  24. }
  25. case 'register':
  26. <?php if (!isset($_SESSION['user'])) : ?>
  27. <a href="login.php">登录</a>
  28. <?php else : ?>
  29. <a href="javascript:;" onclick="logout()"><?= $_SESSION['user']['name'] ?>退出</a>
  30. <?php endif ?>
  31. </nav>
  32. </header>
  33. <script>
  34. async function logout() {
  35. if (confirm('是否退出')) {
  36. const response = await fetch('./lib/userHandle.php?action=logout')
  37. const result = await response.json();
  38. if (result) {
  39. location.href = 'index.php';
  40. } else {
  41. alert('退出失败');
  42. }
  43. }
  44. }
  45. </script>
【本文转自:香港大带宽服务器 http://www.558idc.com/st.html 欢迎留下您的宝贵建议】