PHP入门笔记

前言

PHP是什么

简述

PHP (Hypertext Preprocessor 超文本预处理器) 的简称,
是一种被广泛应用的开源通用的服务器端脚本语言,适用于Web开发并可嵌入在HTML中。

// php前身为:Personal HomePage (个人主页)

  • 通用:跨平台,如Windows、Linux、MacOS
  • 开源:意味着你可以轻松获取全部源代码,并进行定制或扩展
  • 免费:意味着你不必为PHP花一分钱,哪怕用在商业项目中
  • 服务器端:意味着你必须将它安装在服务器环境下才可以使用
  • 脚本语言:解释型语言,按编写顺序执行。
%title插图%num

用途

  • 可以快速动态生成HTML页面
  • 可以返回前端需要的各种类型数据
  • 可以高效安全的处理表单数据
  • 可以安全的操作服务器上的文件
  • 可以控制与客户端的会话(Cookie/Session)
  • 可以对用户的行为进行授权控制
  • 可以高效安全的操作各种类型的数据库
  • 通过扩展,可以实现加密,压缩等其他功能
  • 可以提供接口数据,包括小程序、APP等其他语言

程序执行流程

%title插图%num

学习门槛

需要提前对 HTML CSS JavaScript 有一定的知识的了解。

静态网站 与 动态网站

静态网站的特点

1.网页内容一经发布到网站服务器上,无论是否有用户访问,每个静态页面的内容都是保存在网站服务器上的。每个网页都是独立的文件(例如:.html .htm .shtml .xml)
2.静态网页的内容相对稳定,因此容易被搜索引擎检索;
3.静态网站没有数据库支持,后期更新数据和内容时维护较困难;
4.静态网站交互性较差,功能具有局限性;

动态网站的特点

1.网页会根据用户的要求选择而动态的改变和响应。浏览器作为客户端,成为一个动态交流的桥梁。动态网页的交互性也是今后web发展的潮流;
2.无需手动更新HTML文档,便会自动生成新页面,可以大大节省工作量;
3.动态网页与静态网页是相对应的,网页的URL后缀为.asp .jsp .php… 等形式为后缀,在动态网页网址中有一个标志性的符号 “ ? ”

网站基本概念

%title插图%num

服务器

服务器 (Server) 也称伺服器。是提供计算服务的设备。由于服务器需要响应服务请求,并进行处理。因此服务器应具备承担服务并且保障服务的能力。需安装相应软件:(例如 web服务器 需要安装 Apache、tomcat、iis等)

服务器构成包括处理器、硬盘、内存、系统总线等。和通用计算机架构类似。但是由于需要提供高可靠的服务,因此在处理能力、稳定性、可靠性、安全性、可扩展性、可管理性等方面要求较高。

在网络环境下,根据服务器提供的服务类型的不同,分为文件服务器、数据服务器、应用程序服务器、Web服务器等。

IP

IP (Internet Protocol) 网络之间互联协议。网络之间互连的协议也就是为计算机网络相互连接进行通信而设计的协议。它规定了计算机在因特网上进行通信应当遵守的规则。

IP通俗说就是我们电脑在网络的地址,因此IP地址具有唯一性。

域名

域名 (Domain Name) 一般由域名商提供,我们常说的域名指的是网站的地址,实际上域名是该网站IP的面具。我们常为了便于记忆和关联网站的含义去给我们网站购买域名。因此,一个域名的目的是便于记忆和沟通一组都武器的地址 (网站、电子邮箱、FTP等)

另外,特殊域名 localhost 和 127.0.0.1 指的是本机

DNS

DNS (Domain Name System) 域名系统,因特网上作为域名和IP地址相互映射的一个分布式数据库。能够使用户更方便的访问互联网。而不用去记住能够被机器直接读取的IP数串。通过主机名,最终得到该主机名对应的IP地址的过程叫做域名解析。

我们访问域名时,是先找到该域名下的 域名系统 ,再在该域名系统对应的数据库 中找到我们对应的域名IP。最终访问该IP地址。

端口

