2021-10-31

本文详细介绍了PHP的基础语法,包括注释、变量、数据类型、控制结构、错误处理、函数、类与对象、文件操作、正则表达式等。此外,还探讨了PHP的高级特性,如面向对象编程、文件上传、会话控制、错误处理、魔术方法等,以及常见的Web开发相关知识,如HTTP头信息、表单验证、目录和文件操作。
摘要由CSDN通过智能技术生成

PHP

ctrl+? 快速注释

风格

简短风格:

<?php echo "123";?>

Script风格:

<script language="php">echo "<p>MY PHP!</p>";</script>

ASP风格:

<% echo "<p>MY PHP!</p>";%>

默认情况下是静止的,需修改asp_tag选项,在php.ini
123

注释:单行//

​ 多行/**/

hi,这是我用百度网盘分享的文件~复制这段内容打开「百度网盘」APP即可获取。
链接:https://pan.baidu.com/s/1wIcrBTj42OaU9P8pW6k5QQ
提取码:e7u4

输出
echo print printf sprintf

echo 向浏览器输出字符串

print 返回值:整性

print 实际上不是函数(而是语言结构),所以可以不用圆括号包围参数列表。 

和 echo 最主要的区别: print 仅支持一个参数,并总是返回 1。 

echo print"123";先输出123 再输出返回值
echo "123"直接输出123 void类型 无返回值
echo运行速度更快

printf和c语言一样
echo printf("%d",1);

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iFLm8e78-1635663250092)(C:\Users\shironghua\AppData\Roaming\Typora\typora-user-images\image-20211029200023834.png)]

sprintf("123");
sprintf将字符保存在内存中
要使用echo sprintf("123");就会把他输出出来

print_r()

标识符与变量

标识符可以是任何长度,而且可以由任何字母,数字,下划线组成

不能以数字开始

在PHP中,区分大小写

一个变量名称可以和一个函数名称相同

数据类型

integer(整数)

float(浮点型)

double(双精度)

string(字符串)

Boolean(布尔类型)

Array(数组)

Object(对象)

创建变量时,通过赋值来确定他的类型

PHP是非常弱的类型语言

类型转换:

$sum=0;
$total=(float)$sum
使用类型转换,可以讲一个变量或值转换成另外一种类型
类型检测设置函数:
gettype($num) 输出函数类型
settype($sum,“类型”)设置函数类型
settype($sum,"string")此时sum被转换成一个字符串
类型转换
$sum=0;
$total=1.22;
$sum=$total //隐式转换

float($total)//显示转换 强制转换
isset()
检测一个变量是否存在
如果存在 则返回一个布尔值1
不存在则返回空


unset()
释放一个变量


empty($b)
检查一个变量的值是否为空
空字符串返回真 0返回0
以下的东西被认为是空的: 
•"" (空字符串)
•0 (作为整数的0)
•0.0 (作为浮点数的0)
•"0" (作为字符串的0)
•NULL
•FALSE
•array() (一个空数组)
•$var; (一个声明了,但是没有值的变量)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SZO6Evad-1635663250093)(C:\Users\shironghua\AppData\Roaming\Typora\typora-user-images\image-20211029203619172.png)]

intval() floatval()  strval()通过调用函数的形式转换变量
变量的作用域
$GLOBAL  所有全局变量数组
$_SERVER	服务器环境变量数组
$_GET	通过get方式传递进来的变量数组
$_PSOT
$_COOKIE	cookie变量数组
$_FILES	与文件上传相关的变量数组
$_ENV	环境变量数组
$_REQUEST	所有用户输入的变量数组
$SESSION	会话变量数组

常量:一旦被定义 就不能被更改

常量通过define(“TOTAL”,值) 来定义 常量一般都用大写


例子:
define(“TOTAL”,123);
define(“TOTAL”,456);
输出仍然是123

define(“TOTAL”,123);
$TOTAL=200;
这两个不是同一个

phpinfo中变量的输出

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YSQ96JG1-1635663250094)(C:\Users\shironghua\AppData\Roaming\Typora\typora-user-images\image-20211029204912213.png)]

