批改状态:不合格
老师批语:笔记内容可以发表到“博客”,作业内容需要单独提交
php-cli command line interface php在命令行运行的接口,区分于在web服务器上运行的php环境(php-cgi,isapi),php不单可以写前台网页,也可以用来写后台的程序。swoole
PHP Hypertext Preprecessor 超文本预处理器 可以嵌入到html代码中的
PHP通用开源动态脚本语言,运行在服务端,适合高效快捷的进行web开发
通常用于创建动态生成的网页,支持常用的数据库 MySql, mariaDB ,Oracle, MongoDB
PHP Personal Home Page 1994 Perl Rasmus Lerdorf 来统计个人网站访问量的程序,C重写后,1995 php1 php2 加入了对mysql
php5 2004-7 引入了面向对象编程 5.4 trait 5.6
php7 2015-12 性能是 php5.6提高了2倍
php7.4 提供了pre-loading预加载机制,实现了部分程序的常驻内存
4 2020-11 PHP8.0问世 高效的JIT just-in-time(即使编译)运算支持,PHP 已经应用到 websocket服务,高性能web,物联网,即时通讯,游戏,微服务等非web领域的系统开发
include: 加载失败不中断 常用于加载模板或页面require: 加载失败中断,常用于加载对象或数据
| 转换方式 | 函数 |
|---|---|
| 临时转换 | (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)
?>
| 转换方式 | 函数 |
|---|---|
| 标量 | is_int(),is_string(),is_bool()… |
| 复合 | is_array(),is_object() |
| 特殊 | is_null(),is_resource() |
PHP有很多资源类型:数据库连接、结果、图像、PDF等
is_resource():判断一个变量是否是一个资源类型
false(布尔值) 0(数字类型) ‘’(字符串)
1、直接赋值$var =nul
2、unset($fp)
3、var_dump($emp) $emp 不存在
常量类型
系统常量 魔术常量 DIR
const APP_PATH = '/phpEnv/www/chloe.io/0302';echo APP_PATH;define('NATION', '中国');echo NATION;printf('国籍:%s', NATION);class User{//类常量只能用const定义const APP_PATH = '/phpEnv/www/chloe.io/0302';}// 常量必须初始化赋值$height;const HEIGHT = '183cm';ob_clean();// 系统常量// print_r(get_defined_constants(true));// 魔术常量echo __FILE__; //当前执行PHP脚本的完整路径和文件名, 绝对路径echo dirname(__FILE__); //当前执行PHP脚本的完整路径echo __DIR__;//当前执行PHP脚本的完整路径
//系统预定义变量
// 超全局变量: 数组,任何地方都可以访问,不受作用域限制
// $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: 通过环境方式传递给当前脚本的变量的数组
if (1 == 1) {
echo 111;
}
if(条件表达式)
{
#满足条件执行的代码块
} else{
}
$age = 85;$gender = '女';if ($gender == '女' && $age < 55) :echo "您好女士,距离您退休还有" . (55 - $age) . "年<br>";elseif ($gender == '女' && $age > 55) :echo "您好女士,您已经退休" . ($age - 55) . "年了<br>";elseif ($gender == '男' && $age < 60) :echo "先生您好,距离您退休还有" . (60 - $age) . "年<br>";elseif ($gender == '男' && $age > 60) :echo "先生您好 ,您已经退休" . ($age - 60) . "年了<br>";else :echo '很抱歉,您输入的信息不正确';endif;ob_clean();$d = date("w"); //0-6switch ($d):case 1:echo '今天是工作日星期一';break;case 2:echo '今天是工作日星期二';break;case 3:echo '今天是工作日星期三';break;case 4:echo '今天是工作日星期四';break;case 5:echo '今天是工作日星期五';break;default:echo "今天休息!";endswitch;// break 退出当前循环 continue 跳过此次循环,进入下一轮循环
$nav = '';for ($i = 0; $i < count($navs); $i++) {$nav .= "<a href='{$navs[$i]['url']}' style='padding: 0 15px' >{$navs[$i]['name']}</a>";}
js 模版
// 商品信息模板const tr = `<tr><td><input type="checkbox" name="" class="check" checked /></td><td>${item.id}</td><td>${item.name}</td><td>${item.unit}</td><td class="price">${item.price}</td><td><input type="number" name="" value="${item.num}" min="1"></td><td class="money">${item.money}</td></tr>`
<?php/*** ; php指令分隔符* php 功能执行语句 必须以;结束* 结构定义语句**///! PHP运算符function demo(){}class demo{}// 算数运算符 + - * / % 去余// 能被4整除但不能被100整除的都是闰年,其余的年份均为平年$year = date("Y");// echo $year;if ($year % 4 == 0 && $year % 100 !== 0) {echo "{$year}是闰年";} else {echo "{$year}是平年";}// 控制随机数的范围 0-50// echo mt_rand() % 50;echo mt_rand(0, 50);// 比较运算符 返回布尔型 用在流程控制语句var_dump(11 > 10);// 逻辑运算符 || && ! 返回布尔型 用在流程控制语句/*** || 或 两边的表达式只要一个为true 返回true** && 且 两边的表达式全部为true 返回true** !* *//*** = 赋值运算符* == 值比较* === 严格比较 值 类型*/var_dump(1 > 0 || 4 > 5);var_dump(0 === '0');$username = 'admin';if (isset($username) && $username === 'admin') {echo "欢迎管理员{$username}回来";}$email = $_GET['email'];if (isset($email) && filter_var($email, FILTER_VALIDATE_EMAIL)) {echo '邮箱验证通过';} else {echo '请输入有效的邮箱';}ob_clean();//三元运算符 表达式 ? :// $pwd = sha1('wwwphpcn');$pwd = isset($pwd) ? $pwd : 'root';// 检测页码// $page = isset($_GET['p']) ? $_GET['p'] : 1;// ?? null合并运算符 告别isset()$page = @$_GET['p'] ?? 1;echo $page;以前的写法$info = isset($_GET[’email’]) ? $_GET[’email’] : ‘noemail’;现在直接这样写就可以了$info = $_GET[’email’] ?? noemail;
<?php// ! 循环 while$cities = ['合肥', '南京', '杭州', '苏州', '上海', '北京'];next($cities);next($cities);next($cities);next($cities);reset($cities);// echo current($cities);// while循环 入口判断型循环// while ($city = current($cities)) {// echo $city . '<br>';// next($cities);// }// while ($city = current($cities)) :// echo $city . '<br>';// next($cities);// endwhile;// do..while出口型判断循环// $i = 0;// do {// echo $cities[$i];// $i++;// } while ($i < count($cities));// for 计数型循环// for ($i = 0; $i < count($cities); $i++) {// // break 提前结束循环// if ($i > 2) break;// echo $cities[$i];// }// continue 跳出某一轮循环 选择性输出for ($i = 0; $i < count($cities); $i++) {if ($i == 2 || $i == 3) continue;echo $cities[$i];}foreach ($cities as $k => $v) {}
http: 无状态
<img src="cookie.png">
<img src="session.png">
cookie
/*** 格式化输出* 1. printf(format,a,b,...): 打印(离散参数)* 2. vprintf(format,array): 打印(数组参数)* 3. sprintf(format,a,b,...): 只返回不打印* 4. vsprintf(format,array): 只返回不打印* 速记法:* s: 只返回不打印* v: 数组参数*/// printf('format',a,b,c);printf('<div style="color:red">%s</div>', 'php中文网');echo sprintf('<div style="color:red">%s</div>', 'php中文网');
$num=[2, 3];
echo add(1, …$num); //6
function boo(…$args)
{
// var_dump(func_get_args());
// var_dump(func_num_args());
// var_dump(func_get_arg(3));
// if (func_num_args() >= 2) echo “第二个参数是” . func_get_arg(1);
return array_sum($args);
}
boo(15, 25, 57, 256, 89);
// 引用变量传递是地址
$d = &$c;
echo $d; //20;
$c = 30;
echo $d; //30
$d = 40;
ob_clean();
echo $c;
### 2. 特殊形式的函数#### 1. 匿名函数
$loo = function ($i) {
echo "插入数据{$i}\n";return true;
}
$loo(5)
#### 2. 回调函数所谓的回调函数,就是指调用函数时并不是向函数中传递一个标准的变量作为参数,而是将另一个函数作为参数传递到调用的函数中,这个作为参数的函数就是回调函数。通俗的来说,回调函数也是一个我们定义的函数,但是不是我们直接来调用的,而是通过另一个函数来调用的,这个函数通过接收回调函数的名字和参数来实现对它的调用。当函数名或参数, 可能是由任意表达式生成或来自网络请求时非常有用, 例如类方法, 高阶函数,随机参数或参数来自一个web请求等的场景下, 别外, 如果需要对传参预处理时, 也比直接调用更简洁灵活call_user_func()call_user_func_array()func_get_args()func_num_args()func_get_arg(3)
function boo(…$args)
{
// var_dump(func_get_args());
// var_dump(func_num_args());
// var_dump(func_get_arg(3));
// if (func_num_args() >= 2) echo “第二个参数是” . func_get_arg(1);
return array_sum($args);
}
boo(15, 25, 57, 256, 89);
/ //$b=’今天’;
// function boo (…$a) {
// //echo $a ;
// var_dump($a);
// };
// call_user_func(‘boo’,[15, 25, 57, 256, 89]); //展开
// echo call_user_func_array(‘boo’, [15, 25, 57, 256, 89]); //展开
#### 3. 递归函数自己调用自己就是递归函数。老师说数状结构 文件夹访问就是一个函数在它的函数体内调用它自身称为递归调用,这种函数称为递归函数。执行递归函数将反复调用其自身,每调用一次就进入新的一层,当最内层的函数执行完毕后,再一层一层地由里到外退出
// ! 递归函数
// 递归函数是指直接或间接的调用函数自身的函数
// ! 必须有一个终止处理或计算的准则;
function demo($a = 1)
{
if ($a <= 5) {
echo “第{$a}次执行<br>“;
$a++;
demo($a);
}
}
demo();
/**
需要删除的目录请实现备份,否则永不可复原
*/
function delete_dir_file($dir)
{
//声明一个初始状态 默认情况下缓存未被删除
$res = false;
if (is_dir($dir)) {
//成功打开目录流if ($handle = opendir($dir)) {while (($file = readdir($handle)) !== false) {if ($file != '.' && $file != '..') {if (is_dir($dir . '\\' . $file)) {delete_dir_file($dir . '\\' . $file);} else {//unlink只能删除一个文件unlink($dir . '\\' . $file);}}}}//关闭目录句柄closedir($handle);//目录只有为空的情况下才能被直接删除if (rmdir($dir)) {$res = true;}
}
return $res;
}
$apppath = _DIR;
// delete_dir_file($app_path);
#### 4. 箭头函数// 箭头函数 fn//! 箭头函数会自动捕获父作用域变量进行值拷贝$x = 1;$fn = fn ($a, $b) => $a + $b + $x;echo $fn(10, 20);# 三、 PHP项目实例## 目录结构### config/common.php 存储各种复杂路径,都用常量表示### data存储是数据### template\public存储是网页头、网页底公共模版,都是用include 引用### static存储js css等### lib/user/check.php 用户登录界面后台验证lib/user/check.php
<?php
// 获取用户登录数据 不能用传统的表单格式提交 ($_POST) , json
// json当成文本流原始数据来接收
$json = file_get_contents(‘php://input’);
// echo $json;
// $json并非php能识别的数据类型,它只是json格式的字符串而已
// json -> php.array , true: 数组
$user = json_decode($json, true);
// var_dump($user);
echo json_encode($user);
config\common.php
<?php
// 根路径
// date() 格式化一个时间戳
// echo date(“Y-m-d”, time());
define(‘DAY’, date(‘/md’, time()));
define(‘ROOT_PATH’, $_SERVER[‘DOCUMENT_ROOT’] . DAY . ‘/web’);
// echo ROOT_PATH;
// 数据路径
define(‘DATA_PATH’, ROOT_PATH . ‘/data’);
// 模板路径
define(‘TMPL_PATH’, ROOT_PATH . ‘/template’);
// 公共模板路径
define(‘TMPL_PATH_PUBLIC’, TMPL_PATH . ‘/public’);
// 静态资源路径
define(‘STATIC_PATH’, ROOT_PATH . ‘/static’);
// css
define(‘STATIC_CSS_PATH’, STATIC_PATH . ‘/css’);
// js
define(‘STATIC_JS_PATH’, STATIC_PATH . ‘/js’);
// images
define(‘STATIC_IMG_PATH’, STATIC_PATH . ‘/images’);
login.php
<!-- 引入页眉 -->
<?php include ‘template/public/header.php’ ?>
<!-- 主体 -->
<main>
<!-- 用户登录 -->
<form class="login">
<table>
<caption>
用户登录
</caption>
<tbody>
<tr>
<td><label for="email">邮箱:</label></td>
<td><input type="email" name="email" id="email" /></td>
</tr>
<tr>
<td><label for="password">密码:</label></td>
<td><input type="password" name="password" id="password" /></td>
</tr>
<tr><td colspan="2"><button onclick="doLogin(this)" type="button">提交</button></td></tr></tbody></table>
</form>
<p>
<a href="register.php">没有帐号,请先注册</a>
</p>
</main>
<script>
async function doLogin(obj) {
// console.log(obj.form.email.value);
const email = obj.form.email.value;
const password = obj.form.password.value;
// 非空验证
if (email.length > 0 && password.length > 0) {
// 异步提交 fetch API
const response = await fetch(‘./lib/user/check.php’, {
// 请求方法
method: ‘POST’,
// 请求头
headers: {
‘Content-Type’: ‘application/json;charset=utf-8’
},
body: JSON.stringify({
email,
password
})
});
// 解析数据
const result = await response.json();
console.log(result);
} else {
alert(‘邮箱或密码不能为空’);
}
}
</script>
<!-- 引入页脚 -->
<?php include ‘template/public/footer.php’ ?>template\public 头部底部模板如下
头部模板
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<?
$arr = require ‘data/data.php’;
$navs = require ‘data/nav.php’;
?>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="keywords" content="<?= $arr['keywords'] ?>" />
<meta name="description" content="<?= $arr['des'] ?>" />
<link rel="stylesheet" href="static/css/style.css" />
<title><?= $arr[‘title’] ?></title>
</head>
<body>
<!-- 页眉 -->
<!-- 修改php.ini open_short_tag On-->
<header>
<nav>
<a href="index.php">首页</a>
<? foreach ($navs as $k => $v) : ?>
<a href="news.php"><?= $v[‘name’] ?></a>
<? endforeach; ?>
</nav>
</header>```
<!-- 页脚 -->
<footer>
<div>php中文网©版权所有(2022-2025)</div>
</footer>
</body>
</html>
data存储是数组return [
["id" => 1, 'name' => '新闻'],
["id" => 2, 'name' => '产品'],
["id" => 3, 'name' => '联系'],
["id" => 4, 'name' => '登录'],
];
return array("keywords" => "新闻,产品,合肥", "des" => "专业生产中高档办公家具,行业畅销20年", "title" => "首頁");
首页如下<!-- 引入页眉 -->
<?php include 'template/public/header.php' ?>
<!-- 主体 -->
<main>
<!-- 新闻列表 -->
<div class="news">
<h3>新闻列表</h3>
<div class="list">
<a href="">切实做好高风险岗位从业人员疫情防控。</a>
<a href="">切实做好高风险岗位从业人员疫情防控。</a>
<a href="">切实做好高风险岗位从业人员疫情防控。</a>
<a href="">切实做好高风险岗位从业人员疫情防控。</a>
<a href="">切实做好高风险岗位从业人员疫情防控。</a>
</div>
</div>
<!-- 产品列表 -->
<div class="items">
<h3>产品列表</h3>
<div class="list">
<div class="item">
<img src="static/images/item1.jpeg" alt="" />
<a href="">最新产品1</a>
</div>
<div class="item">
<img src="static/images/item2.jpeg" alt="" />
<a href="">最新产品2</a>
</div>
<div class="item">
<a href=""><img src="static/images/item3.jpeg" alt="" /></a>
<a href="">最新产品3</a>
</div>
<div class="item">
<img src="static/images/item4.jpeg" alt="" />
<a href="">最新产品4</a>
</div>
</div>
</div>
</main>
<!-- 引入页脚 -->
<?php include 'template/public/footer.php' ?>
# 重点例子代码
fetch的使用 注意await async
```
<form class="login">
<table>
<caption>
用户登录
</caption>
<tbody>
<tr>
<td><label for="email">邮箱:</label></td>
<td><input type="email" name="email" id="email" /></td>
</tr>
<tr>
<td><label for="password">密码:</label></td>
<td><input type="password" name="password" id="password" /></td>
</tr>
<tr>
<td colspan="2"><button onclick="doLogin(this)" type="button">提交</button></td>
</tr>
</tbody>
</table>
</form>
<script>
async function doLogin(obj) {
// console.log(obj.form.email.value);
const email = obj.form.email.value;
const password = obj.form.password.value;
// 非空验证
if (email.length > 0 && password.length > 0) {
// 异步提交 fetch API
const response = await fetch(‘./lib/user/check.php’, {
// 请求方法
method: ‘POST’,
// 请求头
headers: {
‘Content-Type’: ‘application/json;charset=utf-8’
},
body: JSON.stringify({
email,
password
})
});
// 解析数据
const result = await response.json();
console.log(result);
} else {
alert(‘邮箱或密码不能为空’);
}
}
</script>
后端代码
<?php
// 获取用户登录数据 不能用传统的表单格式提交 ($_POST) , json
// json当成文本流原始数据来接收
$json = file_get_contents(‘php://input’);
// echo $json;
// $json并非php能识别的数据类型,它只是json格式的字符串而已
// json -> php.array , true: 数组
$user = json_decode($json, true);
// var_dump($user);
echo json_encode($user);
登录判断使用 登录退出 全部写入到一个函数中
/ 获取对用户的操作动作
$action = strtolower($_GET[‘action’]);
$prompt = false;
switch ($action):
case ‘login’:
$json = file_get_contents(‘php://input’);
$user = json_decode($json, true);
$email = $user['email'];$salt = 'wwwphpcn';$password = md5($user['password'] . $salt);$result = array_filter($users, function ($user) use ($email, $password) {return $user['email'] === $email && $user['password'] === $password;});$result = array_values($result);if (count($result) === 1) {$prompt = true;$_SESSION['user']['email'] = $result[0]['email'];$_SESSION['user']['name'] = $result[0]['name'];}break;case 'logout':if (session_destroy()) {$prompt = true;}case 'register':
<?php if (!isset($_SESSION[‘user’])) : ?>
<a href="login.php">登录</a>
<?php else : ?>
<a href="javascript:;" onclick="logout()"><?= $_SESSION[‘user’][‘name’] ?>退出</a>
<?php endif ?></nav></header><script>async function logout() {if (confirm('是否退出')) {const response = await fetch('./lib/userHandle.php?action=logout')const result = await response.json();if (result) {location.href = 'index.php';} else {alert('退出失败');}}}</script>
```
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号