PHP基础学习

建环境

安装 phpstudy

首先 安装 phpstudy
有着集成环境,比较方便,image.png
先启动 apache,尝试访问下,本地 80端口,看是否搭建成功
在浏览器输入

localhost

image.png

站点创建成功后,开始安装 phpstorm

安装 phpstorm

image.png

运行 phpstudy
先选择免费登录 30 天,可以在tb 买一个激活码
image.png
这里 可以 对 主题进行设置,设置自己喜欢得界面
image.png

在新建 一个项目之前,先 在phpstudy 上创建一个 站点
image.png

在浏览器访问 刚刚创建的站点,

www.xiaoqi.com

image.png

创建第一个php页面

返回 phpstrom 创建一个新项目,将项目的存放地址改为 所创建的目录下
image.png
image.png

然后选择 新项目,点击创建php页面
image.png
新建info.php 页面, 在里面写入

<?php
phpinfo();
?>

然后在浏览器 加上 后缀 重新访问

http://www.xiaoqi.com/info.php

image.png
环境搭建成功
开始学习之旅

PHP学习

1. PHP 简述

PHP(全称:PHP:Hypertext Preprocessor,即"PHP:超文本预处理器")是一种通用开源脚本语言。
在一个php文件中可以包括以下内容:

  • PHP 文件可包含文本、HTML、JavaScript代码和 PHP 代码
  • PHP 代码在服务器上执行,结果以纯 HTML 形式返回给浏览器
  • PHP 文件的默认文件扩展名是 “.php”

php的使用:

  1. PHP 可以生成动态页面内容
  2. PHP 可以创建、打开、读取、写入、关闭服务器上的文件
  3. PHP 可以收集表单数据
  4. PHP 可以发送和接收 cookies
  5. PHP 可以添加、删除、修改您的数据库中的数据
  6. PHP 可以限制用户访问您的网站上的一些页面
  7. PHP 可以加密数据

2. 基本语法格式

PHP 脚本以 <?php 开始,以 ?> 结束

<?php
?>

注释

/*

  • 多行注释,跟java的注释方法相同
  • */

变量的命名

基础格式

变量以 $ 符号开始,后面跟着变量的名称

<?php
$name;
?>
命令规则
  • 变量名必须以字母或者下划线字符开始
  • 变量名只能包含字母数字字符以及下划线(A-z、0-9 和 _ )
  • 变量名不能包含空格
变量的声明

//php的变量声明是以$开始的

<?php
$name = xiaoqi;
?>

/*static的关键字的使用

  • 当一个函数完成时,它的所有变量通常都会被删除。
  • 然而,有时候您希望某个局部变量不要被删除。
  • 要做到这一点,请在您第一次声明变量时使用 static 关键字:
  • */

3. 数据类型、常量、字符串

数据类型

php有5种数据类型:String(字符串), Integer(整型), Float(浮点型), Boolean(布尔型), Array(数组), Object(对象), NULL(空值)

<?php 
$a = "字符串类型";
$b = 1234;//整形
$c = -3.1415;//浮点型
$d = 8E-3;
$e = true;//boolean类型
$f = array("A","B","C");//数组类型
class obj{//php对象的声明
    var $num;
    function name() { }
}
$o = new obj();//对象实例化类型
$g = NULL;//NULL
var_dump($a);var_dump($b);var_dump($c);var_dump($d);
var_dump($e);var_dump($f);var_dump($o);var_dump($g);
?>

常量

常量:常量是一个简单值的标识符。该值在脚本中不能改变。(在整个脚本中都能使用)

一个常量由英文字母、下划线、和数字组成,但数字不能作为首字母出现。 (常量名不需要加 $ 修饰符)。
设置常量,使用 define() 函数,函数语法如下:
bool define ( string $name , mixed $value [, bool $case_insensitive = false ] )
该函数有三个参数:
name:必选参数,常量名称,即标志符。
value:必选参数,常量的值。
case_insensitive :可选参数,如果设置为 TRUE,该常量则大小写不敏感。默认是大小写敏感的。

<?php 
// 常量
define("CL", "这是一个全局常量", true);
echo CL; // 默认false,变量名区分大小写
echo cl; // true不区分大小写
?>

预定义常量

PHP预定义了许多常量,这些常量无需使用define()函数定义,可直接在程序中使用。下面列举了一些常用的PHP预定义常量。

(1)FILE(FILE前后分别是两个下画线):当前正在处理的脚本文件名,若使用在一个被引用的文件中(include或require),那么 它的值就是被引用的文件,而不是引用它的那个文件。
(2)LINE(LINE前后分别是两个下画线):正在处理的脚本文件的当前行数。
(3)PHP_VERSION:当前PHP预处理器的版本,如5.4.16。
(4)PHP_OS: PHP所在的操作系统的类型。如Linux。
(5)TRUE:表示逻辑真。FALSE:表示逻辑假。NULL:表示没有值或值不确定。
(6)DIRECTORY_SEPARATOR: 表示目录分隔符,UNIX或Linux操作系统环境时的值为“ / ”, Window操作系统环境时的值为“ \ ”

<?php
echo __FILE__;
echo "<br/>";
echo __LINE__;
echo "<br/>";
echo PHP_VERSION;
echo "<br/>";
echo PHP_OS;
echo "<br/>";
echo DIRECTORY_SEPARATOR;
?>

整型

整数类型:保存整数数值(范围限制),4个字节存储数据。PHP中默认为有符号。
在PHP中提供四种整形的定义方式,十进制定义,二进制定义,八进制定义和十六进制定义
$a = 120 //十进制
$a = 0b110 //二进制
$a = 0120 //八进制
$a = 0x120 //十六进制

// 使用echo输出时。默认输出为十进制
decbin() // 十进制转二进制
decoct() // 十进制转八进制
dechex() // 十进制转十六进制
bindec() // 二进制转十进制
bin2hex() //二进制转十六进制

字符串

字符串:字符串变量用于存储并处理文本。
ps:
单双引号
双引号 里面有变量 会 输出变量的值
单引号 如果里面有变量都作为一个字符串处理

<?php

$name='xiaoqi';
//双引号 里面有变量 会 输出变量的值
$str ="这是 $name 的全栈渗透测试培训,这是一个比较高质量的课程,一个很大的体系 欢迎来学习。";
//单引号 如果里面有变量都作为一个字符串处理
$str1 ='这是 $name 的全栈渗透测试培训,这是一个比较高质量的课程,一个很大的体系 欢迎来学习。';
echo $str;
echo $str1;

?>

。 是连接 运算符

<?php 
// 字符串
$text1 = "hello";
$text2 = "world";
echo $text1 . " " . $text2; // "."是并置运算符(连接)
echo "返回字符串的长度:", strlen($text1);
echo "返回子串的第一次位置:", strpos($text1, "l");
?>

字符的操作函数

addcslashes —以 C 语言风格使用反斜线转义字符串中的字符
addslashes —使用反斜线引用字符串
bin2hex —函数把包含数据的二进制字符串转换为十六进制值
chop — rtrim 的别名
chr —返回指定的字符
chunk_split —将字符串分割成小块
convert_cyr_string —将字符由一种 Cyrillic 字符转换成另一种
convert_uudecode —解码一个 uuencode 编码的字符串
convert_uuencode —使用 uuencode 编码一个字符串
count_chars —返回字符串所用字符的信息
crc32 —计算一个字符串的 crc32 多项式
crypt —单向字符串散列
echo —输出一个或多个字符串
explode —使用一个字符串分割另一个字符串
fprintf —将格式化后的字符串写入到流
get_html_translation_table —返回使用 htmlspecialchars 和 htmlentities 后的转换表
hebrev —将逻辑顺序希伯来文(logical-Hebrew)转换为视觉顺序希伯来文(visual-Hebrew)
hebrevc —将逻辑顺序希伯来文(logical-Hebrew)转换为视觉顺序希伯来文(visual-Hebrew),并且转换换行符
hex2bin —转换十六进制字符串为二进制字符串
html_entity_decode — Convert HTML entities to their corresponding characters
htmlentities —将字符转换为 HTML 转义字符
htmlspecialchars_decode —将特殊的 HTML 实体转换回普通字符
htmlspecialchars —将特殊字符转换为 HTML 实体
implode —将一个一维数组的值转化为字符串
join —别名 implode
lcfirst —使一个字符串的第一个字符小写
levenshtein —计算两个字符串之间的编辑距离
localeconv — Get numeric formatting information
ltrim —删除字符串开头的空白字符(或其他字符)
md5_file —计算指定文件的 MD5 散列值
md5 —计算字符串的 MD5 散列值
metaphone — Calculate the metaphone key of a string
money_format —将数字格式化成货币字符串
nl_langinfo — Query language and locale information
nl2br —在字符串所有新行之前插入 HTML 换行标记
number_format —以千位分隔符方式格式化一个数字
ord —转换字符串第一个字节为 0-255 之间的值
parse_str —将字符串解析成多个变量
print —输出字符串
printf —输出格式化字符串
quoted_printable_decode —将 quoted-printable 字符串转换为 8-bit 字符串
quoted_printable_encode —将 8-bit 字符串转换成 quoted-printable 字符串
quotemeta —转义元字符集
rtrim —删除字符串末端的空白字符(或者其他字符)
setlocale —设置地区信息
sha1_file —计算文件的 sha1 散列值
sha1 —计算字符串的 sha1 散列值
similar_text —计算两个字符串的相似度
soundex — Calculate the soundex key of a string
sprintf — Return a formatted string
sscanf —根据指定格式解析输入的字符
str_contains — Determine if a string contains a given substring
str_ends_with — Checks if a string ends with a given substring
str_getcsv —解析 CSV 字符串为一个数组
str_ireplace — str_replace 的忽略大小写版本
str_pad —使用另一个字符串填充字符串为指定长度
str_repeat —重复一个字符串
str_replace —子字符串替换
str_rot13 —对字符串执行 ROT13 转换
str_shuffle —随机打乱一个字符串
str_split —将字符串转换为数组
str_starts_with — Checks if a string starts with a given substring
str_word_count —返回字符串中单词的使用情况
strcasecmp —二进制安全比较字符串(不区分大小写)
strchr —别名 strstr
strcmp —二进制安全字符串比较
strcoll —基于区域设置的字符串比较
strcspn —获取不匹配遮罩的起始子字符串的长度
strip_tags —从字符串中去除 HTML 和 PHP 标记
stripcslashes —反引用一个使用 addcslashes 转义的字符串
stripos —查找字符串首次出现的位置(不区分大小写)
stripslashes —反引用一个引用字符串
stristr — strstr 函数的忽略大小写版本
strlen —获取字符串长度
strnatcasecmp —使用“自然顺序”算法比较字符串(不区分大小写)
strnatcmp —使用自然排序算法比较字符串
strncasecmp —二进制安全比较字符串开头的若干个字符(不区分大小写)
strncmp —二进制安全比较字符串开头的若干个字符
strpbrk —在字符串中查找一组字符的任何一个字符
strpos —查找字符串首次出现的位置
strrchr —查找指定字符在字符串中的最后一次出现
strrev —反转字符串
strripos —计算指定字符串在目标字符串中最后一次出现的位置(不区分大小写)
strrpos —计算指定字符串在目标字符串中最后一次出现的位置
strspn —计算字符串中全部字符都存在于指定字符集合中的第一段子串的长度。
strstr —查找字符串的首次出现
strtok —标记分割字符串
strtolower —将字符串转化为小写
strtoupper —将字符串转化为大写
strtr —转换指定字符
substr_compare —二进制安全比较字符串(从偏移位置比较指定长度)
substr_count —计算字串出现的次数
substr_replace —替换字符串的子串
substr —返回字符串的子串
trim —去除字符串首尾处的空白字符(或者其他字符)
ucfirst —将字符串的首字母转换为大写
ucwords —将字符串中每个单词的首字母转换为大写
vfprintf —将格式化字符串写入流
vprintf —输出格式化字符串
vsprintf —返回格式化字符串
wordwrap —打断字符串为指定数量的字串

4.运算符

基本运算符

