《PHP》精简Notes

资料来源:PHP8快速入门在线教程(基础+实战)

@Seymour0314

一、简介

  • 扩展名.php

  • PHP文件中可以包含HTML/CSS/JavaScript代码

  • PHP标记<?php ... ?>

    语句结束符;{}

    注释///* */

  • 输出

    echo可以多个字符串,逗号隔开

    print只允许输出一个字符串

  • 变量

    $开头

    后接数字、字母、下划线,数字不能开头

  • 混写HTML、PHP

    1
    2
    3
    4
    5
    6
    7
    <?php 
    $title = 'php标题';
    $link = '/detail.html';
    ?>
    <h1>
    <a href="<?php echo $link; ?>"><?php echo $title; ?></a>
    </h1>

二、数据类型

2.1 标量数据类型

image-20230828160036582
  • 数据类型

    • 布尔型Boolean
      • true、false
    • 整型Integer
    • 浮点型Float
    • 字符串String

    输出

    • echo输出数据值
    • var_dump打印数据类型和值
    1
    2
    3
    4
    5
    <?php
    $y = '你好呀';
    var_dump($y);
    echo '<hr>';
    ?>

    中文字符采用UTF-8,为3字节。

    • 字符串写双引号和单引号的区别

      双引号内可以直接写$作为变量显示,

      单引号只是作为字符串显示,并不看作变量。

    常量

    1
    2
    3
    4
    5
    6
    7
    // 方法一
    define('HOST','127.0.0.1');
    echo HOST;

    //方法二
    const NAME = '小白';
    echo NAME;

2.2 复合数据类型

  • 复合数据类型

    • 数组array
    • 对象object
    • 可调用callable
    • 可迭代iterable
  • 特殊数据类型

    • 空值NULL
    • 资源resource
    1
    2
    3
    4
    <?php
    $x = null;
    var_dump($x);
    ?>

2.2.1 数组array

  • 说是数组,实际上像字典,本身是键和值组成。

  • 两种表示方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
$arr1 = array(
'小黄',
'小兰',
'小黑'
);
var_dump($arr1);
echo '<br/>';
$arr2 = [
'小黄',
'小兰',
'小黑'
];
var_dump($arr2);
?>
image-20230827161845811
  • 使用方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
$arr1 = array(
'A' => '小黄',
'小兰',
'小黑'
);
var_dump($arr1);
echo '<br>';
echo $arr1['A'],'<br>'; // 小黄
echo $arr1[0],'<br>'; // 小兰
print_r($arr1);
echo '<br>';
echo '我的名字是' . $arr1[0];
?>
image-20230827162446251
  • 多维数组

    嵌套即可

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    <?php
    $arr = array(
    'A' => '小黄',
    '小兰',
    '小黑',
    array(
    1,
    '2'
    ),
    'B' => [
    'ab',
    'cd'
    ]
    );
    print_r($arr);
    ?>
    image-20230827163101391
  • 循环

1
2
3
4
5
6
7
8
9
10
<?php
$arr = array(
'A' => '小黄',
'小兰',
'小黑',
);
foreach($arr as $k => $v){
echo $k.$v.'<br>';
}
?>
image-20230827163630549
  • 实际使用

    有两种方法,

    一是把html的代码直接作为echo的字符串(不拆分php,技巧:用.连接字符串和变量来一次性echo);

    二是html代码作为html代码,把php代码拆开,随处写php(拆分多段php代码)。

    第一种自行写,下面是第二种。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php
$arr = array(
[
'title' => '学习',
'content' => '快乐学习'
],
[
'title' => '吃饭',
'content' => '快乐吃饭'
],
[
'title' => '睡觉',
'content' => '快乐睡觉'
],
);
foreach($arr as $k => $v){
?>
<h3><?php echo $arr[$k]['title'] ?></h3>
<p><?php echo $arr[$k]['content'] ?></p>
<?php
}
?>
image-20230827164406617

三、流程操作