端口 (Port) 可以认为是设备与外界通讯交流的出口。端口有分 物理端口 和 虚拟端口。我们搭建在因特网所说的端口为虚拟端口。每个端口对应的一个服务软件,当用户访问对应的IP+端口,就等于访问该IP地址下的某项服务。( 如: 80端口通常为访问网站,21端口通常为访问FTP文件服务)

端口不影响DNS解析。一般方式为 如xxx.xxx.xx:80 用户访问 IP地址后,再访问该80端口对应的服务软件,实现不同的网站服务 (端口可能会被占用)

网站访问流程

静态网站访问原理

%title插图%num

用户在本地浏览器输入 域名 ,也就是URL (Uniformed Resource Location) ,发送给DNS服务器进行解析。

DNS服务器会先检索本地 hosts 是否存在记录,若不存在后再访问网络DNS。用于获取域名下的 IP地址。找到后返回给 浏览器 该域名下的IP地址以便进行访问。

浏览器获得了域名下的IP地址后进行该访问请求,找到地址后通过端口找到对应的服务软件。(图中为 Apache 软件,对应着80端口)

Apache 接收请求后,根据用户提供的URL下查找需要的目标文件 并 获取 该文件返回给浏览器进行解析。最终浏览器解析该文件后 呈现 给用户需要的内容。

动态网站访问原理

%title插图%num

与静态网站访问流程相似,

用户在本地浏览器输入 域名 ,也就是URL (Uniformed Resource Location) ,发送给DNS服务器进行解析。

DNS服务器会先检索本地 hosts 是否存在记录,若不存在后再访问网络DNS。用于获取域名下的 IP地址。找到后返回给 浏览器 该域名下的IP地址以便进行访问。

浏览器获得了域名下的IP地址后进行该访问请求,找到地址后通过端口找到对应的服务软件。(图中为 Apache 软件,对应着80端口)

请求的文件为php文件,但Apache 因为无法解析php文件,因此交给PHP引擎进行解析。而PHP文件可能存在数据库。PHP引擎 访问 数据库 并获取需要的数据 并 生成HTML 样式文件发送给 Apache

Apache获得能够识别的HTML文件后,发送给 浏览器 进行解析,最终浏览器解析该文件后 呈现 给用户需要的内容

PHP语法初步

PHP字符解释

序号 组成 描述
1 <?php …> PHP标记
2 PHPcode 函数、数组、流程控制、类、方法…
3 ;、{} 语句结束符
4 空白符 合理使用空白符可增强代码可读性
5 //、/**/ 注释

程序简介

PHP文件的默认扩展名是”.php”,PHP文件可以包含 HTML、CSS、JavaScript 代码。
PHP解释器会通过 <?php> 标记的内容中进行解析 PHP代码。

PHP
<?php
 echo '你好PHP';
?>

运行环境

需要使用PHP的环境依赖,但目前小皮面板已经集合了所有需要的开发环境。
因此推荐使用小皮面板部署需要的PHP开发环境。下载链接

运行版本

该文档内容为 PHP8 的知识内容,同时兼顾 PHP7 以前的知识。

PHP输出

直接输出

PHP想要输出内容 需要使用 echo 或者 print 来输出

PHP
echo 'PHP是世界上最好的语言';
echo 111, 222;
print 111;
PHP变量

使用变量

使用 $变量名 来使用变量,通过 = 赋值运算符赋值

PHP
$seyHi = '你好PHP'; // 驼峰命名
$sey_Hi = '你好啊PHP'; // 下划线命名
$SeyHi = '你好PHP~'; // 大驼峰命名
echo $seyHi, $sey_Hi, $SeyHi;

命名规则

  • 开头不能有数字
  • 中间不能有空格
  • 开头必须用$符号
PHP数据类型

简介

php 的简单数据类型有 布尔型、整数、浮点型、字符串
通过 var_dump() 函数可以打印传入实参的值与它的数据类型

简单数据类型

  • 布尔型 通常用于条件判断
  • 整数型 整数不能包含逗号或空格、整数是没有小数点的、整数可以是负数或正数、也可以
  • 三种格式来指定:(十进制、十六进制、八进制)
  • 浮点型 带小数的数字,可以是正数或负数
  • 字符串 字符串是引号内的数据,如果不用引号来声明则会报错、
    可以是单引号或者双引号,用引号包裹的数字、浮点型、布尔值等也属于字符串