运算符名称描述实例结果
x+yx和y的和2+24
x-yx和y的差5-23
x*yx和y的积5*210
x/yx和y的商15/53
x%y模(求余数)x除以y的余数5%21
-x取反x取反-2-2
a.b并置连接两个字符串“Hi”.“Ha”HiHa

赋值运算符

运算符等同于描述
x=yx=y左操作数被设置为右边侧表达式的值
x+=yx=x+y
x-=yx=x-y
x*=yx=x*y
x/=yx=x/y
x%=yx=x%y模(求余数)
a.=ba=a.b连接a、b两个字符串

递增、递减运算符

运算符}名称名称描述
++x预递增x 加 1,然后返回 x
x++后递增返回x,然后x 加 1
–x预递减x 减 1,然后返回x
x–后递减返回x,然后x 减 1

比较运算符

运算符名称描述实例
x==y等于如果x等于y,则返回true5==8 返回false
x===y绝对等于如果x等于y,且他们的类型相同,则返回 true5===‘5’返回false
x!=y不等于如果x不等于y,则返回true5!=8 返回 true
x<>y不等于如果x不等于y,则返回true5<>8 返回 true
x !==y绝对不等于如果x不等于y,或者类型不相同,则返回true5!==“5” 返回 true
x>y大于如果x大于y,则返回true5>8 返回 false
x<y小于如果x小于y 则返回 true5<8 返回 true
x>=y大于等于如果x大于或者等于y,则返回true5>=8 返回 false
x<=y小于等于如果x小于或者等于y,则返回true5<=8 返回 true

逻辑运算符

运算符名称描述实例
x and y如果x和y都为true,则返回truex=6
y=3
(x<10 and y>1) 返回 true
x or y如果x和y至少有一个为true,则返回truex=6
y=3
(x6 or y6) 返回 true
x && y异或如果x和y,有且仅有一个为true,则返回truex=6
y=3
(x6 xor y3) 怎返回false
x && y如果x和y都为true,则返回truex=6
y=3
(x<10 && y>1) 返回 true
x || y如果x和y至少有一个为true,则返回truex=6
y=3
(x6 || y6) 返回 true
!x如果x不为true,则返回turex=6
y=3
!(x==y) 返回 true

三目运算符 (三元运算符)

(expr1) ? (expr2) : (expr3)
(expr1)—写表达式,判断
为真 返回 (expr2),为假,返回(expr3)
例子
x=4 y=6
判断 x和y是否相等,相等输出真,不相等输出假

<?php
  $a = 3;
$b = 5;
//判断a和b是否相等,用三目运算符
$c = ($a==$b?"真":"假");
echo $c;
?>

5. 控制语句

控制语法的语句结构和其他大多数语言结构相同,有以下两类:

  • 条件控制语句
  • 循环控制语句

条件控制语句

if 语句- 在条件成立时执行代码

例子 用if 判断 a和b 是否相等,若是不相等 输出语句

<?php

    $a=3;
    $b = 2;
    if($a != $b)
    {
        echo "a和b不相等";
    }
?>
if…else语句 - 在条件成立时执行一块代码,条件不成立时执行另一块代码

例子 用if 判断 a和b 是否相等,相等则输出 语句1 ,若是不相等 输出语句2

<?php

    $a=3;
    $b = 2;
    if($a == $b)
    {
        echo "a和b相等";
    }
    else
    {
        echo "a和b不相等";
    }
?>
if…elseif…else语句
  • 在若干条件之一成立时执行一个代码块
    例子,判断成绩
<?php

    $score = 80;
    if($score>=90)
    {
        echo "成绩为优秀!";
    }
    elseif ($score>=80)
    {
        echo "成绩为良好";
    }
    elseif ($score>=60)
    {
        echo "成绩为一般";
    }
    else
    {
        echo "成绩不及格";
    }
?>
switch语句
  • 在若干条件之一成立时执行一个代码块
    原理: 工作原理:首先对一个简单的表达式 n(通常是变量)进行一次计算。将表达式的值与结构中每个 case 的值进行比较。如果存在匹配,则执行与 case 关联的代码。代码执行后,使用 break 来阻止代码跳入下一个 case 中继续执行。default 语句用于不存在匹配(即没有 case 为真)时执行。
    判断成绩
<?php

    $score = 80;
    switch ($score)
    {
        case $score>=80:
            echo "成绩为优秀"; 
            break;
        case $score>=60:
            echo "成绩为一般";
            break;
        default:
            echo "成绩不及格";
    }
?>

循环控制语句

while 循环
  • 只要指定的条件成立,则循环执行代码块
    例子 输出 1-100的和 5050
<?php
	$i=1;
	$sum=0;
	while($i<=100)
	{
  	  $sum+=$i;
  	  $i++;
	}
	echo $sum;
?>
do…while 循环
  • 首先执行一次代码块,然后在指定的条件成立时重复这个循环
    无论条件成立与否,首先执行一次,然后在进行判断
<?php
	$a='hello world';
	do{
   	 echo $a;
	}
	while(0)
?>
for 循环
  • 循环执行代码块指定的次数
    例子,用for 求 1到100 的和 5050
<?php
    $sum = 0;
    for ($i=1;$i<101;$i++)
    {
        $sum+=$i;

    }
    echo $sum;
?>
foreach
  • 根据数组中每个元素来循环代码块
结束语句
  • break语句
  • continue语句

更多的时候搭配 switch 语句 使用
break语句
用于终止本次循环


<?php
	$favcolor="red";
	switch ($favcolor)
	{
	case "red":
   	 echo "你喜欢的颜色是红色!";
   	 break;
	case "blue":
   	 echo "你喜欢的颜色是蓝色!";
   	 break;
	case "green":
   	 echo "你喜欢的颜色是绿色!";
    	break;
	default:
   	 echo "你喜欢的颜色不是 红, 蓝, 或绿色!";
	}
?>

continue语句
作用是跳出本次循环,接着执行下一次循环

<?php
    $index = 10;
    do
        {
            $index = $index + 1;
            if( $index == 15 )
            { // index 等于 15 时跳过
            continue;
            }
            echo "index的值为:$index";
            echo "</br>";
        }while ($index < 20)
?>

6.数组

数组是一个能在单个变量中存储多个值的特殊变量。
在 PHP 中,array() 函数用于创建数组:

array();

在 PHP 中,有三种类型的数组:

  • 数值数组 - 带有数字ID 键的数组
  • 关联数组 - 带有指定的键的数组,每个键关联一个值
  • 多维数组 - 包含一个或多个数组的数组
<?php
  $array1 = array('a','b','c');
echo count($array1);  // 统计数组得长度
echo "<br/>";
print_r($array1); // 用于打印变量 ,以更容易理解得形式展示
echo "<br/>";
$array2 = array('a1'=>'php','a2'=>'java','a3'=>'python'); //关联数组  键=>值
print_r($array2);
echo "<br/>";
$array2 = array('a1'=>'php','a2'=>'java','a3'=>'python',$array1); // 多维数组 可以包含多个数组
print_r($array2);  
?>

ps :

  • print_r():用于打印变量 ,以更容易理解得形式展示

数组的声明

使用 array 来声明

array ();

$array1 = array();

<?php
$cars=array("Volvo","BMW","Toyota");//简单的数组
echo count($cars);//count()返回数组的长度
echo "<br/>";
$age=array("Peter"=>"35","Ben"=>"37","Joe"=>"43");//关联数组
echo "Peter is " . $age['Peter'] . " years old.";
?>

还可以 直接 定义 数组,不适用array

$array3 = [‘1’,‘2’,‘3’];

关联数组得遍历方法
  1. 用foreach
<?php
  $array2 = array('a1'=>'php','a2'=>'java','a3'=>'python');
	foreach($array2 as $key => $value)
	{
  	echo $key."---".$value.'</br>';
	}
?>

结果
image.png

  1. 用for 来遍历
<?php
  $array1 = array('a','b','c');
	for ($i=0;$i<=count($array1);$i++)
	{
   	 echo $array1[$i].'</br>';
	}
?>

PHP中多个数组排序的内置函数

命令描述
sort()- 对数组进行升序排列
rsort()- 对数组进行降序排列
asort()- 根据关联数组的值,对数组进行升序排列
ksort()- 根据关联数组的键,对数组进行升序排列
arsort()- 根据关联数组的值,对数组进行降序排列
krsort()- 根据关联数组的键,对数组进行降序排列
<?php
$array1 = array('a','b','c');

echo rsort($array1); // 对数组进行降序排序,变成 cba (升序:sort)
print_r($array1);
echo '</br>';

$array3=array('a1'=>'1','a2'=>'2','a3'=>'3');
echo arsort($array3); // 根据关联数组的值,进行 降序排序(升序:asort)
print_r($array3);
echo '</br>';

echo krsort($array3);  // 根据关联数组的键,进行 降序排序(升序:ksort)
print_r($array3);  
?>

数组的操作

数组的输出
1.使用print_r()输出数组
print_r()函数用于以更容易理解的形式打印变量,

通过print_r()函数可以将整个数组的内容及结构进行输出,且会按照一定格式显示键和元素。
ps:如果觉得代码太长不利阅读,可以在让代码原样输出
echo ‘

’;

2. 使用var_dump()输出数组

同print_r()函数类似,var_dump()函数也可以可以将整个数组的数据内容及结构进行输出。
不过var_dump()比 print_r() 更强大,可以同时打印多个变量且给出变量的类型信息。
var_dump()函数可以输出变量的相关信息(类型与值),输出数组时,数组将递归展开值,通过缩进显示其结构。

3.使用echo/print输出数组

echo()用于输出一个或多个字符串。
严格来讲 echo 并不是一个函数,它实际上是一种语言结构;因此不一定必须使用小括号来指明参数,使用单引号、双引号也可以。
然而,如果向 echo() 传递一个以上的参数,那么就不能使用小括号了,因为将会生成解析错误。
print()和echo()有点类似(它实际上也是一种语言结构),但不同点是echo可以接受多个参数并且没有返回值,而print()只能接受一个参数并且有返回值。
使用echo/print进行数组输出时,只能对某数组中的某一元素进行输出。

<?php
header("Content-type:text/html;charset=utf-8");
$array= array("香蕉","苹果","梨子","橙子","橘子","榴莲");
//输出语句
echo '$array[0] = '.$array[0].'<br>';
echo '$array[1] = '.$array[1].'<br>';
echo '$array[2] = '.$array[2].'<br>';

print '$array[3] = '.$array[3].'<br>';
print '$array[4] = '.$array[4].'<br>';
print '$array[5] = '.$array[5].'<br>';
?>
数组的合并

array_merge();
合并 array1和array2

<?php
	$array1 = array('a','b','c');
	$array2 = array('a1'=>'php','a2'=>'java','a3'=>'python');
	$array3 = array_merge($array1,$array2);  //合并 array1 和array2 两个数组
	print_r($array3);
?>
数组的添加

array_push() 函数向第一个参数的数组尾部添加一个或多个元素(入栈),然后返回新数组的长度。
例子: 给 array1 添加 d,e
用 array_push() 函数函数 添加

<?php
	$array1 = array('a','b','c');
	array_push($array1,'d','e');
	print_r($array1);
?>

或者 下标为空,则自动添加内容

<?php
  $array1 = array('a','b','c');
	$array1[]='f';
	print_r($array1);
?>

或者 输入键值和内容

<?php
  $array1 = array('a','b','c');
	$array1[6] ='g';
	print_r($array1);
?>
添加到指定位置

利用函数 array_splice()函数
array_splice(数组,位置,删除几个,增加元素)
例子:给array1数组 中,b的位置后面添加xlz,

<?php
  $array1 = array('a','b','c');
// 指定位置 添加
array_splice($array1,1,0,'xlz');
//插入到 array1 数组中, 第1 个位置,删除0个元素,插入xlz
print_r($array1);
?>
数组的删除

删除某一个元素
array_splice(数组,位置,删除几个)
例子,删除 array1 数组中的 xlz

<?php
  $array1 = array('a','b','c');