3.1 条件判断

  • 三元运算符

    1
    2
    3
    4
    <?php
    $x = '';
    var_dump($x?'学习':'睡觉');
    ?>
    image-20230827165306305
  • 语句1

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <?php
    $x = '';
    $y = '睡觉';
    if($x){
    echo $x;
    }elseif($y){
    echo $y;
    }else{
    echo '没有';
    };
    ?>
    image-20230827165519986
  • 语句2

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    <?php
    $x = '睡觉';
    switch($x){
    case '学习':
    echo '要学习辣';
    break;
    case '睡觉':
    echo '要睡觉辣';
    break;
    case '吃饭':
    echo '要吃饭辣';
    break;
    default:
    echo '不知道';
    break;
    };
    ?>
    image-20230827165754171
  • php8新特性match

    1
    2
    3
    4
    5
    6
    7
    8
    <?php
    $x = '睡觉';
    echo match($x){
    '学习','study' => '要学习study辣',
    '睡觉','sleep' => '要睡觉sleep辣',
    default => '不知道干嘛'
    };
    ?>
    image-20230827170127060
    • 对比switch和match

      switch是语句,模糊比较,10'10'会匹配;

      match是表达式,准确比较,10'10'不匹配。

3.2 系统函数

  • 是否存在函数

    !empty()比较好,区别是对于0的判断不一样。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <?php
    // 直接判断不存在的变量会报错
    if($x){
    echo '我是A';
    }
    // 使用isset函数判断,不存在就不会输出
    if(isset($x)){
    echo '我是B';
    }
    // 类似还有empty函数,不存在才输出
    if(empty($x)){
    echo '我是C';
    }
    ?>
    image-20230827170814734
  • 函数

    • 系统函数
    • 自定义函数

官网参考:PHP手册:函数参考

3.2.1 String函数

参考:字符串

1
2
3
4
5
6
7
8
9
10
11
12
13
strlen — 获取字符串长度
strrev — 反转字符串
str_replace — 子字符串替换
trim — 去除字符串首尾处的空白字符(或者其他字符)
explode — 使用一个字符串分割另一个字符串,得到数组
str_split — 将字符串按长度拆分,转换为数组
strpos — 查找字符串首次、n次出现的位置
str_contains — 确定字符串是否包含指定子串
md5 — 计算字符串的 MD5 散列值
strtolower — 将字符串转化为小写
strtoupper — 将字符串转化为大写
str_starts_with — 检查字符串是否以指定子串开头
str_ends_with — 检查字符串是否以指定子串结尾
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
<?php
// 示例
$str = "Mary Had A Little Lamb and She LOVED It So";
$str = strtolower($str);
echo $str; // 打印 mary had a little lamb and she loved it so

// 示例
echo strrev("Hello world!"); // 输出 "!dlrow olleH"

// 示例
$text = "\t\tThese are a few words :) ... ";
$trimmed = trim($text); //These are a few words :) ...


// 赋值: <body text='black'>
$bodytag = str_replace("%body%", "black", "<body text='%body%'>");

// 赋值: Hll Wrld f PHP
$vowels = array("a", "e", "i", "o", "u", "A", "E", "I", "O", "U");
$onlyconsonants = str_replace($vowels, "", "Hello World of PHP");

// 赋值: You should eat pizza, beer, and ice cream every day
$phrase = "You should eat fruits, vegetables, and fiber every day.";
$healthy = array("fruits", "vegetables", "fiber");
$yummy = array("pizza", "beer", "ice cream");
$newphrase = str_replace($healthy, $yummy, $phrase);

// 示例
$str = "Hello Friend"; //待分字符串,每个小段的长度
$arr1 = str_split($str);//默认第二参数个为1
$arr2 = str_split($str, 3);

// 示例
$pizza = "piece1 piece2 piece3 piece4 piece5 piece6";
$pieces = explode(" ", $pizza);
echo $pieces[0]; // piece1
echo $pieces[1]; // piece2

// 示例
$string = 'The lazy fox jumped over the fence';
if (str_contains($string, 'Lazy')) {
echo 'The string "Lazy" was found in the string';
} else {
echo '"Lazy" was not found because the case does not match'; //此为输出
}

// 示例
if (str_ends_with('abc', '')) {
echo "All strings end with the empty string"; //输出
}

// 示例
$str = 'abcdef';
echo strlen($str); // 6

// strpos — 查找字符串首次、n次出现的位置
// 忽视位置偏移量之前的字符进行查找
$newstring = 'abcdef abcdef';
$pos = strpos($newstring, 'a', 1); // $pos = 7, 不是 0

// 示例
$str = 'apple';
if (md5($str) === '1f3870be274f6c49b3e31a0c6728957f') {
echo "Would you like a green or red apple?";
}

?>

3.2.2 array函数

参考:array函数