“PHP_SELF”
当前正在执行脚本的文件名,与 document root 相关。举例来说,在 URL 地址为 http://example.com/test.php/foo.bar 的脚本中使用 $_SERVER['PHP_SELF'] 将会得到 /test.php/foo.bar 这个结果。__FILE__ 常量包含当前(例如包含)文件的绝对路径和文件名。 

如果 PHP 以命令行方式运行,该变量在 PHP 4.3.0 之前无效。 

“argv”
传递给该脚本的参数。当脚本运行在命令行方式时,argv 变量传递给程序 C 语言样式的命令行参数。当调用 GET 方法时,该变量包含请求的数据。 

“argc”
包含传递给程序的命令行参数的个数(如果运行在命令行模式)。 

“GATEWAY_INTERFACE”
服务器使用的 CGI 规范的版本。例如,“CGI/1.1”。 

“SERVER_NAME”
当前运行脚本所在服务器主机的名称。如果该脚本运行在一个虚拟主机上,该名称是由那个虚拟主机所设置的值决定。 

“SERVER_SOFTWARE”
服务器标识的字串,在响应请求时的头信息中给出。 

“SERVER_PROTOCOL”
请求页面时通信协议的名称和版本。例如,“HTTP/1.0”。 

“REQUEST_METHOD”
访问页面时的请求方法。例如:“GET”、“HEAD”,“POST”,“PUT”。 

注: 如果请求的方式是 HEAD,PHP 脚本将在送出头信息后中止(这意味着在产生任何输出后,不再有输出缓冲)。 

“REQUEST_TIME”
请求开始时的时间戳。从 PHP 5.1.0 起有效。 

“QUERY_STRING”
查询(query)的字符串(URL 中第一个问号 ? 之后的内容)。 

“DOCUMENT_ROOT”
当前运行脚本所在的文档根目录。在服务器配置文件中定义。 

“HTTP_ACCEPT”
当前请求的 Accept: 头信息的内容。 

“HTTP_ACCEPT_CHARSET”
当前请求的 Accept-Charset: 头信息的内容。例如:“iso-8859-1,*,utf-8”。 

“HTTP_ACCEPT_ENCODING”
当前请求的 Accept-Encoding: 头信息的内容。例如:“gzip”。 

“HTTP_ACCEPT_LANGUAGE”
当前请求的 Accept-Language: 头信息的内容。例如:“en”。 

“HTTP_CONNECTION”
当前请求的 Connection: 头信息的内容。例如:“Keep-Alive”。 

“HTTP_HOST”
当前请求的 Host: 头信息的内容。 

“HTTP_REFERER”
链接到当前页面的前一页面的 URL 地址。不是所有的用户代理(浏览器)都会设置这个变量,而且有的还可以手工修改 HTTP_REFERER。因此,这个变量不总是真实正确的。 

“HTTP_USER_AGENT”
当前请求的 User-Agent: 头信息的内容。该字符串表明了访问该页面的用户代理的信息。一个典型的例子是:Mozilla/4.5 [en] (X11; U; Linux 2.2.9 i586)。也可以使用 get_browser() 得到此信息。 

“HTTPS”
如果脚本是通过 HTTPS 协议被访问,则被设为一个非空的值。 

“REMOTE_ADDR”
正在浏览当前页面用户的 IP 地址。 

“REMOTE_HOST”
正在浏览当前页面用户的主机名。反向域名解析基于该用户的 REMOTE_ADDR。 

注: 必须配置 Web 服务器来建立此变量。例如 Apache 需要在 httpd.conf 中有 HostnameLookups On。参见 gethostbyaddr()。 

“REMOTE_PORT”
用户连接到服务器时所使用的端口。 

“SCRIPT_FILENAME”
当前执行脚本的绝对路径名。 

注: 如果脚本在 CLI 中被执行,作为相对路径,例如 file.php 或 ../file.php,$_SERVER['SCRIPT_FILENAME'] 将包含用户指定的相对路径。 


“SERVER_ADMIN”
该值指明了 Apache 服务器配置文件中的 SERVER_ADMIN 参数。如果脚本运行在一个虚拟主机上,则该值是那个虚拟主机的值。 