// 删除某一元素,删除 xlz
array_splice($array1,1,1);
// 删除 ayyay1数组中, 位置1,删除一个元素
print_r($array1);
?>

销毁指定的元素
unset 销毁指定的元素

  • 利用元素下标删除
  • 利用 键值删除

array_pop():将数组最后一个单元弹出(出栈)
利用 array_pop() 函数 ,将 最后一个函数弹出去 ,也可以起到一个删除数组元素的效果

<?php
  $array1 = array('a','b','c');
	$array2 = array('a1'=>'php','a2'=>'java','a3'=>'python');
// 利用下标
unset($array1[0]); // 删除 下标为0的元素
print_r($array1);
echo '</br>';

// 删除 键值
unset($array2['a2']); // 删除 键值为 ’a2‘ 的值
print_r($array2);
echo '</br>';

// 利用 array_pop()函数,将最后一个函数弹出,也能起到删除的效果;
array_pop($array2);  // 吧array数组中的最后一个值 弹出
print_r($array2);
?>
数组 常用的函数

is_array 判断是否为数组

<?php
$array2 = array('a1'=>'php','a2'=>'java','a3'=>'python');
echo is_array($array2);  //判断是否为数组,若为数组则输出1,不是 就不显示或者输出0
echo '</br>';
?>

count 数组的元素数目

<?php
$array1 = array('a','b','c'); 
echo count($array1); // 统计数组中的元素个数
echo '</br>';
?>

array_search —在数组中搜索给定的值,如果成功则返回相应的键名

<?php
$array2 = array('a1'=>'php','a2'=>'java','a3'=>'python');
echo array_search('php',$array2);
// 在数组中 搜索给定的值,如果搜索到,则返回相应的键名
echo '</br>';
?>

**array_key_exists()**在给定的 key 存在于数组中时返回 TRUE

<?php
$array2 = array('a1'=>'php','a2'=>'java','a3'=>'python');  
echo array_key_exists('a1',$array2);
// 给定的key ,存在于数组中是返回true
?>

array_unshift() 将传入的单元插入到 array 数组的开头。注意单元是作为整体被插入的,因此传入单元将保持同样的顺序。所有的数值键名将修改为从零开始重新计数,所有的文字键名保持不变

<?php
  $array1 = array('a','b','c');
array_unshift($array1,'xlz'); 
//将 xlz 插入到 array1数组, 并且所有数值的键名重零开始重新计数
echo "<pre>";
print_r($array1);
?>

array_shift() 将array 的第一个单元移出并作为结果返回,将 array 的长度减一并将所有其它单元向前移动一位。所有的数字键名将改为从零开始计数,文字键名将不变。

<?php
$array1 = array('xlz','a','b','c');
array_shift($array1);
//将 array1 数组中的第一个元素删除,并将array1的长度减一,所有键值从零开始重新技术。文件键值不变
echo "<pre>"; // 代码原样输出
print_r($array1);
?>

array_unique() 接受 array 作为输入并返回没有重复值的新数组。注意键名保留不变。 array_unique() 先将值作为字符串排序,然后对每个值只保留第一个遇到的键名,接着忽略所有后面的键名。这并不意味着在未排序的 array 中同一个值的第一个出现的键名会被保留。

<?php
$array4=['11','2','3','11'];
print_r(array_unique($array4));
//用于移除数组中的重复值,只保留第一个值,其他的被移除。
?>

in_array —检查数组中是否存在某个值 如果找到指定的值则返回 TRUE,否则返回 FALSE 。in_array()是区分大小写的。

<?php
  $array4=['11','2','3','11'];
echo in_array('2',$array4); 
//检查数组中是否存在 2,如果找到返回true,未找到返回false,注意是区分大小写的
?>

7.函数

PHP 的真正力量来自它的函数:它拥有超过 1000 个内建的函数。

定义函数

PHP 用户定义函数
除了内建的 PHP 函数,我们可以创建我们自己的函数。

什么是函数
函数是可以在程序中重复使用的语句块。
页面加载时函数不会立即执行。
函数只有在被调用时才会执行。

在 PHP 创建用户定义函数
用户定义的函数声明以单词 “function” 开头:

<?php
  function funcationName()
  {
  
  }
?>

注释:函数名能够以字母或下划线开头(而非数字)。不可以是数字
注释:函数名对大小写不敏感。
提示:函数名应该能够反映函数所执行的任务
无参数得函数

<?php
// 无参函数
function getname()
{
    return "xiaoqi";  //返回xiaoqi 给函数
}
echo getname(); // 调用参数, 并输出
?>

有参函数

<?php
function getname($name) //括号里面得是形参
{
  return $name;
}
echo getname('xiaoqi'); //将xiaoqi 传入函数,并返回
?>

形参默认是可以传递值的,然后调用函数的时候,若是不写内容,则默认为 形参的值,若是写了内容,输出的则是 传给实参的值

<?php
function getname($name='xiaoqi') //括号里面得是形参,给形参一个值
{
  return $name;
}
echo getname(); //调用函数
?>
<?php
function getname($name='xiaoqi') //括号里面得是形参,给形参一个值
{
  return $name;
}
echo getname('moonsec'); 调用函数,moonsec传入函数,然后输出 moonsec
?>

例子
我们创建名为 “writeMsg()” 的函数。打开的花括号({)指示函数代码的开始,而关闭的花括号(})指示函数的结束。此函数输出 “Hello world!”。如需调用该函数,只要使用函数名即可:

匿名函数

就是没有名字的函数
funcation 后面不跟名字,直接写,一般 会赋值给 一个变量,调用的时候直接拿这个变量即可

<?php
  //没有参数的匿名函数
$callfunction = function ()
{
    return 'xiaoqi';
};
echo $callfunction();

//有参数的匿名函数
$callfunction = function ($name)
{
    return $name;
};
echo $callfunction('xiaoqi');
?>

回调函数

回调函数是指调用函数的时候将另一个函数作为参数传递到调用的函数中,而不是传递一个普通的变量作为参数
使用回调函数是为了可以将一段自己定义的功能传到函数内部使用

<?php
function get_name($name)
{
    return $name;
}

echo call_user_func('get_name','xiaoqi');

call_user_func_array()函数

该函数需要两个参数。
第一个参数是要调用的函数名,第二个参数是数组类型,为参数列表。
参数列表的参数个数要和要调用的函数的参数个数相同

<?php
	function Speak($a,$b){
		echo "He can speak ".$a;
		echo "<br>";
		echo "She can speak ".$b;
	}
	
	function Speak_Test(){
		return call_user_func_array('Speak',array('Chinese','English'));	
	}
	
	Speak_Test()
?>

8.变量作用域

在 PHP 中,可以在脚本的任意位置对变量进行声明。
变量的作用域指的是变量能够被引用/使用的那部分脚本。
PHP 有三种不同的变量作用域:

  • local(局部)
  • global(全局)
  • static(静态)

在函数外声明的变量 叫做 全局变量,但是它不能在函数内部使用,要访问的话,将全局变量传入即可

Local 和 Global 作用域
函数之外声明的变量拥有 Global 作用域,只能在函数以外进行访问。
函数内部声明的变量拥有 LOCAL 作用域,只能在函数内部进行访问。

例子

<?php
$x=5; // 全局作用域

function myTest() {
    $y=10; // 局部作用域
    echo "<p>测试函数内部的变量:</p>";
    echo "变量 x 是:$x";
    echo "<br>";
    echo "变量 y 是:$y";
}

myTest();

echo "<p>测试函数之外的变量:</p>";
echo "变量 x 是:$x";
echo "<br>";
echo "变量 y 是:$y";
?>

在上例中,有两个变量 $x 和 y ,以及一个函数 m y T e s t ( ) 。 y,以及一个函数 myTest()。 y,以及一个函数myTest()x 是全局变量,因为它是在函数之外声明的,而 $y 是局部变量,因为它是在函数内声明的。

如果我们在 myTest() 函数内部输出两个变量的值,$y 会输出在本地声明的值,但是无法 $x 的值,因为它在函数之外创建。

然后,如果在 myTest() 函数之外输出两个变量的值,那么会输出 $x 的值,但是不会输出 $y 的值,因为它是局部变量,并且在 myTest() 内部创建。

注释:可以在不同的函数中创建名称相同的局部变量,因为局部变量只能被在其中创建它的函数识别。

global 关键词

global 关键词用于在函数内访问全局变量。
要做到这一点,请在(函数内部)变量前面使用 global 关键词:

要在函数内部访问全局变量的时候,用 global 关键词

<?php
  $a = "全局变量";

function getName()
{
    global $a;
    echo $a;
}
getName();
?>

PHP 同时在名为 $GLOBALS[index] 的数组中存储了所有的全局变量。下标存有变量名。这个数组在函数内也可以访问,并能够用于直接更新全局变量。
下标就写 要访问的 全局变量名
例子

<?php
$a = 1;
$b = 2;

function mytest()
{
    $GLOBALS['b'] = $GLOBALS['a'] + $GLOBALS['b'];
}
mytest();
echo $b;
?>

static 关键词 (静态变量声明)

通常,当函数完成/执行后,会删除所有变量。不过,有时我需要不删除某个局部变量。实现这一点需要更进一步的工作。
要完成这一点,请在您首次声明变量时使用 static 关键词:
例如,实现 自增,每调用一次函数,让其自增1

function mytext()
{
    static $a = 1;
    echo $a;
    $a++;
}

mytext();
mytext();
mytext();
//没调用一次,函数内的 变量变增1
?>

如果 不加 static,则三次输出全为1,用完一次后,会删除里面的变量,然后在调用的时候,又会从1开始,

9. 类与对象

面向对象

在面向对象的程序设计(英语:Object-oriented programming,缩写:OOP)中,对象是一个由信息及对信息进行处理的描述所组成的整体,是对现实世界的抽象。
在现实世界里我们所面对的事情都是对象,如计算机、电视机、自行车等。
对象的主要三个特性:

  • 对象的行为:可以对对象施加那些操作,开灯,关灯就是行为。
  • 对象的形态:当施加那些方法是对象如何响应,颜色,尺寸,外型。
  • 对象的表示:对象的表示就相当于身份证,具体区分在相同的行为与状态下有什么不同。

比如 Animal(动物) 是一个抽象类,我们可以具体到一只狗跟一只羊,而狗跟羊就是具体的对象,他们有颜色属性,可以写,可以跑等行为状态。

image.png

面向对象内容

−定义了一件事物的抽象特点。类的定义包含了数据的形式以及对数据的操作。
对象−是类的实例。

成员变量−定义在类内部的变量。该变量的值对外是不可见的,但是可以通过成员函数访问,在类被实例化为对象后,该变量即可称为对象的属性。

成员函数−定义在类的内部,可用于访问对象的数据。

继承−继承性是子类自动共享父类数据结构和方法的机制,这是类之间的一种关系。在定义和实现一个类的时候,可以在一个已经存在的类的基础之上来进行,把这个已经存在的类所定义的内容作为自己的内容,并加入若干新的内容。

父类−一个类被其他类继承,可将该类称为父类,或基类,或超类。

子类−一个类继承其他类称为子类,也可称为派生类。

多态−多态性是指相同的操作或函数、过程可作用于多种类型的对象上并获得不同的结果。不同的对象,收到同一消息可以产生不同的结果,这种现象称为多态性。

重载−简单说,就是函数或者方法有同样的名称,但是参数列表不相同的情形,这样的同名不同参数的函数或者方法之间,互相称之为重载函数或者方法。

抽象性−抽象性是指将具有一致的数据结构(属性)和行为(操作)的对象抽象成类。一个类就是这样一种抽象,它反映了与应用有关的重要性质,而忽略其他一些无关内容。任何类的划分都是主观的,但必须与具体的应用有关。

封装−封装是指将现实世界中存在的某个客体的属性与行为绑定在一起,并放置在一个逻辑单元内。

构造函数−主要用来在创建对象时初始化对象,即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中。

析构函数−析构函数(destructor) 与构造函数相反,当对象结束其生命周期时(例如对象所在的函数已调用完毕),系统自动执行析构函数。析构函数往往用来做"清理善后" 的工作(例如在建立对象时用new开辟了一片内存空间,应在退出前在析构函数中用delete释放)