复杂数据类型

php 的复合数据类型有 array(数组)、object(对象)、callable(可调用)、iterable(可迭代)

代码演示

PHP
$num = 1.23; // 浮点型
$bool = true; // 布尔值

var_dump($num); // float(1.23)
var_dump($bool); // bool(true)
PHP数组

数组概念

数组是多个值的集合,数组存的值是一个指向这个集合的下标。数组可以在一个变量中存储多个值

创建数组

通过 array()字面量 来创建 空数组

PHP
$arrs = array(); // 创建空数组
var_dump($arrs);
$arrs = []; // 字面量方式 创建空数组
var_dump($arrs);

创建数组的同时,还可以同时对数组进行 赋值操作

PHP
/*
  默认数组以下标来访问成员
  如若需要以键值对方式访问,可在每个成员中使用 键=>值 方式定义其数组中键与值
*/
// * 方式一
$arr = ['张三', '李四', '王五'];

// * 方式二
$arr_2 = array(
  1,
  2,
  3,
  4,
  5
);
var_dump($arr_2);

// * 访问数组其中一个成员: 数组成员中第二个
echo $arr[1];

// * 数组序号与键混合使用的数组
$array = array(
  'name' => '张三',
  'sex' => '',
  '2333',
  '666',
  'like' => '',
  '777',
);

访问数组成员

PHP数组可以多种方式混合存值,例如以序号方式或者键方式存值,因此也可以通过下标或者键值对的键进行访问

PHP
// * 带有键值对的数组 
// * (有意思的是 php 这种类似对象的键值对方式允许键值对成员 + 下标成员并存)
// * (当成员的索引方式改为键后,该成员不再是原来索引的下标,下标的排序将直接忽略该成员)
$array = array(
  'name' => '张三',
  'sex' => '',
  '2333',
  '666',
  'like' => '',
  '777',
);

echo $array['name']; // 使用键方式查询 张三
echo $array['like']; // 使用键方式查询 猫
echo $array[0]; // 使用下标查询 233
echo $array[1]; // 使用下标查询 666
echo $array[2]; // 使用下标查询 777

// * 使用 print_r() 打印数组所有成员
print_r($array); // Array ( [name] => 张三 [sex] => 男 [0] => 2333 [1] => 666 [like] => 猫 [2] => 777 )

多维数组

数组允许 多维嵌套,即在数组里面存放数组或数组对象

PHP
$arr3 = array(
  array(
    '123',
    '233',
  ),
  array(
    '344',
    true,
  )
);

$arr4 = [
  'smm' => [
    'name' => '屎猫',
    'like' => [
      '画画',
      '摸鱼',
    ]
  ],
  'aipo' => [
    'name' => 'AI婆',
    'like' => [
      '唱歌',
      'rup',
    ]
  ],
  'PHP是最好的语言',
];

访问多维数组成员

通过层层取值,获得多维数组中最终需要的内容

PHP
// * 多维数组选择成员方式
echo $arr4['aipo']['name']

数组循环

使用 foreach 循环数组中的每一项值,

PHP
$arr5 = [
  'name' => '张三',
  'sex' => '',
  'id' => 12300,
];
echo '<hr>';

foreach ($arr5 as $k) {
  // * 遍历 打印值
  echo $k . ' ';
} // * 张三 男 12300

foreach ($arr5 as $k => $v) {
  // * 遍历 键 和 值
  echo $k . '-----' . $v . ' ';
} // * name-----张三 sex-----男 id-----12300
PHP条件判断

三元运算符

通过 ? 进行判断,返回的结果来决定走 : 左侧或右侧的表达式的分支。

PHP
// 5 条件判断
$name1 = '';
$name2 = '屎猫';

// * 三元运算符
echo $name1 ? $name : 'undefind'; // undefind
echo $name2 ? $name2 : 'undefind';// 屎猫

检测变量

判断是否存在变量,或者数组中是否存在该成员通常采用 isset()empty()