“SERVER_PORT”
服务器所使用的端口。默认为“80”。如果使用 SSL 安全连接,则这个值为用户设置的 HTTP 端口。 

“SERVER_SIGNATURE”
包含服务器版本和虚拟主机名的字符串。 

“PATH_TRANSLATED”
当前脚本所在文件系统(不是文档根目录)的基本路径。这是在服务器进行虚拟到真实路径的映像后的结果。 

注: PHP 4.3.2 之后,PATH_TRANSLATED 在 Apache 2 SAPI 模式下不再和 Apache 1 一样隐含赋值,而是若 Apache 不生成此值,PHP 便自己生成并将其值放入 SCRIPT_FILENAME 服务器常量中。这个修改遵守了 CGI 规范,PATH_TRANSLATED 仅在 PATH_INFO 被定义的条件下才存在。 

Apache 2 用户可以使用 httpd.conf 中的 AcceptPathInfo On 来定义 PATH_INFO。 

“SCRIPT_NAME”
包含当前脚本的路径。这在页面需要指向自己时非常有用。__FILE__ 包含当前文件的绝对路径和文件名(例如包含文件)。 

“REQUEST_URI”
访问此页面所需的 URI。例如,“/index.html”。 

“PHP_AUTH_DIGEST”
当作为 Apache 模块运行时,进行 HTTP Digest 认证的过程中,此变量被设置成客户端发送的“Authorization”HTTP 头内容(以便作进一步的认证操作)。 

“PHP_AUTH_USER”
当 PHP 运行在 Apache 或 IIS(PHP 5 是 ISAPI)模块方式下,并且正在使用 HTTP 认证功能,这个变量便是用户输入的用户名。 

“PHP_AUTH_PW”
当 PHP 运行在 Apache 或 IIS(PHP 5 是 ISAPI)模块方式下,并且正在使用 HTTP 认证功能,这个变量便是用户输入的密码。 

“AUTH_TYPE”
当 PHP 运行在 Apache 模块方式下,并且正在使用 HTTP 认证功能,这个变量便
转义字符

双引号中可以自动解析

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PuxnPmb6-1635663250096)(C:\Users\shironghua\AppData\Roaming\Typora\typora-user-images\image-20211029210833074.png)]

单引号

单引号会按照声明的解释,解析字符串时,变量和转义序列都不会被解析

如\n在单引号中就无效

比较

== 数值相同

===数值 类型都相同

逻辑运算符

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-M6sgVGCw-1635663250097)(C:\Users\shironghua\AppData\Roaming\Typora\typora-user-images\image-20211029211306245.png)]

错误抑制操作符@ 可以避免报错

控制结构

if elseif

switch …case…

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-q5CpFQKE-1635663250099)(C:\Users\shironghua\AppData\Roaming\Typora\typora-user-images\image-20211029211908290.png)]

存在break退出问题,如果没有break就不会退出 ,会全部输出

while(条件){

}

for循环

for(){

}

do{

}while(条件){

}

随机数
rand() 
mt_rand()
mt_rand()将rand()替代了
数组

标识符称为键(key)

对应的值为(value)

索引即下标从0开始

生成方式1

$username=array('123','1as','fasd')
echo $usernames; 会输出Array
echo $usernmae[2] 输出fasd
$print_r($username)

生成方式2

range(1,10) 生成key为1-10的数组

使用count(),或者sizeof()函数可以得出数组元素的个数

访问:

访问用for循环遍历访问,但如果key不是从0开始,或者不是数字,就不能使用这种方法

或者print_r打印出来,此时使用foreach循环来遍历数组

foreach($username as $value){

echo $value;

}
这种方法不需要考虑key  $value这边这个变量没有固定,但一般约定使用value


foreach($username as $key => $value){
echo $key;
}这种写法可以输出key

is_array()可以判断是否为数组变量

自定义键数组:

$username=array('baidu'=>'1','alibaba'=>'2');

使用each输出数组

each — 返回数组中当前的键/值对并将数组指针向前移动一步
print_r(each($username));