下图中我们通过 Car 类创建了三个对象:Mercedes, Bmw, 和 Audi。
$mercedes = new Car ();
$bmw = new Car ();
$audi = new Car ();
image.png

类的定义 以及定义

语法格式

<?php
class phpClass {  // 类名 phpClass
  // 成员变量
  var $var1;
  var $var2 = "constant string";
  // 成员函数
  function myfunc ($arg1, $arg2) {
     [..]
  }
  [..]
}
?>

解析:

  • 类使用 class 关键字后加上类名定义。
  • 类名后的一对大括号({})内可以定义变量和方法。
  • 类的变量使用 var 来声明, 变量也可以初始化值。
  • 函数定义类似 PHP 函数的定义,但函数只能通过该类及其实例化的对象访

实例:

<?php
class Person
{
    //成员变量
    var $name;
    var $age;
    var $gender;
    //成员函数
    function setName($name)
    {
        $this->name=$name;
    }

    function getName()
    {
        return $this->name;
    }
}

// 用new 对类实例化 ,p1就是一个对象
//$this表示,对象的本身
$p1 = new Person(); //用new 关键字对类实例化
$p1->setName('xiaoqi'); // 对象访问成员变量

echo $p1->name.PHP_EOL; // 类的成员变量
echo $p1->getName();

实例2

class Site {
  /* 成员变量 */
  var $url;
  var $title;
  
  /* 成员函数 */
  function setUrl($par){
     $this->url = $par;
  }
  
  function getUrl(){
     echo $this->url . PHP_EOL;
  }
  
  function setTitle($par){
     $this->title = $par;
  }
  
  function getTitle(){
     echo $this->title . PHP_EOL;
  }
}

ps:
变量 $this 代表自身的对象
PHP_EOL 为文本换行符,不是html 换行符
PHP 中创建对象
类创建后,可以使用 new 来实例化该类的对象;

$w3cschool = new Site;
$taobao = new Site;
$google = new Site;

以上代码我们创建了三个对象,三个对象各自都是独立的,接下来我们来看看如何访问成员方法与成员变量。

调用成员方法

在实例化对象后,我们可以使用该对象调用成员方法,该对象的成员方法只能操作该对象的成员变量:

<?php
//初始化类
$w3cschool = new Site();
$taobao = new Site();
$google = new Site();

//调用成员函数,设置标题和url
$w3cschool->setTitle("w3cschool教程");
$taobao->setTitle("淘宝");
$google->setTitle("Google");

$w3cschool->setUrl('www.w3cschool.cn');
$taobao->setUrl('www.taobao.com');
$google->setUrl('www.google.com');
//调用成员函数,获取标题和URL
$w3cschool->getTitle();
$taobao->getTitle();
$google->getTitle();

$w3cschool->getUrl();
$taobao->getUrl();
$google->getUrl();
?>
构造函数

构造函数,是一种特殊的方法。主要用来在创建对象时初始化对象,即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中。

PHP 5 允行开发者在一个类中定义一个方法作为构造函数,语法格式如下:

void __construct ([ mixed $args [, $… ]] )

构造函数一般用于赋值比较多

<?php
class Person
{
    //成员变量
    var $name;
    var $age;
    var $gender;
    //成员函数
    function __construct($name)
    {
        $this->name=$name;
    }

    function getName()
    {
        return $this->name;
    }
}

// 用new 对类实例化 ,p1就是一个对象
//$this表示,对象的本身

$p1 = new Person('xiaoqi');
echo $p1->getName();
?>
析构函数

析构函数(destructor) 与构造函数相反,当对象结束其生命周期时(例如对象所在的函数已调用完毕),系统自动执行析构函数。
PHP 5 引入了析构函数的概念,这类似于其它面向对象的语言,其语法格式如下:
void __destruct ( void )

<?php
class Person
{
    //成员变量
    var $name;
    var $age;
    var $gender;
    //成员函数
    function __construct($name)
    {
        $this->name=$name;
    }

    function __destruct()
    {
        echo  $this->name;
    }
}

// 用new 对类实例化 ,p1就是一个对象
//$this表示,对象的本身

$p1 = new Person('xiaoqi111');
?>

类的继承

继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的属性和方法,或子类从父类继承方法,使得子类具有父类相同的行为。
父类=基类(父类也可以称为基类)

PHP 使用关键字 extends 来继承一个类,PHP 不支持多继承,
格式

class Child extends Parent
{
// 代码部分
}

<?php
class Person //定义一个类 (充当父类)
{
    var $name;
    var $age;
    //定义 构造函数
    function __construct($name,$age)
    {
        $this->name = $name;
        $this->age = $age;
    }
    // 用于获取
    function getUser()
    {
        return "名字是 $this->name 年龄 $this->age 岁";
    }
}
/*//实例化
$p1 = new Person('xiaoqi',22);
//调用方法
echo $p1->getUser();
*/

// P1 继承 Person 
// 子类
class p1 extends Person //可以什么都不用写,父类有的都会有
{

}
$p2 = new p1('xlz',19);
echo $p2->getUser();

?>

方法重写

如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写。

对子类的方法 重写

<?php
class Person
{
    var $name;
    var $age;
    //定义 构造函数
    function __construct($name,$age)
    {
        $this->name = $name;
        $this->age = $age;
    }
    // 用于获取
    function getUser()
    {
        return "名字是 $this->name 年龄 $this->age 岁";
    }
}
/*//实例化
$p1 = new Person('xiaoqi',22);
//调用方法
echo $p1->getUser();
*/

// P1 继承 Person
class p1 extends Person //可以什么都不用写,父类有的都会有
{
    function getUser()
    {
        return "名字是 $this->name";
    }
    function  run()
    {
        echo "$this->name 在跑步";
    }

}
$p2 = new p1('xlz',18);
echo $p2->getUser();
$p2->run();

?>

访问控制

PHP 对属性或方法的访问控制,是通过在前面添加关键字** public(公有**),protected(受保护)或private(私有)来实现的。

  • public(公有):公有的类成员可以在任何地方被访问。
  • protected(受保护):受保护的类成员则可以被其自身以及其子类和父类访问。
  • private(私有):私有的类成员则只能被其定义所在的类访问。