isset()函数用于检测变量是否已设置并且非 NULL;返回 true
empty() 则与 isset() 的作用是相反的 是 isset() 的取反结果 !!!! 但 empty() 也同时会将值为 0 的变量返回 true !!!!

PHP
echo isset($arre['name']) ? $arre['name'] : '不存在';

条件判断

下面是 ifif elseif elseifswitchmatch 的演示

PHP
// * if
if ($name2) {
  echo $name2;
}

// * if else
if ($name1) {
  echo $name1;
} else {
  echo '没有定义的值';
}

// * if elseif
if ($name2 == '233') {
  echo '2333';
} elseif ($name2 == '屎猫') {
  echo '是本人了';
} elseif ($name2 == 'AIpo') {
  echo '是AI婆大人';
} else {
  echo 'undefind';
}

// * switch case default
switch ($name2) {
  case 'AIpo':
    echo '我是AI婆';
    break;
  case '屎猫':
    echo '我是屎猫';
    break;
  default:
    echo '不知道是谁';
}

// match (php8新特征)
echo match ($name2) {
  'AI婆' => '<hr>是AI婆大人',
  '屎猫' => '<hr>是屎猫本人',
  'smm' => '<hr>屎猫Pro',
  default => '<hr>不知道是谁',
};
PHP函数

函数是一段可重复执行的代码片段,函数是实现代码复用的重要手段,函数是现代编程语言最重要的基本单元
函数永远是编程的核心工作

内置函数

常用的内置函数为以下几个

strtolower()将字符串转换为小写
strtoupper()将字符串转换为大写
strlen()获取字符串长度
trim()去除字符串首尾处的空白字符(或者其他字符)
ltrim()去除字符串开头的空白字符(或者其他字符)
rtrim()去除字符串结尾的空白字符(或者其他字符)
str_replace()str_replace() 字符串替换
strpbrk()字符串中查找一组字符是否存在
explode()将字符串分割为数组
md5()将字符串进行 md5 加密
count()获取数组中元素数量
implode()把数组元素组合为字符串
in_array()检查数组中是否存在指定的值
array_pop()删除数组中的最后一个元素
其他函数参考可查阅 https://www.php.net/manual/zh/

代码演示

PHP
// 将字符串转换成小写
$ouyang = 'OUYANG';
echo strtolower($ouyang); // ouyang
echo '<hr>';

// 将字符串转换成大写
$miejue = 'meijueshitai';
echo strtoupper($miejue);
echo '<hr>';

// 将字符串分割为数组
$php = '张三,李四,王五,刘六,头七,老八';
print_r(explode('', $php));
echo '<hr>';

// 将字符串进行 MD5 加密
$xinmen = '西门大官人';
echo md5($xinmen);
echo '<hr>';


$arr6 = [
  '',
  'P',
  'H',
  'P',
  '',
  '',
  '',
  '',
  ''
];

// 数组中元素的数量
echo count($arr6);
echo '<hr>';

// 把数组元素组合为字符串
echo implode($arr6);
echo '<hr>';

// 数组中是否存在指定的值 如若有返回 1 否则返回 0
echo in_array('', $arr6);
echo '<hr>';

// 删除数组中的最后一个元素
array_pop($arr6);
echo implode($arr6);
echo '<hr>';
print_r($arr6);

// * 自定义函数
// * 与js类似 以行参接收传入的值,并可在无传值时预先设置默认值 并使用 return 返回出去
function num($num1 = 0, $num2 = 0)
{
  return $num1 + $num2;
}
echo num(1, 6);

// * 命名参数(PHP8新特征) 可不用根据位置,而是根据指定的变量名进行传值
// * 用途 方便赋值时换位置,或者方便指定传值给需要的行参
echo num(num2: 3, num1: 4);
PHP运算符

算数运算符

符号 描述
+ 相加
相减
* 相乘
/ 相除
++ 自增
自减
. 拼接
PHP
var_dump(12 . 11); // 1211 会自行转换为字符串进行拼接
$num2 = 1;
$num3 = 1;
var_dump($num2++); // 1 这种自增写法是先返回自身值后,再执行自增运算
var_dump(++$num3); // 2 这种自增写法是先执行自增运算,再去返回自身值
var_dump($num2 . 3); // 23 变量连接整型 必须在整型前面加空格,否则计算机无法正确辨识拼接操作