$username=array('baidu'=>'1','alibaba'=>'2');
$a=each($username);
echo $a[0];
//each会把原来的数组重新包装成key从0开始的数组

while(!!$a=each($username)){		//($a=each($username)) 也可以
	echo $a['key'].$a['value'];
}

可以使用list()函数 来将一个数组分解为一系列的值

例如 list( n a m e , name, name,age)=each($ages);

list只能认识key为数字的数组 自定义的字符串key无法用list识别

<?php
$fruit = array('a' => 'apple', 'b' => 'banana', 'c' => 'cranberry');

reset($fruit);
while (list($key, $val) = each($fruit)) {
    echo "$key => $val\n";
}
?>

输出
a => apple
b => banana
c => cranberry

reset–将数组的内部指针指向第一个元素

二维数组

a[i][j]

sort(对数组排序)

目录 操作

basename — 返回路径中的文件名部分

dirname — 返回路径中的目录部分

pathinfo — 返回文件路径的信息

realpath — 返回规范化的绝对路径名

opendir()打开一个目录

readdir()读出目录

closedir()关闭

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FCmOzVeK-1635663250100)(C:\Users\shironghua\AppData\Roaming\Typora\typora-user-images\image-20211030215129200.png)]

scandir() 将目录读入数据

rmdir()删除指定的目录

rename()重命名文件

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5ydKpGg5-1635663250101)(C:\Users\shironghua\AppData\Roaming\Typora\typora-user-images\image-20211030215236507.png)]

文件操作

使用fopen()函数打开一个文件

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-n9swC2rN-1635663250101)(C:\Users\shironghua\AppData\Roaming\Typora\typora-user-images\image-20211029230451102.png)]

fp=fopen('1.txt','w'); 		//fopen返回的是资源类型resource 

							//w如果 文件存在并且有数据 就会删除他重新创建 如果不存在就会创建
fwrite($fp,'123');						
fclose('1.txt','w');

读出文件

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-p1VQFgjR-1635663250103)(C:\Users\shironghua\AppData\Roaming\Typora\typora-user-images\image-20211030214034294.png)]

自定义函数
创建函数
<?php
	function functionName(){			//命名一般是驼峰式
	echo '这是一个无参无返回的自定义函数'
	}
?>
    
    
调用函数
 <?
    functionName();
 ?>
     
     
     
     
     
 如果要返回值就和c语言一样加上return
 返回多个数据就需要使用数组

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WQLcejEA-1635663250104)(C:\Users\shironghua\AppData\Roaming\Typora\typora-user-images\image-20211030220206357.png)]

function functionName($price){

}
这种方法传出来的price是函数带入时候付给的price值,而外面的price值不会受到影响
function functionName(&$price){

}加上&就可以修改函数外面的price值
全局变量

通过使用超级全局变量$global,可以访问或改变全局作用域中的任何变量

function functionName($price){
		global $a//将a设置为全局变量
		$a=2;
}
echo $a//输出a=2
文件包含
include 'file' 
include_once 'file'		//先判断是否包含了这个文件
require('file')	
require_once('file')

include如果找不到文件 还会继续执行
require如果找不到就直接报错退出


_FILE_   当前文件名 魔法变量 这里的常量说白了是一个值
_LINE_		当前行号
_FUNCTION	当前函数名
_CLASS_		当前类名
_METHOD_		当前方法名
字符串处理
chop() 移除字符串后面多余的空白,包括换行
ltrim()	移除字符串起始处多余空白 只清理左边
rtrim()	移除字符串后面多余的空白 包括新行  只清理右边
trim()	移除字符串两边多余的空白

将特殊字符转换为html等价形式 可以使用htmlentities()和htmlspecialchars

如果想去掉字符串中的html去掉,可以使用strip_tags()

strip_tags — 从字符串中去除 HTML 和 PHP 标记
addslashes()		addslashes — 使用反斜线引用字符串 引号(单,双),反斜杠\和null字符都会被处理
stripcslashes() 会将addslashes处理过的字符串还原
strtoupper() 将字符串转换成大写
strtolower()	转换成小写
ucfirst()	将第一个字母转换成大写
ucwords()	将每个单词第一个字母转换成大写
str_pad — 使用另一个字符串填充字符串为指定长度
explode() 	分割
$email=explode('@','48357189@qq.com');
print_r后会得到
Array ( [0] => 48357189 [1] => qq.com ) 