1
2
3
4
5
6
7
8
9
count — 统计数组、Countable 对象中所有元素的数量
sort — 对数组升序排序
list — 把数组中的值赋给一组变量
array_flip — 交换数组中的键和值
array_keys — 返回数组中部分的或所有的键名
array_values — 返回数组中所有的值
array_merge — 合并一个或多个数组
array_reverse — 返回单元顺序相反的数组
array_search — 在数组中搜索给定的值,如果成功则返回首个相应的键名
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<?php
// 示例
$a[0] = 1;
$a[1] = 3;
$a[2] = 5;
var_dump(count($a));// int(3)

// 示例
$fruits = array("lemon", "orange", "banana", "apple");
sort($fruits);

// 示例
$info = array('coffee', 'brown', 'caffeine');
// 列出所有变量
list($drink, $color, $power) = $info;
echo "$drink is $color and $power makes it special.\n";

// 示例
$input = array("oranges", "apples", "pears");
$flipped = array_flip($input);

// 示例
$array1 = array("color" => "red", 2, 4);
$array2 = array("a", "b", "color" => "green", "shape" => "trapezoid", 4);
$result = array_merge($array1, $array2);

// 示例
$array = array(0 => 'blue', 1 => 'red', 2 => 'green', 3 => 'red');
$key = array_search('green', $array); // $key = 2;

?>

3.3 自定义函数

  • 示例
1
2
3
4
5
6
<?php
function sumup($x,$y,$z=30){
return $x + $y + $z;
}
echo sumup(10,20);
?>
image-20230827180832828

3.4 运算符

1
2
3
四则运算、取余		+ - * / %
自增自减 ++ --
连接字符串 .

数字可以作为字符串直接使用.进行相连,但是必须与.之间有空格分开。

1
=	+=	-=	*=	/=	%=	.=
1
>	>=		<	<=		==	!=		===	  !==
1
2
3
与		或		异或		非
and or xor !
&& ||
  • PHP8新特性
1
数字与字符串比较

3.5 循环

  • 可以加入语句
    • break 结束整个循环流程
    • continue 跳过此次循环次
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php
$num1 = 1;
while($num1<4){
echo $num1 . '<br>';
$num1++;
}

echo '<hr>';

$num2 = 1;
do{
echo $num2 . '<br>';
$num2++;
}while($num2<1);

echo '<hr>';

for($num3=1;$num3<4;$num3++){
echo $num3 . '<br>';
}

?>
image-20230827183038133

3.6 JIT(php8新特性)

  • JIT

    Just-In-Time,即时编译器,最重要的新特性之一,性能提升。

    JIT编译器将作为扩展集成到php中Opcache扩展,用于运行时将某些操作码直接转换为cpu指令。

    仅在启用opcache的情况下,JIT才有效。

  • 这里不解释了,使用方法自行查阅。

四、MySQL数据库

4.1 数据类型

1
2
3
4
5
tinyint		极小整数类型	0,255	-128,127
int 整数 0,4294967295 -2147483648,2147483647
float 单精度浮点数
double 双精度浮点数
decimal 定点小数m,n
1
2
3
4
blob		二进制数据(图片、视频等)
text 长文本数据
char 定长字符串0-255B(很少用)
varchar 变长字符串0-65535B
1
2
3
4
5
year		年		3B		YYYY
date 日期 3B YYYY-MM-DD
time 时间 3B HH:MM:SS
datetime 日期时间 8B YYYY-MM-DD HH:MM:SS
timestamp 时间戳 4B YYYY-MM-DD HH:MM:SS

4.2 PHP操作MySQL

  • PDO

    Php Data Object,php数据对象

    由PDO连接数据库,统一了连接各种数据库的方式。

    image-20230827211351549

    使用方法:

    image-20230827211417658
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
// 连接,进行一次就可以,后面每次只需要直接查询即可
$pdo = new PDO('mysql:host=localhost;dbname=test1','test1','test1.123');
// 添加编码要求,有时可以不用
$pdo->query('SET NAMES utf8;');
// 执行SQL语句,并取出数据保存到变量
$stmt = $pdo->prepare('SELECT * FROM `student`;');
$stmt->execute();
$arr = $stmt->fetchAll();
// 打印看看
print_r($arr);
echo '<hr>';
echo '第一个同学是' . $arr[0]['name'];
?>

image-20230827211203758 image-20230827211236957 image-20230827211837481

4.3 SQL语句

  • 具体的SQL语句,请查看SQL语句Notes

  • 注:由于数据库往往数据很多,不便于全部一次性查询传输,因此,很多时候要用到LIMIT进行分页查询。