赋值运算符

符号 描述
= 赋值运算符
+= 先加后赋值
-= 先减后赋值
*= 先乘后赋值
/= 先除后赋值
%= 先取余后赋值
.= 先拼接后赋值
PHP
$num4 = 12;
var_dump($num4);
$num4 += 5; // 12[自身值] + 5 = 17
var_dump($num4); // 17
$num4 %= 5; // 17[自身值] % 5 = 2
var_dump($num4); // 2
$num4 .= 0; // 2[自身值] . 0 = 20
var_dump($num4);

比较运算符

符号 描述
> 大于
>= 大于等于
< 小于
<= 小于等于
== 等于
!= 不等于
=== 恒等于
!== 恒不等
PHP
var_dump(100 > 200); // false
var_dump(true > false); // true 1 > 0
var_dump('5' > '2'); // true 字符串比较大小的逻辑参考:https://blog.csdn.net/weixin_71792169/article/details/127472173
var_dump('true' == true); // true (PHP不区分类型, 所以她采用一个策略, 当你的字符串为true, 那么她就认为这个变量是布尔值)
var_dump(true == true); // false (不仅比较值 还会比较数据类型)
var_dump('b' > 'a'); // true 字符串之间的比较,是比较两个字符串的 ASCII码 大小 参考内容:https://blog.csdn.net/lxf0613050210/article/details/79961777
var_dump('bbb' > 'bba'); // true (b>a) 字符串之间的 ASCII码 的值的比较,若一直相等,会依次往下比较 直到得出结果

逻辑运算符

符号 描述
and &&
or ||
xor 异或
!
PHP
var_dump(100 && 100); // true && true = true
var_dump(100 || false); // true || false = true
var_dump(100 xor 100); // true xor true = false  异或的逻辑与或类似,只不过当条件都为 true 时,返回 false
var_dump(!100); // !true = false 布尔值的取反操作
PHP循环

介绍

PHP循环有 whilefordo while,循环是为了让某些代码片段重复执行到指定次数

描述

循环应设置一个可变的条件,当条件达成后停止循环
while 、do while 是条件满足时执行循环,只不过 do while 是无论条件满不满足都会先执行一次
for 是条件不满足时执行循环

代码演示

PHP
$num7 = 0;
// * 当 while 括号里的条件不满足时 循环结束
while ($num7 < 10) {
  $num7++;
  echo '<hr>';
  echo $num7;
}

// * 当 for 函数满足参数2的条件时 循环结束
for ($num = 0; $num <= 10; $num++) {
  echo '<hr>';
  echo $num;
}

// * continue、break 可跳过当前循环 或 结束多层循环
for ($num = 0; $num <= 10; $num++) {
  if ($num == 5) {
    continue;
  }
  echo '<hr>';
  echo $num;
}

for ($num = 0; $num <= 10; $num++) {
  if ($num == 5) {
    break;
  }
  echo '<hr>';
  echo $num;
}
JIT

说明

  • 从 PHP8 开始,PHP支持JIT编译器(即时编译器 Just-In-Time),可以极大的提高性能
  • JIT编译器将作为扩展集成到PHP中 Opcache扩展 用于允许时将某些操作码直接转换为从 cpu指令
  • 仅在启动 Opcache扩展 的情况下,JIT才有效
  • Opcache 通过将PHP脚本预编译的字节码存储到共享内存中来提升 PHP 的性能,
    存储预编译字节码的好处就是:省去了每次加载和解析PHP脚本的开销

详细介绍参考以下文档:php中文网知乎

启用方式

小皮面板直接在界面上启动 OPcache 即可

效果

当JIT以后,下次请求的时候,会直接从JIT Buffer中读取执行,数值越大优化力度越大,
相比不开启JIT,开启了以后,耗时降低将近60%,性能提升将近2倍。

PHP
// 返回当前时间戳的微秒数
$start = microtime(true);

$total = 0;
for ($i = 0; $i < 1000000; $i++) {
  $total += $i;
}

echo 'Count:' . $i . 'Total:' . $total . '\n';
echo '---获取的值--' . $num;