implode()	合并
$arr=array('lee','faker');
echo $str('&',$arr);
得到
lee&faker

join()



substr — 返回字符串的子串
substr( string $string, int $start[, int $length] ) : string

返回字符串 string 由 start 和 length 参数指定的子字符串。 
$a="faker";
echo substr($a,0,1);
会取出f

字符串比较

使用==来比较字符串是否相等
strcmp()
strcasecmp() //不区分大小写的比较
strnatcmp — 使用自然排序算法比较字符串
将两个字符串进行比较,如果相等返回0
strpos('6344586@qq.com','6')
返回0 也就是6的位置是0
strrpos(‘6344586’,’6‘)
返回6 也就是他最后出现的位置
str_replace('要查找的字符串',’要替换成的字符串,‘需要被替换处理的字符串)//字符串替换
echo str_replace('Lee','wq','this is Lee')
会输出this is wq


str_ireplace()不区分大小写的替换


substr_replace(’123146464‘,’&&&‘,0,5)
从0开始 取出5个 都替换成&&&

以mb开头的函数 都是处理中文字符的

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mqqNyEQt-1635663250105)(C:\Users\shironghua\AppData\Roaming\Typora\typora-user-images\image-20211030231256104.png)]

正则表达式
preg_match('/php/','php')
规则模式:/php/ 在字符串前后加上两条斜杠即可
匹配函数preg_match()在字符串中搜索模式,如果存在则返回ture 否则返回false
这里是匹配而不是判断是否相等 两者存在区别

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PiWCNqQA-1635663250105)(C:\Users\shironghua\AppData\Roaming\Typora\typora-user-images\image-20211030231755409.png)]

/ph+p/  前导就是h   +在这里就是表示至少要包含一个h

​ 元字符

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LAH3U7IE-1635663250106)(C:\Users\shironghua\AppData\Roaming\Typora\typora-user-images\image-20211030232039636.png)]

$一般加在模式字符串的尾部,表示从尾巴开始匹配
$和^一起用的话基本就不用正则 直接==就可以判断
| 相当于或				

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IcU75NVg-1635663250107)(C:\Users\shironghua\AppData\Roaming\Typora\typora-user-images\image-20211030232426297.png)]

//\s 表示匹配任何空白字符
其他以此类推

如果要匹配特殊字符的话,必须在字符前面加上/

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QKmIQFTU-1635663250107)(C:\Users\shironghua\AppData\Roaming\Typora\typora-user-images\image-20211030232818279.png)]

/php/i			
表单与验证
header()
header('Contene-Type:text/htm;charset=gbk')		//设置页面编码
header('Location:Demo2.php')		//自动跳转
会话控制

Cookie的应用,由于cookie大小限制,数量及其他原因开发人员又想出了使用session会话控制

cookie是在你的客户机的一个小文件,这个小文件包含你登录时的信息

setcookie('名称','值')		//创建cookie

当创建一个包含过期时间的cookie,过期时间采用当前时间戳+秒即可

setcookie('名称','值',time()+(7*24*60*60));//time()+(7*24*60*60)表示未来7天

一旦setcookie改变 刷新就会把原来的覆盖掉

echo $_COOLIE['名称']  
获取会慢一拍 第二次刷新才能真正获得
使用isset($_COOKIE['名称'])  来判断cookie是否存在

删除cookie

方法一:将时间调成过期时间

setcookie(‘name’,‘lee’,time()-1);

cookie创建的限制实在客户端,一个浏览器cookie数量最多为30,并且不能超过4KB,每个web站点能设置的cookie总数不超过20,于是出现了session

SESSION会话处理

session_start()  //只要用到这个 session就必须开启 一般放在文件开头
创建session,直接采用超级全局变量赋值即可
$_SESSION['name']='faekr';
session是存放在服务器端,一般存放1440秒
如果网页没有任何操作,会自动销毁,当然,可以通过配置php.ini
如果关闭了浏览器,也会自动销毁
及时性,不像cookie一样慢半拍