五、PHP语法

5.1 超全局变量

  • PHP4.1.0之后启用

    指PHP系统中自带的变量,在一个脚本的全部作用域中都可用。

  • 全局变量

1
2
3
4
5
6
7
8
9
$_GET		收集来自method="get"的表单中的值
$_POST 收集来自method="post"的表单中的值
$_REQUEST 包含$_POST、$_GET、$_COOKIE
$GLOBALS 全部变量的全局组合数组
$_COOKIE 常用于识别用户
$_SESSION 存储关于用户会话session的信息
$_FILES 用来获取通过POST方法上传文件的相关信息
$_SERVER 服务器和执行环境信息
$_ENV 环境变量

$_GET

1
2
3
4
5
6
7
8
9
10
11
12
<?php
if(!empty($_GET)){
print_r($_GET);
echo '<br>';
echo $_GET['id'] . $_GET['name'];
}
?>
<form action="" method="get">
学号:<input type="text" name="id">
姓名:<input type="text" name="name">
<input type="submit" value="点我提交">
</form>
  • 最初:
image-20230827213626444
  • 提交后:
image-20230827213800689

$_POST

1
2
3
4
5
6
7
8
9
10
11
12
<?php
if(!empty($_POST)){
print_r($_POST);
echo '<br>';
echo $_POST['id'] . $_POST['name'];
}
?>
<form action="" method="post">
学号:<input type="text" name="id">
姓名:<input type="text" name="name">
<input type="submit" value="点我提交">
</form>
  • 最初:
image-20230827213948200
  • 提交后:
image-20230827214016851

$_REQUEST

1
2
3
4
5
6
7
8
9
10
<?php
if(!empty($_REQUEST)){
print_r($_REQUEST);
}
?>
<form action="" method="post">
学号:<input type="text" name="id">
姓名:<input type="text" name="name">
<input type="submit" value="点我提交">
</form>
  • 自行写了URL的GET,同时提交POST:
image-20230827214332941

$GLOBALS

1
2
3
4
5
6
7
8
9
10
11
<?php
$x = 20;
if(!empty($GLOBALS)){
print_r($GLOBALS);
}
?>
<form action="" method="post">
学号:<input type="text" name="id">
姓名:<input type="text" name="name">
<input type="submit" value="点我提交">
</form>

image-20230827214607222

5.2 结合MySQL

  • 方法一:POST
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
$pdo = new PDO('mysql:host=localhost;dbname=test1','test1','test1.123');
$pdo->query('SET NAMES utf8;');
?>
<form action="" method="post">
查询学号:<input type="text" name="id">
<input type="submit" value="点我提交">
</form>
查询结果:
<?php
if(!empty($_POST)){
$stmt = $pdo->prepare('SELECT * FROM `student` WHERE `student_id` = ' . $_POST['id'] . ' ;');
$stmt->execute();
$arr = $stmt->fetchAll();
echo $arr[0]['name'];
}
?>
  • 输入3后提交:
image-20230827215850755
  • 方法二:GET
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
$pdo = new PDO('mysql:host=localhost;dbname=test1','test1','test1.123');
$pdo->query('SET NAMES utf8;');
?>
查询结果:
<?php
if(!empty($_GET)){
$stmt = $pdo->prepare('SELECT * FROM `student` WHERE `student_id` = ' . $_GET['id'] . ' ;');
$stmt->execute();
$arr = $stmt->fetchAll();
echo $arr[0]['name'];
}
?>
  • 这里模拟直接写在url里,以后可以写在跳转链接里如www.domain.cn/artile?id=2
image-20230827220225964

5.3 类与对象

  • 类是具有相同属性和操作的一组对象的集合
  • 对象是类的一个实例
  • 成员变量:属性
  • 成员方法:行为
  • 魔术方法
    • __construct构造方法
    • __destruct析构方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?php
class Student{
public $status = '未知status';
public $name = '未知name';

public function __construct($status, $name)
{
$this->status = $status;
$this->name = $name;
}

public function fun1(){
return $this->name . '和fun1';
}
public function __destruct()
{
echo '<hr>';
echo '析构方法执行了';
}
}