// 返回当前时间戳的微秒数
$end = microtime(true);
// 计算相差的时毫秒数
$spend = floor(($end - $start) * 1000);

echo 'Time use:' . $spend . 'ms\n'; // 可以看到开启JTI后这个处理结束时间明显一次比上一次短
操作MYSQL

关于MySql知识,可查阅该 学习资料

说明

PDO(Php Data Object) php数据对象,PHP 通过使用 PDO类提供的功能来操作 mysql数据库。
PDO 统一了PHP访问各种类型数据库的访问方式

%title插图%num

创建和使用PDO对象

通过实例化的方式创建PDO数据对象,并配置连接MYSQL数据库认证对象;
通过SQL语句,并使用 fetchAll() 获取对应数据;

PHP
// 实例化对象 并传入mysql配置对象 地址 数据库名 账号 密码
$pdo = new PDO('mysql:host=localhost;dbname=my_db_01', 'root', 'smmmax');
// 创建 sql语句
$stml = $pdo->prepare('SELECT * FROM boke');
// 执行 sql语句
$stml->execute();
// 获取 sql语句 返回的所有数据
$arr = $stml->fetchAll();
// 打印
print_r($arr);

效果展示

%title插图%num

解决数据乱码问题

手动进行设置sql返回数据的编码类型

PHP
// 1. 默认不是长连接,若要使用数据库长连接,需要在最后加如下参数
$pdo = new PDO('mysql:host=localhost;dbname=my_db_01', 'root', 'smmmax',array(PDD::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
// 2. 修改HTTP协议 头部
header('content-type:text/html;charset-utf-8');
// 3. (不确定) 配置返回值的字体编码
$pdo->query('SET NAMES utf8');
PHP超级全局变量

前言

PHP超级全局变量指的是PHP系统中自带的变量,在一个脚本的全部作用域中都可用。
该特性在PHP4.1.0之后被启用

变量概况

变量 描述
$_GET 收集来自 method=”get” 的表单中的值
$_POST 收集来自 method=”post” 的表单中的值
$_REQUEST 包含 $POST、$_GET 和 $_COOKIE
$_GLOBALS 全部变量的全局组合数组
$_COOKIE 常用于识别用户
$_SESSION 存储关于用户会话(session)的信息
$_FILES 用来获取通过 POST 方法上传文件的相关信息
$_SERVER 服务器和执行环境信息
$_ENV 环境变量

变量演示

  • $_GET 获取页面中提交的GET请求的数据
PHP
    <?php
    // 若有提交的 GET参数
    if (!empty($_GET)) {
        // 打印 GET提交的内容数组
        print_r($_GET);
    }
    ?>
    <form action="" method="get">
        <input type="text" name="user">
        <input type="password" name="password">
        <input type="submit" value="提交">
    </form>

效果演示

%title插图%num
  • $_POST 获取页面中提交的POST请求的数据
PHP
  <?php
    // 若有提交的 POST参数
    if (!empty($_POST)) {
        // 打印 POST提交的内容数组
        print_r($_POST);
    }
    ?>
    <form action="" method="post">
        <input type="text" name="user">
        <input type="password" name="password">
        <input type="submit" value="提交">
    </form>

效果展示

%title插图%num
  • $_REQUEST 同时获取页面中的 GET 和 POST 的请求数据
PHP
    <?php
    // 若有提交的请求参数
    if (!empty($_REQUEST)) {
        // 打印 REQUEST提交的内容数组
        print_r($_REQUEST);
    }
    ?>
    <form action="" method="post">
        <input type="text" name="user">
        <input type="password" name="password">
        <input type="submit" value="提交">
    </form>

效果演示

%title插图%num
  • $_GLOBALS 获取所有全局变量 ($_GET、$_POST、$_COOKLE、$_FILES 并它本身 与所有变量)
PHP
    <?php
    $mydata='PHP语言';
        // 打印 $GLOBALS 值
        print_r($GLOBALS); // GET参数、PSOT参数...变量参数
    ?>
    <form action="" method="post">
        <input type="text" name="user">
        <input type="password" name="password">
        <input type="submit" value="提交">
    </form>

效果展示

%title插图%num