可以使用unset($_SESSION['name'])去删除指定session
session_destroy(); 即可销毁全部session 慢半拍
<?php
session_start();
$_SESSION['name']='faker';
echo($_SESSION['name']);
?>

cookie和session区别

cookie一般用于会员登录,购物车
因为他不占有服务器资源,所以会员可以特别多

session一般用于后台管理登录,人少
安全性好,一段时间不操作会自动过期
文件上传
php.ini中
file_uploads=on|off 可以确定服务器上的php脚本是否接受文件上传
max_execution_time=intefer php脚本在注册一个致命错误之前可以执行的最长时间,秒
memory_limit=interger 设置脚本可以分配到的最大内存,以mb为单位。防止失控脚本占用服务器内存
upload_max_filesize=integer 设置上传文件最大大小,以mb为单位。必须小于post_max_size
post_max_size=integer 确定通过post方法可以接受的信息最大大小,mb为单位
$_FILES 文件的超全局变量

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vQhZMXHo-1635663250108)(C:\Users\shironghua\AppData\Roaming\Typora\typora-user-images\image-20211031093548526.png)]

$_FILES['userfile']['tmp_name']   变量中的值就是文件在web服务器中临时保存的位置
$_FILES['userfile']['name']		 用户系统中的文件名称 
$_FILES['userfile']['size'] 		文件的字节大小
$_FILES['userfile']['type']		文件的MIME类型,例如image/gif 
$_FILES['userfile']['error'] 		存放与任何文件上载相关的错误代码	

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-z1gakBfU-1635663250109)(C:\Users\shironghua\AppData\Roaming\Typora\typora-user-images\image-20211031093907518.png)]

浏览器与web服务器之间的通信

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-C1TKS43Y-1635663250109)(C:\Users\shironghua\AppData\Roaming\Typora\typora-user-images\image-20211031094112517.png)]

面向对象

面向对象(OOP)

封装 继承 多态

关键概念

类(class)
电脑类 比如电脑生产厂 这个厂可以生产第一台电脑 他也可以生产第n台电脑

对象(object)
一台电脑

字段(filed)
电脑型号 例如联想i7 
字段也叫成员

属性(attribute)
设置 获取电脑的配置

方法(method)
电脑开机 关机的行为

创建类和创建对象

创建:
修饰符 class 类名{

}

class Compurer{	//类名第一个字母大写
 
}


创建对象
创建一台电脑出来,也就是对象的声明
变量=new 类名()
$computer1=new Computer(); //这个过程表示实例化过程 意思就是创建一个对象 然后把实例化对象的地址赋值给$computer
$computer2=new Computer();	//创建第二台电脑 与computer1互不相干 是两台电脑

创建方法

修饰符 function 方法名(){

}//如果没有加修饰符 默认就是public

调用
$computer1=new Computer();
$computer->run();

构造方法

第一种:
class Computer{
	public function Computer(){
	 echo "我是构造方法";
	}
}
$computer=new Computer();
直接输出我是构造方法  这就是构造方法 要求:类名和方法名称必须相同

第二种:
内置构造方法
__construct()


class Computer{
	public function __construct(){
	 echo "我是构造方法";
	}
}
$computer=new Computer();

析构方法

__destruct()
整个类使用完毕后执行,一般用于清理内存中对象,而如果有脚本执行完毕后没有清理的,比如数据库等,

class Computer{
	function __destruct(){
		echo "我是析构方法"
	}
}

OOP的封装

字段的作用域

public 公共的 (类外可以访问)
private 私有的 (类内可以访问)		对字段进行封装
protected 受保护的 (类内和子类可以访问)

private

什么叫类内 就是创建类的花括号内,其他地方叫类外
private的访问需要采用一个公共对外的接口来进行访问

错误师范:
class Computer{
	private $_name="联想";
	public function _run{
		echo $name 				//此时会报错 得不到结果
	}
}
原因:字段在类内调用的时候必须是 类->字段 , $_name只是一个普通变量
	 字段在类外调用的方法是 对象->字段