$bai = new Student("学生","小白");
echo $bai->status;
echo '<br>';
echo $bai->fun1();
?>
image-20230827222006497
  • 类的三大特性
    • 封装
    • 继承
    • 多态
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// 封装
class Student{
public $id;//默认的,类内、子类、类外 均可见
protected $status;//类内、子类可见,类外不可见
private $name;//类内可见,子类、类外均不可见
// 函数同理
public function fun1(){
return $this->name;
}
protected function fun2(){
return $this->name;
}
private function fun3(){
return $this->name;
}
}
1
2
3
4
5
6
// 继承
class HighSchoolStudent extends Student{

}
$hong = new HighSchoolStudent("高中生","小红");
echo $hong->fun1();
1
2
// 多态
// 实现多态的前提是先继承,再重写方法
  • 类进阶
1
2
3
4
5
6
7
8
9
// 静态成员
class Student{
public static $name;
public static function fun2(){
return Student::$name;
}
}
echo Student::$name;
echo Student::fun2();
1
2
3
4
5
6
7
8
9
10
11
12
// 抽象类
// abstract 关键词定义抽象方法、抽象类
abstract class Student{
protected $name;
abstract public function fun3();
}
// 要具体的类来继承抽象类,并重写抽象方法。抽象类本身无法被实例化。
class HighSchoolStudent extends Student{
public function fun3(){
retrun $this->name;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// 接口
// interface 关键词创建接口。要求类必须实现的方法,但不需要定义方法的具体实现过程。
// implements 关键词使用接口。
interface file{
public function fun4();
public function fun5($x);
}

class Student implements file{
public function fun4(){
return 0;
}
public function fun5($x){
return $x;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 接口常量
// const 创建常量
interface file{
const HOST = "localhost";
const DB = "test1";
const USER = "root";
const PASSWORD = "password"
}

class Student implements file{
private $host = file::HOST;
private $db = file::DB;
private $user = file::USER;
private $password = file::PASSWORD;
}
1
2
3
4
// final 类不能继承
final class Student{

}
1
2
// parent::$name 访问父类
// self::$name 访问本静态类

5.4 命名空间

  • 命名空间

    解决全局成员的命名冲突问题,借鉴了文件目录的思想

    同一目录下不允许重名文件,不同目录下允许同名;

    同一命名空间下不允许重名成员,不同空间下允许同名。

1
2
3
4
5
6
7
8
9
10
11
12
13
// 写法一
namespace one{
const NAME = '小白';
public function fun1(){

}
}
namespace two{
const NAME = '小黑';
public function fun1(){

}
}
1
2
3
4
5
6
7
8
9
10
11
// 写法二
namespace one;
const NAME = '小白';
public function fun1(){

}
namespace two;
const NAME = '小黑';
public function fun1(){

}
  • 子命名空间

    即命名空间再套命名空间

1
2
3
4
5
6
7
8
9
10
11
12
13
namespace one\aa{
const NAME = '小绿';
public function fun1(){

}
}

namespace one\aa\AA{
const NAME = '小黄';
public function fun1(){

}
}
  • 访问命名空间
1
2
3
4
5
echo \two\fun1();
// use 关键词引用命名空间
// as 解决名字过长、重名问题
use \one\aa\AA as t;
echo t\fun1();
  • 引入文件时解决冲突

    文件/one/one.php/two/two.php中均有相同名字的变量或方法。

1
2
3
4
5
6
7
require 'one\one.php';
require 'two\two.php';
use one\one as t1;
use two\two as t2;

echo t1\fun1();
echo t2\fun1();

5.5 php8新特性

  • 构造器属性提升

  • 新增数据类型mixed 任何类型

六、补充内容

来源:CSDN:PHP

6.1 phpinfo()

  • phpinfo是一个函数(功能),这个函数会显示一个当前电脑(服务器)的详细的PHP信息。
1
2
3
<?php
phpinfo();
?>

6.2 其他环境变量

image-20230828155849896

6.3 系统常量

image-20230828155942684

6.4 字符串的声明方法

  • 在PHP语言中声明字符串有三种方式:
    1、用单引号声明
    2、用双引号声明
    3、用字界符声明

字界符声明

1、在变量后面的等号写三个小于号 <<<
2、然后在<<<后面写上字符(建议英文大写字符)
3、然后换行写上任意想写的字符
4、写完后,顶行。在行最开始处,再写上<<<后面的字符和分号。

1
2
3
4
5
6
7
8
9
10
11
12
<?php
$dingjie = <<<ABC
如果
非要在这个测试

面<br />
加上一段
<i>有趣的话</i>
我想说,<h1>努力学习不好么<h1>
ABC;
echo $dingjie
?>

那双引号和单引号有什么区别呢:

  1. 双引号解析变量,但是单引号不解析变量
  2. 在双引号里面插入变量,变量后面如果有英文或中文字符,会把这个字符和变量拼起来,视为一整个变量。一定要在变量后面接上特殊字符,例如空格等分开。
  3. 如果在双引号里面插变量的时候,后面不想有空格,可以拿大括号将变量包起来。
  4. 双引号解析转义字符,单引号不解析转义字符。但是单引号能解析\
  5. 单引号效率高于双引号,尽可能使用单引号
  6. 双引号和单引号可以互相嵌套,双引号中可以插入单引号,单引号当中插入变量,这个变量会被解析。
  7. 神奇的字符串拼接胶水——(.)点,用来拼接字符串。
  8. 一般将定界符声明字符串视为双引号一样的功能来看待。

6.5 查看和判断数据类型

  • gettype(传入一个变量)能获得变量的类型
  • var_dump(传入一个变量)输出变量类型和值
  • 使用is_*系列函数,is_types这一系列的函数,来进行判断某个数据属于哪种类型,如果是这个类型返回真,不是这个类型返回假。
image-20230828160549572
1
2
3
4
5
6
7
8
9
10
11
12
$float = 88.8;
$type = gettype($float);

$str = 'aa';
$type = var_dump($str);

$fo = false;
if (is_bool($fo)) {
echo '执行真区间';
}else{
echo '执行假区间';
}

6.6 位运算

image-20230828160805314
1
2
3
4
5
6
//$x二进制为:
$x=5;
//$y二进制为:
$y=8;
//结果为13
echo $x ^ $y;

6.7 其他运算符

image-20230828160912767
1
echo `ipconfig`;

6.8 文件包含

image-20230828161307968
  • include函数功能实践:
    创建一个functions.php文件,里面写上几个函数。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    <?php
    //functions.php文件
    function demo(){
    echo 'aaaa';
    }
    function test(){
    echo 'bbbb';
    }
    ?>
  • functions.php的同级目录下,在创建一个user.php文件把functions.php文件包含进来。
    这样函数信息就可以专门放在functions.php里面,哪需要用到这些函数的时候,就从哪包含进来。

    1
    2
    3
    4
    5
    6
    7
    <?php
    //user.php
    include "functions.php";
    //可以直接调用
    demo();
    test();
    ?>

6.9 数学常用函数

image-20230828161607956 image-20230828161635687

6.10 字符串常用函数

image-20230828161747968 image-20230828161821803 image-20230828161848093 image-20230828161939637 image-20230828161958685

6.11 时间信息函数

  • getdate
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php 
$mytime = getdate();
echo "年 :".$mytime['year']."\n";
echo "月 :".$mytime['mon']."\n";
echo "日 :".$mytime['mday']."\n";
echo "时 :".$mytime['hours']."\n";
echo "分 :".$mytime['minutes']."\n";
echo "秒 :".$mytime['seconds']."\n";
echo "一个小时中的第几钟 :".$mytime['minutes']."\n";
echo "这是一分钟的第几秒 :".$mytime['seconds']."\n";
echo "星期名称 :".$mytime['weekday']."\n";
echo "月份名称 :".$mytime['month']."\n";
echo "时间戳 :".$mytime[0]."\n";
?>

6.12 操作数组函数

  • 这些函数,也是面试中基础面试中最爱问到的问题。
image-20230828162215673
  • 补充
image-20230828162246858 image-20230828162303216

6.13 PHP正则表达式

  • 正则表达是会在开发中经常看到,它主要用在以下一些地方:

    • 匹配邮箱、手机号码、验证码、替换敏感的关键词。例如:涉及政治和骂人的话
  • PHP的正则表达示定界符的规定如下:

    • 定界符,不能用a-zA-Z0-9\ 其他的都可以用。
    • 必须成对出现,有开始就有结束。
image-20230828162524251 image-20230828162549298 image-20230828162601672 image-20230828162612354
  • 写法
1
2
3
4
5
6
7
8
9
10
11
12
例子						说明
/中间写正则/ 正确
$中间写正则$ 正确
%中间写正则% 正确
^中间写正则^ 正确
@中间写正则@ 正确
(中间写正则) 错误
A中间写正则A 错误

\ 是转义字符,如果在以后正则表达示里面需要匹配/:
写法:/ \/ /
写法:# \/ #
  • 匹配

    preg_match ( string $正则 , string $字符串 , array&$结果] )

    功能:

    根据正则变量 ,匹配字符串变量

    如果存在则返回匹配的个数,把匹配到的结果放到$结果变量里。如果没有匹配到结果返回0。

1
2
3
4
5
6
7
8
9
10
<?php
$zz = '/wq/';
$string = 'ssssswqaaaaaa';
if(preg_match($zz, $string, $matches)){
echo '匹配到了,结果为:';
var_dump($matches);
}else{
echo '没有匹配到';
}
?>

6.14 正则函数

image-20230828163049264

6.15 文件系统管理

我们会点鼠标右键删除文件、会control+c(或右键)复制、粘贴文件,会新建一些文件,检测这个文件是不是只读文件。在电脑里面进行的这些操作,在代码里面如果能操作就好了。因为,如果有了这些操作。我们能做很多事情了:可不可以写入修改配置文件、是不是可以做PHP安装的时候检测文件的权限、是不是可以做生成Html文件等等很多不同的操作,总之其他太多太多的地方用到了文件操作。

读取文件

1、readfile读取文件函数

1
2
readfile ( string: $文件名)
功能:传入一个文件路径,输出一个文件。
1
2
3
4
5
6
7
<?php
//linux类的读了方式
readfile("/home/paul/test.txt");
//windows类的读取方式
readfile("c:\\oldboy\oldboy\boot.ini");
// 注意:上面的代码中windows的斜线是\斜线,可能会转义掉一些字符。因此,我们写的时候写上两个斜线。
?>

2、file_get_contents打开文件函数

1
2
3
4
5
<?php
$filename = 'NoAlike.txt';
$filestring = file_get_contents($filename);
echo $filestring;
?>

3、fopen、fread、fclose操作读取文件

1
2
3
resource fopen	 	    ( string $文件名, string 模式)
string fread ( resource $操作资源, int 读取长度)
bool fclose ( resource $操作资源 )

fopen的模式:

image-20230828163530559
1
2
3
4
5
6
<?php
//你可以创建一个NoAlike.txt,以只读模式打开
$fp = fopen('NoAlike.txt', "r");
//var_dump()操作一下$fp看看效果,输出的是不是只有类型提示的是resource
var_dump($fp);
?>

创建和修改文件内容

1、file_put_contents写入文件

1
2
file_put_contents ( string $文件路径, string $写入数据)
功能:向指定的文件当中写入一个字符串,如果文件不存在则创建文件。返回的是写入的字节长度
1
2
3
4
5
6
7
8
9
10
<?php
$data = "在PHP中文网学好PHP,妹子票子不再话下!";
$numbytes = file_put_contents('test.txt', $data);
if($numbytes){
echo '写入成功,我们读取看看结果试试:';
echo file_get_contents('test.txt');
}else{
echo '写入失败或者没有权限,注意检查';
}
?>

2、fwrite配合fopen进行写入操作

1
2
3
4
5
6
7
8
9
10
11
<?php
$filename = 'test.txt';
$fp= fopen($filename, "w");
$len = fwrite($fp, '我是一只来自北方的狼,却在南方冻成了狗');
fclose($fp);
print $len .'字节被写入了\n';
?>
代码说明:
· 不论有没有新建都会打开文件重新写入
· 原有的文件内容会被覆盖掉
· 文件不存在会创建

创建临时文件

  • 我们之前创建的文件都是永久文件,而创建临时文件在我们平时的项目开发中也非常有用。

    创建临时文件的好处:

    文件操作完成后即删除,不需要去维护这个文件的删除状态。

1
2
3
4
5
6
7
8
9
<?php
//创建了一个临时文件
$handle = tmpfile();
//向里面写入了数据
$numbytes = fwrite($handle, '写入临时文件');
//关闭临时文件,文件即被删除
fclose($handle);
echo '向临时文件中写入了'.$numbytes . '个字节';
?>

移动、拷贝和删除文件

1、重命名文件:

1
2
rename($旧名,$新名);
功能:这个函数返回一个bool值,将旧的名字改为新的名字。
1
2
3
4
5
6
7
8
<?php
//旧文件名
$filename = 'test.txt';
//新文件名
$filename2 = $filename . '.old';
//复制文件
rename($filename, $filename2);
?>

2、复制文件

1
2
copy(源文件,目标文件)
功能:将指定路径的源文件,复制一份到目标文件的位置。
1
2
3
4
5
6
7
8
<?php
//旧文件名
$filename = 'copy.txt';
//新文件名
$filename2 = $filename . '_backup';
//修改名字。
copy($filename, $filename2);
?>

3、删除文件

删除文件就是将指定路径的一个文件删除,不过这个删除是直接删除。使用的是windows电脑,你在回收站看不到这个文件,你只会发现这个文件消失了。

1
unlink(指定路径的文件)
1
2
3
4
5
6
7
8
<?php
$filename = 'test.txt';
if (unlink($filename)) {
echo "删除文件成功 $filename!\n";
} else {
echo "删除 $filename 失败!\n";
}
?>

4、检测文件属性函数

假设安装界面的网址是:install.php,安装的锁文件是install.lock。我们就可以检测install.lock文件是否存在。

1
2
3
4
5
6
<?php
if(file_exists('install.lock')){
echo '已安装,请不要再次进行安装';
exit;
}
?>

文件权限设置

1
2
3
4
5
6
7
<?php
//修改linux系统/var/wwwroot/某文件权限为755
chmod("/var/wwwroot/index.html", 755);
chmod("/var/wwwroot/index.html", "u+rwx,go+rx");
chmod("/somedir/somefile", 0755);
?>

6.16 文件属性函数

image-20230828164401418

6.17 目录处理函数

  • php 目录处理函数处理文件夹的基本思想如下:
    1. 读取某个路径的时候判断是否是文件夹
    2. 是文件夹的话,打开指定文件夹,返回文件目录的资源变量
    3. 使用readdir读取一次目录中的文件,目录指针向后偏移一次
    4. 使用readdir读取到最后,没有可读的文件返回false
    5. 关闭文件目录
image-20230828164525058
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
//设置打开的目录是D盘
$dir = "d:/";
//判断是否是文件夹,是文件夹
if (is_dir($dir)) {
if ($dh = opendir($dir)) {
//读取到最后返回false,停止循环
while (($file = readdir($dh)) !== false) {
echo "文件名为: $file : 文件的类型是: " . filetype($dir . $file) . "<br />";
}
closedir($dh);
}
}
?>

6.18 文件路径函数

  • 我们经常会遇到处理文件路径的情况。例如:
    1. 文件后缀需要取出来
    2. 路径需要取出名字不取目录
    3. 只需要取出路径名中的目录路径
    4. 或者把网址中的各个部份进行解析取得独立值
    5. 甚至是自己组成一个url出来
image-20230828164824785
1
2
3
4
5
6
7
<?php
$path_parts = pathinfo('d:/www/index.inc.php');
echo '文件目录名:'.$path_parts['dirname']."<br />";
echo '文件全名:'.$path_parts['basename']."<br />";
echo '文件扩展名:'.$path_parts['extension']."<br />";
echo '不包含扩展的文件名:'.$path_parts['filename']."<br />";
?>

七、实战补充

7.1 文件留言本

  • 文件结构
1
2
3
index.php		展示输入框和留言内容
write.php 向message.txt写入数据
message.txt 存入聊天内容

index.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?php
//设置时区
date_default_timezone_set('PRC');
//读了内容
@$string = file_get_contents('message.txt');
//如果$string 不为空的时候执行,也就是message.txt中有留言数据
if (!empty($string)) {
//每一段留言有一个分格符,但是最后多出了一个&^。因此,我们要将&^删掉
$string = rtrim($string, '&^');
//以&^切成数组
$arr = explode('&^', $string);
//将留言内容读取
foreach ($arr as $value) {
//将用户名和内容分开
list($username, $content, $time) = explode('$#', $value);
echo '用户名为<font color="gree">' . $username . '</font>内容为<font color="red">' . $content . '</font>时间为' . date('Y-m-d H:i:s', $time);
echo '<hr />';
}
}
?>
<h1>基于文件的留言本演示</h1>
<form action="write.php" method="post">
用户名:<input type="text" name="username" /><br />
留言内容:<textarea name="content"></textarea><br />
<input type="submit" value="提交" />
</form>

write.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
//追加方式打开文件
$fp=fopen('message.txt','a');
//设置时间
$time=time();
//得到用户名
$username=trim($_POST['username']);
//得到内容
$content=trim($_POST['content']);
//组合写入的字符串:内容和用户之间分开,使用$#
//行与行之间分开,使用&^
$string=$username.'$#'.$content.'$#'.$time.'&^';
//写入文件
fwrite($fp,$string);
//关闭文件
fclose($fp);
header('location:index.php');
?>