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(对象)//对象引用的传递
魔术方法
- __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