在本类中,可以使用一个关键词来代替Computer,那就是$this
<?php
class faker{
    private $faker=123;
    public function _run(){
        echo $this->faker;
    }
}
$a=new faker;
$a->_run();
?>

如果有十个字段那就必须使用20个方法才能赋值和取值,于是php内置了两个方法(拦截器),用于取值和赋值:_ set(), _get()

<?php
class name{
    private $faker;
    private $faker1;
    private $faker2;
//遇到__set __get php会自动拦截下来然后执行
    public function __set($key,$value){
    $this->$key="$value";
    }
    public function __get($value)
    {
        return $this->$value;
    }
}
$a=new name;
$a->faker="shit";
$a->faker1="shit";
$a->faker2="shit";
echo $a->faker;
echo $a->faker1;
echo $a->faker2;
?>
   
    
    
    
    
    
<?php
class name{
    private $faker;
    private $faker1;
    private $faker2;
//遇到__set __get php会自动拦截下来然后执行
    private function __set($key,$value){
    $this->$key="$value";
    }
    private function __get($value)
    {
        return $this->$value;
    }
}
$a=new name;
$a->faker="shit";
$a->faker1="shit";
$a->faker2="shit";
echo $a->faker;
echo $a->faker1;
echo $a->faker2;
?>
   

常量(constant)

class Computer{
	const NAME='DELL';
	//常量的输出方法,类::常量
}
echo Computer::NAME;

静态类成员

<?php
class Computer{
	public static $_count=0;
	//如果是静态成员字段,就应该使用self来调用,而不是$this
	public function _add(){
		self::$count++;
	}
}
$computer1=new Computer();
$computer1->_add();
$computer1->_add();
$computer1->_add();
echo Computer::$count;  //输出3
$computer2=new Computer();
$computer2->_add();
$computer2->_add();
$computer2->_add();
echo Computer::$count;	//输出6 因为使用了static静态类 于是数据被放在数据区
?>




class Computer{
 	public static $_count=0;
 	public static function _run(){
 		self::$_count++;
 	}
}
Computer::_run();
Computer::_run();   //方法和成员都在静态数据区

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YpygmsNu-1635663250110)(D:\桌面\tool\笔记\PHP.assets\image-20211031133336052.png)]

instanceof 判断是否是xxx的对象

OOP继承

子类所继承的类成员父类或基类

<?php
class Computer{
    public $_name="123";
    public function run(){
        echo"我是父类";
    }
}
class Jochen extends Computer{
}
$jicheng=new Jochen();
$jicheng->run();
echo $jicheng->_name;
?>


当不需要父类的字段和方法,那么可以采用重写的方法来覆盖掉父类的字段和方法
<?php
class Computer{
    public $_name="123";
    public function run(){
        echo"我是父类";
    }
}
class Jochen extends Computer{
	public $name="456";
	public function run(){
		echo "456";
	}
}
$jicheng=new Jochen();
$jicheng->run();
echo $jicheng->_name;
?>

私有化无法被子类继承,这个时候就应该使用受保护的protected

<?php
class Computer{
    private $_name="123";
    private function run(){
        echo"我是父类";
    }
}
class Jochen extends Computer{
	}
}
$jicheng=new Jochen();
$jicheng->run();
echo $jicheng->_name;
?> 报错

正确:
<?php
class Computer{
    protected $_name="123";
    protected function run(){
        echo"我是父类";
    }
}
class Jochen extends Computer{
	}
}
$jicheng=new Jochen();
$jicheng->run();
echo $jicheng->_name;
?> 

当子类已经覆盖了父类的字段和方法,如果还要调用父类的字段和方法

这时就必须使用 :父类名::方法()或者parent::方法来调用

final关键词可以防止类被继承,有时候只想做个独立的类,不想被其他类继承使用就必须使用这个关键词

final public function run(){

}//此时run()这个方法就不能被继承 也不能被重写

抽象类和方法(abstract)

抽象类方法很特殊,只在父类中声明,但是在子类中实现。只有声明为abstract的类可以声明抽象方法

规则:1.抽象类不能被实例化,只能被继承

​ 2.抽象方法必须被子类方法重写