{类中的 变量或者 函数 称为 类成员
受保护的 可以在子类或者父类被调用,私有的只能在内部被调用

属性的访问控制

类属性必须定义为公有,受保护,私有之一。如果用 var 定义,则被视为公有。

<?php
class Person
{
    public $a="public 公有的";
    protected $b="public 受保护的";
    private $c="public 私有的";

    public function print1()
    {
        // 在类中的函数 可以访问 三种属性 公有 私有 受保护的
        echo $this->a."</br>";
        echo $this->b."</br>";
        echo $this->c."</br>";
    }
}

$p1 = new Person();
echo $p1->print1();
//类外不能访问 受保护的 和私有的,
//在外面只能访问 公有的
方法的访问控制

类中的方法可以被定义为公有,私有或受保护。如果没有设置这些关键字,则该方公有

<?php
class Person
{
    public function a1()
    {
        echo "public ";
        $this->a2();
        $this->a3();
    }
    protected function a2()
    {
        echo "protected ";
    }
    private function a3()
    {
        echo "private ";
    }

}

$p1 = new Person();
echo $p1->print1();
//类外不能访问 受保护的 和私有的,
$p1->a1(); // 可以通过 访问公共的去访问内部受保护的或者私有的

子类继承父类,可以直接访问父类中受保护的
还可以用过 函数 parent::(); 来访问

<?php
class Person
{
    // var 默认是公有的
    protected $name;
    protected $age;
    //定义 构造函数
    function __construct($name,$age)
    {
        $this->name = $name;
        $this->age = $age;
    }
    // 用于获取
    function getUser()
    {
        return "名字是 $this->name 年龄 $this->age 岁";
    }
}


// P1 继承 Person
class p1 extends Person //可以什么都不用写,父类有的都会有
{
    //子类可以访问父类受保护的
  public function a1()
{
    echo $this->name."受保护的";
    echo $this->getUser();
    echo  parent::getUser();  //也可以通过 parent来访问

}

}
$p2 = new p1('xiaoqi',18);
$p2->a1();

私有的是 只能在本类里面访问,子类或者外面是访问不了的

<?php
class Person
{
    // var 默认是公有的
    private $name;
    private $age;
    //定义 构造函数
    function __construct($name,$age)
    {
        $this->name = $name;
        $this->age = $age;
    }
    // 用于获取
    private function getUser()
    {
        return "名字是 $this->name 年龄 $this->age 岁";
    }
}


// P1 继承 Person
class p1 extends Person //可以什么都不用写,父类有的都会有
{
    //子类可以访问父类受保护的
  public function a1()
    {
        echo $this->name."私有";
        echo $this->getUser();

    }

}
$p2 = new p1('xiaoqi',18);
$p2->a1();

接口和抽象类

接口

使用接口(interface),可以指定某个类必须实现哪些方法,但不需要定义这些方法的具体内容。

接口是通过 interface 关键字来定义的,就像定义一个标准的类一样,但其中定义所有的方法都是空的。

接口中定义的所有方法都必须是公有,这是接口的特性。

要实现一个接口,使用 implements 操作符。类中必须实现接口中定义的所有方法,否则会报一个致命错误。
类可以实现多个接口,用逗号来分隔多个接口的名称。

实例
接口 定义用 interface

<?php
interface Person
{ 
    // 用 interface 声明一个接口
    //接口中,所有的方法都是公有的,方法可以允许有参数
    //接口中,可以使用常量,但是不能使用变量
    const NAME = "这个是常量";
    public  function  get_name();
    public  function  set_name($name);
}

?>

实现接口
类中必须实现接口中定义的所有方法,否则会报一个致命错误

class p1 implements Person //定义接口
{

    public function set_name($name)
    {
        echo "set_name".$name;
    }
    public function get_name()
    {
        echo "get_name";
    }
}
$a = new p1();
$a->set_name('xiaoqi');
$a->get_name();

类还允许又多个接口,实现接口的时候用,号分割

<?php
interface Person
{
    // 用 interface 声明一个接口
    //接口中,所有的方法都是公有的,方法可以允许有参数
    //接口中,可以使用常量,但是不能使用变量
    const NAME = "这个是常量";
    public  function  get_name();
    public  function  set_name($name);
}
interface  p
{
    public  function  run();
}
// 类可以拥有多个接口
class p1 implements Person,p //定义接口 Person和p
{

    public function set_name($name)
    {
        echo "set_name".$name;
    }
    public function get_name()
    {
        echo "get_name";
    }
    public function run()
    {
        echo "run";
    }
}
$a = new p1();
$a->set_name('xiaoqi');
$a->get_name();
$a->run();
抽象类

任何一个类,如果它里面至少有一个方法是被声明为抽象的,那么这个类就必须被声明为抽象的。

定义为抽象的类不能被实例化。
被定义为抽象的方法只是声明了其调用方式(参数),不能定义其具体的功能实现。

继承一个抽象类的时候,子类必须定义父类中的所有抽象方法;另外,这些方法的访问控制必须和父类中一样(或者更为宽松)。例如某个抽象方法被声明为受保护的,那么子类中实现的方法就应该声明为受保护的或者公有的,而不能定义为私有的。

声明一个抽象类
使用 abstract
抽象方法不允许又函数体,但允许为空

<?php
//声明抽象类  abstract
//抽象类里面允许有抽象方法 和方法  抽象方法不能有具体的内容 必须为空  可以有多个参数
//抽象类不能实例化
// abstract 抽象方法,在子类中 必须定义,少于一个都会出错
abstract class  Person
{
    abstract protected  function  get_name();

    abstract protected function set_name($name);

    public  function  run()
    {
        echo "run";
    }

}
// 类 只能继承 一个抽象类
// 必须吧抽象类里的方法 实现
// 如果抽象类是保护类型的,在子类定义方法的时候,可以是保护类,公有类,但不能是私有类
class p1 extends Person
{
    public $name;
    function __construct($name)
    {
        $this->name=$name;
    }
    protected function set_name($name)
    {
        return "set_name".$name;
    }
     public function get_name()
    {
        echo "get_name".$this->name;
    }
    public function run()
    {
        parent::run(); // TODO: Change the autogenerated stub
    }
}

$a = new p1('xiaoqi');
$a->get_name();

$a->run();

?>
总结
  1. 接口
    (1)对接口的使用是通过关键字implements
    (2)接口不能定义成员变量(包括类静态变量),能定义常量
    (3)子类必须实现接口定义的所有方法
    (4)接口只能定义不能实现该方法
    (5)接口没有构造函数
    (6)接口中的方法和实现它的类默认都是public类型的
  2. 抽象类
    (1)对抽象类的使用是通过关键字extends
    (2)不能被实例化,可以定义子类必须实现的方法
    (3)子类必须定义父类中的所有抽象方法,这些方法的访问控制必须和父类中一样(或者更为宽松)
    (4)如一个类中有一个抽象方法,则该类必须定义为抽象类
    (5)抽象类可以有构造函数
    (6)抽象类中的方法可以使用private,protected,public来修饰。
    (7)一个类可以同时实现多个接口,但一个类只能继承于一个抽象类。

Static 关键字

声明类属性或方法为 static(静态),就可以不实例化类而直接访问。

静态属性不能通过一个类已实例化的对象来访问(但静态方法可以)。

由于静态方法不需要通过对象即可调用,所以伪变量 $this 在静态方法中不可用。可以使用self

静态属性不可以由对象通过 -> 操作符来访问。

自 PHP 5.3.0 起,可以用一个变量来动态调用类。但该变量的值不能为关键字 self,parent 或 static。

静态方法
用到 static 关键字
可以不用实例化,直接使用Person 来访问静态变量

<?php
//静态方法  静态变量

class Person
{
    public static $name = "xiaoqi"; //静态变量
    public static function  get_name()
    {
        return "get_name".self::$name;
    }
}


echo Person::$name; // 不用实例化,直接用 person 访问
echo Person::get_name();
?>

Final 关键字

PHP 5 新增了一个 final 关键字。如果父类中的方法被声明为 final,则子类无法覆盖该方法。如果一个类被声明为 final,则不能被继承。

<?php
//静态方法  静态变量
// Final 子类不能继承父类的函数
class Person
{
    public  $name = "xiaoqi"; //静态变量
    Final public  function  getString()
    {
        return "这是父类的方法";
    }
}
class c1 extends Person
{
    public function getString()
    {
        return "这是子类的方法";
    }
}

//echo Person::$name; // 不用实例化,直接用 person 访问
//echo Person::get_name();

$a = new c1();
echo $a->getString();  //会报错

在子类中 如何调用父类的函数
使用 parent 关键字

<?php
//静态方法  静态变量
// Final 子类不能继承父类的函数
class Person
{
    public  $name = "xiaoqi"; //静态变量
     public  function  getString()
    {
        return "这是父类的方法</br>";
    }
}
class c1 extends Person
{
    public function getString()
    {
        echo  parent::getString();  // 使用 parent关键字 来调用父类的方法
        return "这是子类的方法";
    }
}

//echo Person::$name; // 不用实例化,直接用 person 访问
//echo Person::get_name();

$a = new c1();
echo $a->getString();

构造函数的话,也是同理
可以使用 parent 来在子类中使用父类的函数

<?php

class Person
{
    public  $name = "xiaoqi"; 
    function  __construct()
    {
        echo "这个是父类的构造函数</br>";
    }

class c1 extends Person
{
    public function __construct()
    {
        //调用父类的构造函数
        echo Person::__construct();
        echo "这个是子类的构造函数";
    }

$a = new c1();

?>

10. 超级全局变量

PHP超级全局变量列表:

  • $GLOBALS 一个包含了全部变量的全局组合数组。变量的名字就是数组的键。
  • $_SERVER 一个包含了诸如头信息(header)、路径(path)、以及脚本位置(script locations)等等信息的数组
<?php
  $a = "132";
$b = 123465;
print_r($GLOBALS);  //包含全部变量,

print_r($_SERVER); // 包含了诸如 头信息,路径,脚本位置等信息的数组
?>
  • $_REQUEST 用于收集HTML表单提交的数据。
    • 它可以获取 cookie get post
  • $_POST 广泛应用于收集表单数据,在HTML form标签的指定该属性:"method=“post”。
  • $_GET 广泛应用于收集表单数据,在HTML form标签的指定该属性:"method=“get”。
<form method="post">
    <input type="text" name="username" />
    <input type="submit" name="sub">
</form>
<?php
print_r($_REQUEST);

Array []

  • $_FILES 用获取文件上传后,获得上传文件的信息
  • $_ENV
  • $_COOKIE
  • $_SESSION

ps: 获取 信息的时候,由于是二维表,所以要加两个
例如

print_r($_REQUEST[’ ‘][’ ']);

<?php 
// php预定义方法
echo "\n", $GLOBALS['y'];
echo "\n", $_SERVER['PHP_SELF'];
echo "\n", $_SERVER['SERVER_NAME'];
echo "\n", $_SERVER['HTTP_HOST'];
?>

11.include 文件

服务器端包含 (SSI) 用于创建可在多个页面重复使用的函数、页眉、页脚或元素

include (或 require)语句会获取指定文件中存在的所有文本/代码/标记,并复制到使用 include 语句的文件中。

包含文件很有用,如果您需要在网站的多张页面上引用相同的 PHP、HTML 或文本的话。

PHP** include 和 require 语句**
通过 include 或 require 语句,可以将 PHP 文件的内容插入另一个 PHP 文件(在服务器执行它之前)。
include 和 require 语句是相同的,除了错误处理方面:

  • require 会生成致命错误(E_COMPILE_ERROR)并停止脚本
  • include 只生成警告(E_WARNING),并且脚本会继续

因此,如果您希望继续执行,并向用户输出结果,即使包含文件已丢失,那么请使用 include。
否则,在框架、CMS 或者复杂的 PHP 应用程序编程中,请始终使用 require 向执行流引用关键文件。
这有助于提高应用程序的安全性和完整性,在某个关键文件意外丢失的情况下。
优点:
包含文件省去了大量的工作。这意味着您可以为所有页面创建标准页头、页脚或者菜单文件。然后,在页头需要更新时,您只需更新这个页头包含文件即可。
语法
include ‘filename’;

require ‘filename’;

例子:
新建一个网页 function.php 里面写入一个函数,然后在新建index.php。引入function.php 调用所写的函数

//----------index 页面 --------
<?php
include "function.php"; // index.php 包含 function.php

fun1();
?>

//--------function 页面 -------------
<?php
function fun1()
{
    echo "xiaoqi 你好!!!";
}
?>

12. 文件处理

12.1 操作文件

PHP 拥有的多种函数可供创建、读取、上传以及编辑文件。
注意:请谨慎操作文件!
当您操作文件时必须非常小心。如果您操作失误,可能会造成非常严重的破坏。常见的错误是:
编辑错误的文件
被垃圾数据填满硬盘
意外删除文件内容

PHP readfile() 函数
readfile() 函数读取文件,并把它写入输出缓冲。

12.2 文件打开/读取/关闭

如何在服务器上打开、读取以及关闭文件。
PHP Open File - fopen()
打开文件的更好的方法是通过 fopen() 函数。此函数为您提供比 readfile() 函数更多的选项。

fopen() 的第一个参数包含被打开的文件名,第二个参数规定打开文件的模式。

提示:我们接下来将学习 fread() 以及 fclose() 函数。(打开和关闭)
文件会以如下模式之一打开:

模式描述
r打开文件为只读,文件指针在文件的开头开始
w打开文件为只写,删除文件的内容或创建一个新的文件,如果它不存在,文件指定在文件的开头开始
a打开文件为只写,文件中的现有数据会被保留。文件指针在文件结尾开始,创建新的文件,如果文件不存在
x创建新文件为只写,返回FALSE 和错误,
r+打开文件为读/写,文件指针在文件开头开始
w+打开文件为读/写,删除文件或创建新文件,若不存在,文件指针在文件开头开始
a+打开文件为读/写,文件已有的数据会被保留,文件指针在文件结尾开始。
x+创建新文件为读/写,返回FALSE 和错误,
命令描述
fopen()打开指定的文件(第一个参数含被打开的文件名,第二个参数规定打开的文件模式)
fclose()用于关闭打开的文件,文件打开用完之后,关闭掉,否则会占用内存资源
fread()读取被打开的文件(第一个参数包含带读取的文件的文件名,第二个参数规定待读取的最大字节数)
fgets()用于从文件读取单行
feof()检查是否以到达“end-of-file(EOF)”
读取文件

fopen(文件名,模式)
fclose(存储文件的变量名)
filesize 文件的大小
fread() 第一个参数 包含待读取文件的文件名,第二个参数规定待读取的最大字节数
fclose 需要待关闭文件的名称(或者 存有文件名的变量)
例子

<?php
//读取top1000.txt,赋给变量 $a
 $a=fopen('top1000.txt','r'); // (文件名:top1000,模式:r 读取)
//用 fread 输出
echo fread($a,filesize('top1000.txt')); // filesize  文件大小
//打开完成后,一定要关闭,否则会占用内存
fclose($a);
?>

fgets() 函数 用于 从文件 读取单行

<?php
$a=fopen('top1000.txt','r');
echo fgets($a);
echo fgets($a);
echo fgets($a);
fclose($a);
?>

PHP 检查 End-Of-File - feof()
feof() 函数检查是否已到达 “end-of-file” (EOF)。
feof() 对于遍历未知长度的数据很有用。
feof() 函数检查是否已到达文件末尾(EOF)

在遍历输出的时候,还可以进行加密

<?php
$a=fopen('top1000.txt','r');
// while 遍历 这个文件
while(!feof($a)) // 判断 是否到了文件末尾。
{
    echo fgets($a); // 每次输出一行
}
?>
//------加密------
$a=fopen('top1000.txt','r');
// while 遍历 这个文件
while(!feof($a)) // 判断 是否到了文件末尾。
{
   echo md5(fgets($a))."</br>"; // 每次输出一行,加密输出
}
?>
创建文件

fopen()
fopen() 函数也用于创建文件。也许有点混乱,但是在 PHP 中,创建文件所用的函数与打开文件的相同。
如果您用 fopen() 打开并不存在的文件,此函数会创建文件,假定文件被打开为写入(w)或增加(a)
模式 w和a 的区别

  • w 写入文件,每次会覆盖上一次的内容
  • a 写入,追加在原有内容的后面
<?php
//创建文件,写入内容
$myflie = fopen('1.txt','w'); //创建新文件1.txt, 
fwrite($myflie,'xiaoqi');//追加内容,覆盖掉上一次

$a=fopen('1.txt','r');
echo fread($a,filesize('1.txt'));
?>

12.3 文件的 复制 删除 重名

  • php文件重命名:函数rename()。
  • php文件复制:函数copy();
  • php文件删除:函数unlink();
<?php

rename('1.txt','2.txt');// 将1.txt重命名为2.txt

copy('2.txt','1.txt'); // 复制2.txt,为1.txt

unlink('1.txt'); //删除 1.txt

?>

12.4 文件的判断

file_exists() 判断文件是否存在
is_file() 是否为文件。

<?php
echo file_exists('2.txt'); //判断 2.txt是否存在

echo is_file('2.txt');// 判断2.txt是否为文件

?>

13.获取文件的属性

当我们在程序中操作文件时,可能会使用到文件的一些常见属性,比如文件的大小、类型、修改时间、访问时间以及权限等等。PHP 中提供了非常全面的用来获取这些属性的内置函数,如下表所示。

函数名作用语法格式返回值
file_exists()检查文件或目录是否存在file_exists( string $filename)文件存在返回true,
不存在返回false
filesize()获取文件大小filesize(string $filename)返回文件大小的字节数,出错时返回false
is_readable()判断给定文件名是否可读is_readable(string $fliename)如果文件可读,返回true
否则返回false
is_writable()判断给定文件名是否可写is_writable(string $filename)如果文件可写,返回true
否则返回false
is_executable()判断给定文件名是否可执行is_executable(string $filename)如果文件可执行,返回true
否则返回false
filectime获取文件的创建时间filectime($string $filename)返回UNIX时间戳
filemtime获取文件的修改时间filemtime($string $filename)返回UNIX时间戳
fileatime获取文件的上次访问时间fileatime($string $filename)返回UNIX时间戳
stat()获取文件大部分属性stat(string $filename)返回包含文件信息的数组
<?php
$myfile="2.txt";
//判断2.txt是否存在,不存在 执行or后面的
file_exists('2.txt') or die("文件不存在</be>");
// 若存在 输出文件存在,以及大小
echo $myfile."文件存在".filesize($myfile)."kb</br>";
//判断文件是否 可读
if (is_readable($myfile))
{
    echo "文件可读</<br>";
}
//判断文件是否 可写
if (is_writable($myfile))
{
    echo "文件可写</<br>";
}
//判断文件是否 可执行
if (is_executable($myfile))
{
    echo "文件可执行</<br>";
}

echo "创建时间".date("y-m-d H:i:s",filectime($myfile))."</br>";
echo "修改时间".date("y-m-d H:i:s",filemtime($myfile))."</br>";
echo "访问时间".date("y-m-d H:i:s",fileatime($myfile))."</br>";

?>

14. 目录的操作

目录操作

  • 新建目录:mkdir(路径,权限,递归创建)
  • 删除目录:rmdir()
  • 移动(改名):rename()
<?php
$name="xiaoqi";
mkdir($name);//新建目录
rename($name,'xiaoqi');//改名xiaqi
rmdir($name);//删除目录
?>

获取目录内容:

//打开目录
目录句柄 = opendir()
//读取目录
文件名 = readdir(目录句柄)
依次读取文件名,同时向下移动文件句柄指针,读取不到则返回false
//关闭目录
closedir()

当前目录. 上级目录用…
递归读取目录内容:

实例,打开该目录并遍历

<?php
$path="."; // 当前目录

$dh = opendir($path); // 打开当前目录
while(($file =readdir($dh))!== false)
{
    // 判断是文件还是目录
    if (is_dir($file) && $file!="." && $file!="..")
    {
        echo "目录 $file </br>";
    }
    elseif ($file !="." && $file !="..")
    {
        echo "文件 $file </br>";
    }

}
?>

如果要读取 其他盘下面的文件 甚至多级,
要写绝对路径,否则会报错

<?php
$path="d:/"; // 当前目录 可以输入想要遍历的目录名字

function tree($path)
{
    $dh = opendir($path); // 打开当前目录
    while(($file =readdir($dh))!== false)
    {
        $dirpath="$path$file";
        // 判断是文件还是目录
        if (is_dir($dirpath) && $file!="." && $file!="..")
        {
            echo "目录 $dirpath </br>";
            if(is_readable($dirpath)) //判断是否有权限读取
            {
                tree($dirpath);
            }
        }
        elseif ($file !="." && $file !="..")
        {
            echo "文件 $dirpath </br>";
        }
        

    }
    closedir($dh); // 打开完之后,关闭,
}
tree($path); // 调用

?>

15. 命令空间

PHP 命名空间可以解决以下两类问题:

  1. 用户编写的代码与PHP内部的类/函数/常量或第三方类/函数/常量之间的名字冲突。
  2. 为很长的标识符名称(通常是为了缓解第一类问题而定义的)创建一个别名(或简短)的名称,以提高源代码的可读性。

命名空间(可以理解为创建文件夹)
在包含别的文件的时候,若被包含的文件有变量,主文件的变量和被包含文件的变量名相同,则主文件的那个变量名的值,会被覆盖
定义:命名空间namespace,是指人为的将内存进行分隔,让不同内存区域的同名结构共存,从而解决在大型项目中可能出现的重名结构的问题
语法:namespace 空间名
作用:不同的空间可以有同名的结构,如:类
空间元素:函数,常量,类,不包括变量!!
子空间(子文件夹)
定义:命名空间内部再划分一个命名空间,让每个小空间独立起来
语法:
namespace 空间名
namespace 空间名\子空间
例子
新建两个页面 ,demo1 和 demo2

//--------demo1----------
<?php
namespace mydemo;  //创建 mydemo 空间 
include 'demo2.php';  // 包含demo2.php
const NAME="moon_a</br>";

function getName()
{
    return 'getName-a</br>';
}

class  Dog
{
    static  function run()
    {
        return 'Dog-a</br>';
    }
}
echo NAME; 
//和子空间的变量名相同,但是不会被覆盖
echo b\NAME;   // 限定名称  子空间名\元素
?>

//-------------demo2--------------
<?php
namespace mydemo\b;  //子空间

const NAME="moon_b</br>";

function getName()
{
    return 'getName-b</br>';
}

class  Dog
{
    static  function run()
    {
        return 'Dog-b</br>';
    }
}
?>
命名空间访问 (url)

在命令空间有三种 访问 类型

  • 非限定名称访问:直接访问空间元素的名字(只访问自己命名空间的元素)
  • 限定名称访问:使用自己当前的子空间名字+ \ + 元素名字
  • 完全限定名称访问:\ + 全局空间 + \ + 元素名字

注:任何空间元素访问,只针对函数,类,常量

//非限定名称
echo NAME; //非限定名称 本空间名访问
echo getNAME();//非限定名称 本空间名访问
echo Dog::run();//非限定名称 本空间名访问

//限定名称
echo b\NAME;  // 限定名称访问  子空间名\元素
echo b\getName(); // 限定名称访问  子空间名\元素
echo b\Dog::run(); // 限定名称访问  子空间名\元素

//完全限定名称
echo \mydemo\NAME; //完全限定名称  空间名加上元素
echo \mydemo\getName();//完全限定名称  空间名加上元素
echo Dog::run();  //完全限定名称  空间名加上元素

//也可以限制访问b
echo \mydemo\b\NAME; //完全限定名称  空间名加上元素
echo \mydemo\b\getName();//完全限定名称  空间名加上元素
echo \mydemo\b\Dog::run();  //完全限定名称  空间名加上元素

全局空间(C盘)
如果定义了命名空间,非限定名称的寻找系统常量的方式:
首先:在自己的空间内找
然后:如果找不到元素
系统常量–>进入全局空间寻找
系统类 --> 不会自动进入全局空间寻找,而是会报错

命名空间的引入
  1. 空间引入方式:use关键字
    • 1.引入类:use 空间名\类名
      1. 引入函数:use function 空间名\函数名
      1. 引入常量:use const 空间名\常量名
  2. 当引入元素时重名,通过 as 来起别名
    use 空间名\类名 as 别名

use mydemo\b as aa
// 起了一个别名aa

  1. 引入多个元素
    use 空间名{

类名,
function 函数名,
const 常量
}

  1. 引入空间
    use 空间名
<?php
namespace one;
include 'demo2.php';

// 想要用 2.php里的函数或者方法
// 使用use 将命名空间导入

use mydemo\b; // 导入整个命名空间
echo b\NAME;

// 引入类
use mydemo\b\Dog;
$a=new Dog();
echo $a->say();

// 引入常量
use const mydemo\b\NAME;
echo NAME;

//引入函数
use function mydemo\b\getName;
echo getName();

$b = new \mydemo\b\Dog();
echo $b->say();

echo \mydemo\b\Dog::run();

?>

也可以这么写

//------------demo4----------------
<?php
namespace xiaoqi;
include 'demo5.php';
function getName()
{
    return __NAMESPACE__."__getName"; //
}

echo \xiaoqi\a\getName();
?>

// --------------demo5-------------
<?php
namespace xiaoqi\a;

function getName()
{
    return __NAMESPACE__."__getName";
}
?>

16.正则表达式

**正则表达式简介 **
正则表达式(Regular Expression)是一种文本模式,包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为"元字符")。
正则表达式是用于描述字符排列和匹配模式的一种语法规则。它主要用于字符串的模式分割、匹配、查找及替换操作。到目前为止,我们前面所用过的精确(文本)匹配也是一种正则表达式。
在PHP中,正则表达式一般是由正规字符和一些特殊字符(类似于通配符)联合构成的一个文本模式的程序性描述。

正则表达式较重要和较有用的角色是验证用户数据的有效性检查。PHP中,正则表达式有三个作用:

  • 匹配,也常常用于从字符串中析取信息。
  • 用新文本代替匹配文本。
  • 将一个字符串拆分为一组更小的信息块。

正则表达式的基本语法

PCRE库函数中,正则匹配模式使用分隔符与元字符组成,分隔符可以是非数字、非反斜线、非空格的任意字符。经常使用的分隔符是正斜线(/)、hash符号(#) 以及取反符号(~)
元字符是用于构造规则表达式的具有特殊含义的字符。如果要在正则表达式中包含元字符本身,必须在其前加上”\”进行转义


//简单的正则表达式
<?php
$name='xiaoqi';

if(preg_match('/xiaoqi/',$name)) //还可以用 # 和 ~
{
    echo "匹配";
}
else
{
    echo "匹配失败";
}

元字符

元字符说明
*0次、1次或多次匹配其前的原子
+1次或多次匹配其前的原子
0次或1次匹配其前的原子
|匹配两个或多个选择
^匹配字符串串首的原子
$匹配字符串串尾的原子
[]匹配方括号中的任意原子
[^]匹配除方括号中的原子外的任何字符
{m}表示其前原子恰好出现m次
{m,n}表示其前原子至少出现了m次,至少出现n次(n>m)
{m,}表示其前原子出现不少于m次
()整体表示一个原子
.匹配除换行之外的任何一个字符
\将下一个字符标记为一个特殊字符、或一个原义字符、或一个 向后引用、或一个八进制转义符。例如,‘n’ 匹配字符 “n”。‘\n’ 匹配一个换行符。序列 ‘\\’ 匹配 “\” 而 “\(” 则匹配 “(”。
^匹配输入字符串的开始位置。如果设置了 RegExp 对象的 Multiline 属性,^ 也匹配 ‘\n’ 或 ‘\r’ 之后的位置。
$匹配输入字符串的结束位置。如果设置了RegExp 对象的 Multiline 属性,$ 也匹配 ‘\n’ 或 ‘\r’ 之前的位置。
*匹配前面的子表达式零次或多次。例如,zo* 能匹配 “z” 以及 “zoo”。* 等价于{0,}。
+匹配前面的子表达式一次或多次。例如,‘zo+’ 能匹配 “zo” 以及 “zoo”,但不能匹配 “z”。+ 等价于 {1,}。
?匹配前面的子表达式零次或一次。例如,“do(es)?” 可以匹配 “do” 或 “does” 。? 等价于 {0,1}。
{n}n 是一个非负整数。匹配确定的 n 次。例如,‘o{2}’ 不能匹配 “Bob” 中的 ‘o’,但是能匹配 “food” 中的两个 o。
{n,}n 是一个非负整数。至少匹配n 次。例如,‘o{2,}’ 不能匹配 “Bob” 中的 ‘o’,但能匹配 “foooood” 中的所有 o。‘o{1,}’ 等价于 ‘o+’。‘o{0,}’ 则等价于 ‘o*’。
{n,m}m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,“o{1,3}” 将匹配 “fooooood” 中的前三个 o。‘o{0,1}’ 等价于 ‘o?’。请注意在逗号和两个数之间不能有空格。
?当该字符紧跟在任何一个其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串 “oooo”,‘o+?’ 将匹配单个 “o”,而 ‘o+’ 将匹配所有 ‘o’。
.匹配除换行符(\n、\r)之外的任何单个字符。要匹配包括 ‘\n’ 在内的任何字符,请使用像"(.|\n)"的模式。
(pattern)匹配 pattern 并获取这一匹配。所获取的匹配可以从产生的 Matches 集合得到,在VBScript 中使用 SubMatches 集合,在JScript 中则使用 $0…$9 属性。要匹配圆括号字符,请使用 ‘\(’ 或 ‘\)’。
(?:pattern)匹配 pattern 但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。这在使用 “或” 字符 (|) 来组合一个模式的各个部分是很有用。例如, 'industr(?:y|ies) 就是一个比 ‘industry|industries’ 更简略的表达式。
(?=pattern)正向肯定预查(look ahead positive assert),在任何匹配pattern的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如,“Windows(?=95|98|NT|2000)“能匹配"Windows2000"中的"Windows”,但不能匹配"Windows3.1"中的"Windows”。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。
(?!pattern)正向否定预查(negative assert),在任何不匹配pattern的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如"Windows(?!95|98|NT|2000)“能匹配"Windows3.1"中的"Windows”,但不能匹配"Windows2000"中的"Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。
(?<=pattern)反向(look behind)肯定预查,与正向肯定预查类似,只是方向相反。例如,“(?<=95|98|NT|2000)Windows"能匹配"2000Windows"中的"Windows”,但不能匹配"3.1Windows"中的"Windows"。
(?<!pattern)反向否定预查,与正向否定预查类似,只是方向相反。例如"(?<!95|98|NT|2000)Windows"能匹配"3.1Windows"中的"Windows",但不能匹配"2000Windows"中的"Windows"。
x|y匹配 x 或 y。例如,‘z|food’ 能匹配 “z” 或 “food”。‘(z|f)ood’ 则匹配 “zood” 或 “food”。
[xyz]字符集合。匹配所包含的任意一个字符。例如, ‘[abc]’ 可以匹配 “plain” 中的 ‘a’。
[^xyz]负值字符集合。匹配未包含的任意字符。例如, ‘[^abc]’ 可以匹配 “plain” 中的’p’、‘l’、‘i’、‘n’。
[a-z]字符范围。匹配指定范围内的任意字符。例如,‘[a-z]’ 可以匹配 ‘a’ 到 ‘z’ 范围内的任意小写字母字符。
[^a-z]负值字符范围。匹配任何不在指定范围内的任意字符。例如,‘[^a-z]’ 可以匹配任何不在 ‘a’ 到 ‘z’ 范围内的任意字符。
\b匹配一个单词边界,也就是指单词和空格间的位置。例如, ‘er\b’ 可以匹配"never" 中的 ‘er’,但不能匹配 “verb” 中的 ‘er’。
\B匹配非单词边界。‘er\B’ 能匹配 “verb” 中的 ‘er’,但不能匹配 “never” 中的 ‘er’。
\cx匹配由 x 指明的控制字符。例如, \cM 匹配一个 Control-M 或回车符。x 的值必须为 A-Z 或 a-z 之一。否则,将 c 视为一个原义的 ‘c’ 字符。
\d匹配一个数字字符。等价于 [0-9]。
\D匹配一个非数字字符。等价于 [^0-9]。
\f匹配一个换页符。等价于 \x0c 和 \cL。
\n匹配一个换行符。等价于 \x0a 和 \cJ。
\r匹配一个回车符。等价于 \x0d 和 \cM。
\s匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。
\S匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。
\t匹配一个制表符。等价于 \x09 和 \cI。
\v匹配一个垂直制表符。等价于 \x0b 和 \cK。
\w匹配字母、数字、下划线。等价于’[A-Za-z0-9_]'。
\W匹配非字母、数字、下划线。等价于 ‘[^A-Za-z0-9_]’。
\xn匹配 n,其中 n 为十六进制转义值。十六进制转义值必须为确定的两个数字长。例如,‘\x41’ 匹配 “A”。‘\x041’ 则等价于 ‘\x04’ & “1”。正则表达式中可以使用 ASCII 编码。
\num匹配 num,其中 num 是一个正整数。对所获取的匹配的引用。例如,‘(.)\1’ 匹配两个连续的相同字符。
\n标识一个八进制转义值或一个向后引用。如果 \n 之前至少 n 个获取的子表达式,则 n 为向后引用。否则,如果 n 为八进制数字 (0-7),则 n 为一个八进制转义值。
\nm标识一个八进制转义值或一个向后引用。如果 \nm 之前至少有 nm 个获得子表达式,则 nm 为向后引用。如果 \nm 之前至少有 n 个获取,则 n 为一个后跟文字 m 的向后引用。如果前面的条件都不满足,若 n 和 m 均为八进制数字 (0-7),则 \nm 将匹配八进制转义值 nm。
\nml如果 n 为八进制数字 (0-3),且 m 和 l 均为八进制数字 (0-7),则匹配八进制转义值 nml。
\un匹配 n,其中 n 是一个用四个十六进制数字表示的 Unicode 字符。例如, \u00A9 匹配版权符号 (?)。

边界限制

用于精确查找
在某些情况下,需要对匹配范围进行限定,以获得更准确的匹配结果。“^”和“$”分别指定字符串的开始和结束。

重复匹配

正则表达式中有一些用于重复匹配某些原子的元字符:“?”、“*”、“+”。他们主要的不同是重复匹配的次数不同。
元字符“?”:表示0次或1次匹配紧接在其前的原子。
例如:colou?r匹配“colour”或“color”。

元字符“”:表示0次、1次或多次匹配紧接在其前的原子。
例如:zo
可以匹配z、zoo
<[A-Za-z][A-Za-z0-9]*>可以匹配“

”、“”或“”等HTML标签,并且不严格的控制大小写。
元字符“+”:表示1次或多次匹配紧接在其前的原子。
例如:go+gle匹配“gogle”、“google”或“gooogle”等中间含有多个o的字符串。
例子十六进制数字,匹配表达式是0?[ xX][0-9a-fA-F]+,可以匹配“0x9B3C”或者“X800”等。

元字符 “.”
元字符“.”匹配除换行符外任何一个字符,相当于^\n^\r\n
例如:pr.y可以匹配的字符串“prey”、“pray”或“pr%y”等。
通常可以使用“.*”组合来匹配除换行符外的任何字符。在一些书籍中也称其为“全匹配符” 或 “单含匹配符”。
例如:
^a.*z[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xjyPS8kh-1672245166050)(https://g.yuque.com/gr/latex?%E8%A1%A8%E7%A4%BA%E5%8F%AF%E4%BB%A5%E5%8C%B9%E9%85%8D%E5%AD%97%E6%AF%8D%E2%80%9Ca%E2%80%9D%E5%BC%80%E5%A4%B4%EF%BC%8C%E5%AD%97%E6%AF%8D%E2%80%9Cz%E2%80%9D%E7%BB%93%E6%9D%9F%E7%9A%84%E4%BB%BB%E6%84%8F%E4%B8%8D%E5%8C%85%E6%8B%AC%E6%8D%A2%E8%A1%8C%E7%AC%A6%E7%9A%84%E5%AD%97%E7%AC%A6%E4%B8%B2%E3%80%82%0A.%2B%E4%B9%9F%E5%8F%AF%E4%BB%A5%E5%AE%8C%E6%88%90%E7%B1%BB%E4%BC%BC%E7%9A%84%E5%8C%B9%E9%85%8D%E5%8A%9F%E8%83%BD%E6%89%80%E4%B8%8D%E5%90%8C%E7%9A%84%E6%98%AF%E5%85%B6%E8%87%B3%E5%B0%91%E5%8C%B9%E9%85%8D%E4%B8%80%E4%B8%AA%E5%AD%97%E7%AC%A6%E3%80%82%0A%5Ea.%2Bz#card=math&code=%E8%A1%A8%E7%A4%BA%E5%8F%AF%E4%BB%A5%E5%8C%B9%E9%85%8D%E5%AD%97%E6%AF%8D%E2%80%9Ca%E2%80%9D%E5%BC%80%E5%A4%B4%EF%BC%8C%E5%AD%97%E6%AF%8D%E2%80%9Cz%E2%80%9D%E7%BB%93%E6%9D%9F%E7%9A%84%E4%BB%BB%E6%84%8F%E4%B8%8D%E5%8C%85%E6%8B%AC%E6%8D%A2%E8%A1%8C%E7%AC%A6%E7%9A%84%E5%AD%97%E7%AC%A6%E4%B8%B2%E3%80%82%0A.%2B%E4%B9%9F%E5%8F%AF%E4%BB%A5%E5%AE%8C%E6%88%90%E7%B1%BB%E4%BC%BC%E7%9A%84%E5%8C%B9%E9%85%8D%E5%8A%9F%E8%83%BD%E6%89%80%E4%B8%8D%E5%90%8C%E7%9A%84%E6%98%AF%E5%85%B6%E8%87%B3%E5%B0%91%E5%8C%B9%E9%85%8D%E4%B8%80%E4%B8%AA%E5%AD%97%E7%AC%A6%E3%80%82%0A%5Ea.%2Bz&id=Ub4QU)]将不匹配字符串“az”。
重复匹配
元字符“{}”准确地指定原子重复的次数,指定所匹配的原子出现的次数。
“{m}”表示其前原子恰好出现m次;
“{m,n}”表示其前原子至少出现m次,至多出现n次;
“{m,}”表示其前原子出现不少于m次。

例如:
zo{1,3}m只能匹配字符串“zom”、“zoom”、或“zooom”。
zo{3}m只能匹配字符串“zooom”
zo{3,}m可以匹配以 “z” 开头,“m”结束,中间至少为3个“o”的字符串。
bo{0,1}u可以匹配字符串“bought a butter” 中的“bou”和“bu”,等价于bo?u。
原子表 -方括号表达式
原子表”[]”中存放一组原子,彼此地位平等,且仅匹配其中的一个原子。如果想匹配一个 ”a” 或 ”e” 使用 [ae]。
例如: Pr[ae]y 匹配 ”Pray” 或者 ”Prey ”。
原子表 ”[^]” 或者称为排除原子表,匹配除表内原子外的任意一个字符。
例如:p[^u]匹配“part”中的“pa”,但无法匹配“computer”中的“pu”因为“u”在匹配中被排除。
原子表“[-]”用于连接一组按ASCII码顺序排列的原子,简化书写。
例如:x[0123456789]可以写成x[0-9],用来匹配一个由 “x” 字母与一个数字组成的字符串。
例如:
[a-zA-Z]匹配所有大小写字母
[1][0-9]$匹配比如“z2”、 “t6” 、“g7”
0[xX][0-9a-fA-F]匹配一个简单的十六进制数字,如“0x9”。
[^0-9a-zA-Z_]匹配除英文字母、数字和下划线以外任何一个字符,其等价于\W。
模式选择符

元字符“|”又称模式选择符。在正则表达式中匹配两个或更多的选择之一。
例如:在字符串“There are many apples and pears.”中,apple|pear在第一次运行时匹配“apple”;再次运行时匹配“ pear”。也可以继续增加选项,如: apple|pear|banana|lemon

POSIX风格预定义的正则表达式的字符类:
[[:alnum:]] 字母和数字字符
[[:alpha:]] 大小写字母
[[:lower:]] 小写字母
[[:upper:]] 大写字母
[[:digit:]] 数字0-9
[[:xdigit:]] 十六进制数字
[[:punct:]] 标点符号,包括上档键!@
[[:blank:]] TAB制表符和空格
[[:space:]] 任何空白字符,换行,回车符
[[:cntrl:]] 控制字符(TAB,退格)
模式单元
元字符“()”将其中的正则表达式变为原子(或称模式单元)使用。与数学表达式中的括号类似,“()”可以做一个单元被单独使用。
例如:
(Dog)+匹配的“Dog”、“DogDog”、“DogDogDog”………,因为紧接着“+”前的原子是元字符“()”括起来的字符串“Dog”。
You (very)+ old匹配“You very old”、“You very very old”
Hello (world|earth)匹配“Hello world”、“Hello earth”
一个模式单元中的表达式将被优先匹配或运算

特殊字符

所谓特殊字符,就是一些有特殊含义的字符,如上面说的”.txt”中的,简单的说就是表示任何字符串的意思。如果要查找文件名中有*的文件,则需要对*进行转义,即在其前加一个\。ls *.txt。正则表达式有以下特殊字符
image.png

模式匹配的顺序
在使用正则表达式时,需要注意匹配的顺序。通常,正则表达式按照由左至右的顺序依次匹配。
模式匹配的顺序(从高到低)
顺序 元字符 说明
1 () 模式单元
2 ?* +{} 重复匹配
3 ^$ 边界限制
4 | 模式选择

元字符表
字符 描述
\ 将下一个字符标记为一个特殊字符、或一个原义字符、或一个 向后引用、或一个八进制转义符。例如,’n’ 匹配字符 “n”。’\n’ 匹配一个换行符。序列 ‘\’ 匹配 “\” 而 “(” 则匹配 “(”。
^ 匹配输入字符串的开始位置。如果设置了 RegExp 对象的 Multiline 属性,^ 也匹配 ‘\n’ 或 ‘\r’ 之后的位置。
$ 匹配输入字符串的结束位置。如果设置了RegExp 对象的 Multiline 属性,$ 也匹配 ‘\n’ 或 ‘\r’ 之前的位置。

匹配前面的子表达式零次或多次。例如,zo_ 能匹配 “z” 以及 “zoo”。_ 等价于{0,}。

匹配前面的子表达式一次或多次。例如,’zo+’ 能匹配 “zo” 以及 “zoo”,但不能匹配 “z”。+ 等价于 {1,}。

? 匹配前面的子表达式零次或一次。例如,”do(es)?” 可以匹配 “do” 或 “does” 中的”do” 。? 等价于 {0,1}。

{n} n 是一个非负整数。匹配确定的 n 次。例如,’o{2}’ 不能匹配 “Bob” 中的 ‘o’,但是能匹配 “food” 中的两个 o。

{n,} n 是一个非负整数。至少匹配n 次。例如,’o{2,}’ 不能匹配 “Bob” 中的 ‘o’,但能匹配 “foooood” 中的所有 o。’o{1,}’ 等价于 ‘o+’。’o{0,}’ 则等价于 ‘o*’。

{n,m} m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,”o{1,3}” 将匹配 “fooooood” 中的前三个 o。’o{0,1}’ 等价于 ‘o?’。请注意在逗号和两个数之间不能有空格。

? 当 该字符紧跟在任何一个其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串
“oooo”,’o+?’ 将匹配单个 “o”,而 ‘o+’ 将匹配所有 ‘o’。

. 匹配除 “\n” 之外的任何单个字符。要匹配包括 ‘\n’ 在内的任何字符,请使用象 ‘[.\n]’ 的模式。
(pattern) 匹配 pattern 并获取这一匹配。所获取的匹配可以从产生的 Matches 集合得到,在VBScript 中使用 SubMatches 集合,在JScript 中则使用 $0…$9 属性。要匹配圆括号字符,请使用 ‘′或‘’。

(?:pattern) 匹 配 pattern 但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。这在使用 “或” 字符 (|) 来组合一个模式的各个部分是很有用。例如, ‘industr(?:y|ies) 就是一个比 ‘industry|industries’ 更简略的表达式。

(?=pattern) 正 向预查,在任何匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如,’Windows (?=95|98|NT|2000)’ 能匹配 “Windows 2000″ 中的 “Windows” ,但不能匹配 “Windows 3.1″ 中的 “Windows”。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。

(?!pattern) 负 向预查,在任何不匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如’Windows (?!95|98|NT|2000)’ 能匹配 “Windows 3.1″ 中的 “Windows”,但不能匹配 “Windows 2000″ 中的 “Windows”。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始

x|y 匹配 x 或 y。例如,’z|food’ 能匹配 “z” 或 “food”。’(z|f)ood’ 则匹配 “zood” 或 “food”。
[xyz] 字符集合。匹配所包含的任意一个字符。例如, ‘[abc]’ 可以匹配 “plain” 中的 ‘a’。

[^xyz] 负值字符集合。匹配未包含的任意字符。例如, ‘[^abc]’ 可以匹配 “plain” 中的’p’。

[a-z] 字符范围。匹配指定范围内的任意字符。例如,’[a-z]’ 可以匹配 ‘a’ 到 ‘z’ 范围内的任意小写字母字符。

[^a-z] 负值字符范围。匹配任何不在指定范围内的任意字符。例如,’[^a-z]’ 可以匹配任何不在 ‘a’ 到 ‘z’ 范围内的任意字符。

\b 匹配一个单词边界,也就是指单词和空格间的位置。例如, ‘er\b’ 可以匹配”never” 中的 ‘er’,但不能匹配 “verb” 中的 ‘er’。

\B 匹配非单词边界。’er\B’ 能匹配 “verb” 中的 ‘er’,但不能匹配 “never” 中的 ‘er’。

\cx 匹配由 x 指明的控制字符。例如, \cM 匹配一个 Control-M 或回车符。x 的值必须为 A-Z 或 a-z 之一。否则,将 c 视为一个原义的 ‘c’ 字符。

\d 匹配一个数字字符。等价于 [0-9]。
\D 匹配一个非数字字符。等价于 [^0-9]。
\f 匹配一个换页符。等价于 \x0c 和 \cL。
\n 匹配一个换行符。等价于 \x0a 和 \cJ。
\r 匹配一个回车符。等价于 \x0d 和 \cM。
\s 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。
\S 匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。
\t 匹配一个制表符。等价于 \x09 和 \cI。
\v 匹配一个垂直制表符。等价于 \x0b 和 \cK。
\w 匹配包括下划线的任何单词字符。等价于’[A-Za-z0-9_]’。
\W 匹配任何非单词字符包括下划线。等价于 ‘[^A-Za-z0-9_]’。
\xn 匹配 n,其中 n 为十六进制转义值。十六进制转义值必须为确定的两个数字长。例如,’\x41′ 匹配 “A”。’\x041′ 则等价于 ‘\x04′ & “1″。正则表达式中可以使用 ASCII 编码。.
\num 匹配 num,其中 num 是一个正整数。对所获取的匹配的引用。例如,’(.)\1′ 匹配两个连续的相同字符。
\n 标识一个八进制转义值或一个向后引用。如果 \n 之前至少 n 个获取的子表达式,则 n 为向后引用。否则,如果 n 为八进制数字 (0-7),则 n 为一个八进制转义值。
\nm 标 识一个八进制转义值或一个向后引用。如果 \nm 之前至少有 nm 个获得子表达式,则 nm 为向后引用。如果 \nm 之前至少有 n 个获取,则 n 为一个后跟文字 m 的向后引用。如果前面的条件都不满足,若 n 和 m 均为八进制数字 (0-7),则 \nm 将匹配八进制转义值 nm。
\nml 如果 n 为八进制数字 (0-3),且 m 和 l 均为八进制数字 (0-7),则匹配八进制转义值 nml。
\un 匹配 n,其中 n 是一个用四个十六进制数字表示的 Unicode 字符。例如, \u00A9 匹配版权符号 (?)。

例子 匹配32位md5
/^{32}$/

17 php与mysql

https://www.w3cschool.cn/php/php-mysql-select.html

连接数据库

在 PHP 使用 MySQL 数据库前,你需要先将它们连接。
PHP 5 及以上版本建议使用以下方式连接 MySQL :

MySQLi extension (“i” 意为 improved)
PDO (PHP Data Objects)
在 PHP 早起版本中我们使用 MySQL 扩展。但该扩展在 2012 年开始不建议使用。

我是该用 MySQLi ,还是 PDO?
如果你需要一个简短的回答,即 “你习惯哪个就用哪个”。

MySQLi 和 PDO 有它们自己的优势:
PDO 应用在 12 种不同数据库中, MySQLi 只针对 MySQL 数据库。
所以,如果你的项目需要在多种数据库中切换,建议使用 PDO ,这样你只需要修改连接字符串和部分查询语句即可。使用 MySQLi, 如果不同数据库,你需要重新所有代码,包括查询。
两者都是面向对象, 但 MySQLi 还提供了 API 接口。
两者都支持预处理语句。预处理语句可以防止 SQL 注入,对于 web 项目的安全性是非常重要的。

MySQLi 和 PDO 连接 MySQL 实例

使用以下三种方式来演示 PHP 操作 MySQL:
MySQLi (面向对象)
MySQLi (面向过程)
PDO

MySQLi Installation
Linux 和 Windows: 在 php5 mysql 包安装时 MySQLi 扩展多事情况下是自动安装的。
安装详细信息,请查看: http://php.net/manual/en/mysqli.installation.php
PDO 安装
For 安装详细信息,请查看: http://php.net/manual/en/pdo.installation.php

连接mysql

在我们访问 MySQL 数据库前,我们需要先连接到数据库服务器:

<?php
$servername="localhost"; // 连接本地数据库
$username="root";
$password="root";

//创建数据库连接
$conn = new mysqli($servername,$username,$password);

//检测数据库是否连接成功
if($conn->connect_error)
{
    echo("mysql_error").$conn->connect_error;
}
else{
    echo "mysql_connect successful";
}

面向过程

<?php
$servername = "localhost";
$username = "username";
$password = "password";

// 创建连接
$conn = mysqli_connect($servername, $username, $password);

// 检测连接
if (!$conn) {
    die("Connection failed: " . mysqli_connect_error());
}
echo "Connected successfully";
?>

PDO

<?php
$servername = "localhost";
$username = "username";
$password = "password";

try {
    $conn = new PDO("mysql:host=$servername;dbname=myDB", $username, $password);
    echo "Connected successfully";
    }
catch(PDOException $e)
    {
    echo $e->getMessage();
    }
?>

关闭连接

连接在脚本执行完后会自动关闭。你也可以使用以下代码来关闭连接:
实例 (MySQLi - 面向对象)
c o n n − > c l o s e ( ) ; 实例 ( M y S Q L i − 面向过程 ) m y s q l i c l o s e ( conn->close(); 实例 (MySQLi - 面向过程) mysqli_close( conn>close();实例(MySQLi面向过程)mysqliclose(conn);
实例 (PDO)
$conn = null;

php 创建 数据库,创建表

image.png

image.png

创建数据库

<?php
$servername = "localhost";
$username = "username";
$password = "password";

// 创建连接
$conn = mysqli_connect($servername, $username, $password);
$sql="create database mydata"; //创建数据库
if($conn->query($sql) === true)
{
    echo("database created successfully");
}
else{
    echo "error create database";
}

创建user表

<?php
$servername="localhost"; // 连接本地数据库
$username="root";
$password="root";
$dbname="xiaoqi";
//创建数据库连接
$conn = new mysqli($servername,$username,$password,$dbname);
// 创建users表
$sql="CREATE TABLE users(
id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(30) NOT NULL,
password VARCHAR(30) NOT NULL,
email VARCHAR(50));";

if($conn->query($sql) === true)
{
    echo("table created successfully");
}
else{
    echo "error create table";
}

给user表 写入数据

<?php
$servername="localhost"; // 连接本地数据库
$username="root";
$password="root";
$dbname="xiaoqi";
//创建数据库连接
$conn = new mysqli($servername,$username,$password,$dbname);
// 创建users表
$sql = "insert into users(username,password,email) values (
'xiaoqi','123456','admin@xiqoi.com'
)";
if($conn->query($sql) === true)
{
    echo("insert successfully");
}
else{
    echo "error ";
}

查询
fetch_assoc() 函数
从结果中取得一行作为关联数组

<?php
$servername="localhost"; // 连接本地数据库
$username="root";
$password="root";
$dbname="xiaoqi";
//创建数据库连接
$conn = new mysqli($servername,$username,$password,$dbname);

//查询 内容

$sql="select * from users";

$result = $conn->query($sql);

if($result->num_rows>0)
{
    while ($row=$result->fetch_assoc())
    {
        echo "id:".$row["id"]."-NAME:".$row["username"]."".$row["password"]."".$row["email"]."</br>";
    }
}
else
{
    echo "result 0";
}

删除数据

<?php
$servername="localhost"; // 连接本地数据库
$username="root";
$password="root";
$dbname="xiaoqi";
//创建数据库连接
$conn = new mysqli($servername,$username,$password,$dbname);
// 删除数据
$sql = "delete  from users where id='1'";
if($conn->query($sql) === true)
{
    echo "删除成功";
}
else{
    echo "删除失败 ";
}

更新数据库
一定要关闭的数据库

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值