abstract class Computer{		//只要在classi前面加上abstract就是抽象类了
	abstract function run();		//在抽象里创建一个抽象方法
	//public function run2();		//如果创建的是普通方法也是可以的 跟前面的用法一样,而										且抽象类里的普通方法,不需要重写,子类会直接继承
}									
//抽象类不能被实例化 就是用来创建对象的
//抽象类是给子类用来继承的,实现一种规范和资源的共享
final class NotebookComputer extends Computer{
	public function run(){			//抽象类里的抽象方法,子类必须重写,不然会报错
	echo "我是子类的方法";
	}
}


只要类里面有一个是抽象方法,那么这个类就必须是抽象类 要加上abstract

接口(interface) 相当于一个特殊的抽象类

类不能实现多继承,只支持多继承

例如 class book extends faker,faker2就会报错 只能继承一个才不会报错

规则:类全部为抽象方法(不需要声明abstract)

​ 接口抽象方法必须是public

​ 成员(字段)必须是常量

<?php
//创建一个接口
//成员字段必须是常量
interface Computer{
	const NAME=“联想”;
	//接口里的所有方法都是抽象方法,不能够写方法体
	//并且接口里的抽象方法不需要写abstract
	public function _run();
	/*如果写成 public function _run(){ echo "213"} 就会报错 不能写方法体/*
}
//接口::常量
echo Computer::NAME; 
?>

interface Computer2{
	public function run3();
}

//子类继承接口的说话 叫实现,接口可以多实现
class NoteComputer implements Computer,computer2{	//可以多继承
public function _run(){
}
}

总结:要继承多个类的方法规范就是用接口

​ 如果你要共享一个方法体内容,就是用抽象类

class Persion{
	public function _run($type){
	
	}
}
$persion=new Persion();
$persion->_run(对象)//对象引用的传递

魔术方法

  1. __autoload()
__autoload() 内置方法自动包含类文件。应该被写成单个参数的方法。当php引擎遇到试图实例化未知类的操作时,会调用,并将类名当作字符串参数传递给他

文件1 computer.class.php

class Computer{
	public _name='faekr'
};

文件2 computer.php (第一种)

require 'computer.class.php'
$computer=new Computer();
echo $computer->_name

但如果要包含多个类文件,一一进入太麻烦

引入多个类文件,用不到很浪费

引入类文件容易遗漏 容易发生错误

所以有第二种

function __autoload($_className){
	require strtolower($className).'class.php';
}
$computer=new Computer		//实例化后,此时$className被赋值成Computer
$persion=new Persion			//此时会自动赋值第二个为Persion类

2.__call

该方法用来屏蔽调用方法时产生的错误,当调用一个不存在的方法时,会自动调用__call()
假设只存在__call
$computer=new Computer();
$computer->_go();  //_go方法不存在,此时就会自动去加载call方法里的

3.__tostring

把对象当成一个字符串使用 就会调用
$computer=new Computer();
echo $computer; 就会自动调用tostring

4.__clone

php可以在类定义一个__clone方法来调整对象的克隆行为,当一个对象被克隆的时候自动执行,而赋值的对象可以在其方法体内进行调整

正常情况[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pFm6l5Py-1635663250111)(D:\桌面\tool\笔记\PHP.assets\image-20211031143619713.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xbwjpnj9-1635663250111)(D:\桌面\tool\笔记\PHP.assets\image-20211031143555327.png)]

此时调用同一块地址 值跟着被修改

使用clone

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uHRlKFYn-1635663250112)(D:\桌面\tool\笔记\PHP.assets\image-20211031143704079.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HyAiW7wS-1635663250113)(D:\桌面\tool\笔记\PHP.assets\image-20211031143717527.png)]

就相当于复制了一个computer1

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xuBnyZW2-1635663250114)(D:\桌面\tool\笔记\PHP.assets\image-20211031143743983.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IwjPKhRJ-1635663250115)(D:\桌面\tool\笔记\PHP.assets\image-20211031143807275.png)]

序列化对象之前就调用此方法(其返回需要是一个数组):__sleep
反序列化恢复对象之前就调用此方法:__wakeup
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值