3.1网安学习第三阶段第一周回顾(个人学习记录使用)

news/2024/4/13 10:27:22/文章来源:https://blog.csdn.net/lovely2610/article/details/136417256

本周重点

①HTML/JavaScript/CSS

②PHP

③正则表达式/文件上传/文件读写

④AJAX不跳转提交

⑤ OOP面向对象编程

本周主要内容

DAY1 HTML/JavaScript/CSS

①HTML

一、基本结构
<HTML> 
<head>
//头部内容
<title>网页标题</title>
</head>
<body>
网页内容的主体
</body>
</HTML>
二、主要标签
1、<p></p>文字单独一个段落
2、<br>换行
3、<b></b> 字体加粗
4、<strong></strong>字体加粗
5、<font color="字体颜色" face="字体类型" size="字体大小"></font>
6、<h1></h1><h2></h2><h3></h3><h4></h4><h5></h5><h6></h6>标题
7、<ul><li></li></ul>展示列表
8、<i></i>斜体
9、<u></u>文字加下划线
10、<video></video>视频标签
11、<table></table>表格
12、<tr></tr>表格的一行
13、<td></td>一个单元格
14、<img src='图片文件地址'>引入图片
15、<a href="跳转地址"></a>网页超链接
16、<div></div> 块级元素,自己会占一行
17、<form></form>表单
18、<input >输入框
--type=text 文本输入
--type=password 密码输入
--type=submit  提交按钮
--type=radio 单选按钮,每次只能选一个
--type=checkbox 复选按钮,可以同时选多个
--type=file 文件上传
18、<select><option></option></select> 单选下拉列表

②JavaScript

一、概述

javascript (js):一种脚本语言,运行浏览器。作用:用于页面与用户之间的交互。

js基础:输入输出、数据类型、控制结构、函数、事件

DOM:元素识别和定位,元素的操作。

二、数据类型和运算符

所有js代码必须放在script标签中。script可以放在head或者body中。

1、输入输出:

输出:

alert();     以弹窗方式回显内容
console.log();    在控制台输出
document.write();     在页面上显示

输入:prompt(提示文字) 任何输入都是字符串

a = prompt();
alert(a);

2、数据类型:

基本数据类型:

Number、String、Undefined、Boolean、Null

(1)Number:

可以识别整形和浮点型

(2)String:

通过引号定义的类型。

(3)Undefined:

输出一个未定义的变量类型:

(4)null:

通过定义的方式直接赋值null.

(5)数组:

将一组数据保存在一个变量中。

arr  = [值,值2,...]
arr = new Array(值1,值2)
arr = new Array();
arr[索引]=值;

3、类型转化

(1)Number->String(隐式类型转换)

string+number 
数字.toString()

(2)String->Number(显示类型转换)

parseInt(字符串);
parseFloat(字符串);

4、运算符:

(1)算术运算符:

+ - * / %  ** 位移运算

(2)比较运算符:

> >= < <= ==(只要数值相同就可以)  ===(全相等,类型和数据都要一样) != !==

(3)自增自减

++   --

(4)成员运算符:

in,instanceof
三、控制结构

1、 分支结构

(1)if -- else

if(条件){语句;
}else if(条件){语句;
}else{语句;
} 

(2)switch -- case

switch(变量){case  数字(整形):语句break;...default:语句;
}

2 、循环结构

(1)for

for(i=0;i<10;i++){语句
}

(2)while

while(条件){语句;
}

(3)do-while

do{语句;
}while(条件);
四、函数:

函数:将重复的代码封装,减少代码冗余。

function 函数名(参数){函数体;return 数据;
}
、事件:

通过在元素中,添加属性方式,触发js函数调用的操作。

onload     页面加载时当前元素时触发
onclick    当元素被点击时调用函数
onfocus    当获取焦点时。
onblur     当失去焦点时调用函数
onmouseover    当鼠标移动到元素上时触发函数调用
onmousemove    当鼠标在元素上移动时触发函数调用
onmouseleave   当鼠标移开后
onkeydown    当键盘被按下
onkeyup      当键盘被释放
onkeypress   当键盘按下
、DOM

DOM(document object model) 页面对象模型:可以实现对页面元素操作。修改内容、修改属性、修改样式、删除元素

1、识别元素:

(1)通过id属性:

document.getElementById()   --> 元素对象

(2)通过类名:

document.getElementsByClassName()   -->元素对象数组  [object]

(3)通过name属性:

document.getElementsByName()    -->元素对象数组

(4)通过标签名:

document.getElementsByTagName()   -->元素对象数组

2、获取内容:

(1)属性:

ele = document.getElementById()
ele.value         获取input标签中的value值
ele.innerText     获取标签对中间的文本内容
ele.innerHTML     获取标签对中html标签及文本内容ele.setAttribute("属性名",值);  添加属性/设置属性值
ele.removeAttribute("属性名");  移除属性
七、定时器:

js的函数:

(1)setTimeout(); 当设定时间结束时,触发操作

setTimeout(function(){操作;
},时间)
时间以毫秒为单位

(2)setInterval() ; 在设定时间,重复操作

setInterval(function(){操作;
},时间)
时间以毫秒为单位

③CSS层叠样式表

一、概述

html页面如果需要对元素进行大小、颜色、形状设定,需要使用css.

css(cascading style sheet)层叠样式表。

层叠:对于样式设置中,可能对同一个页面元素进行了多次样式设置,需要考虑优先级。

二、css属性

1、文字类:

font-size:    大小
font-weight:     加粗
color :    颜色
font-famliy:   字体
text-align :    位置设置
line-height:    文字在容器中垂直方向居中

2、宽高:

width:  宽度
height:  高度

3、边框:

border: 线宽 线型 颜色
border-top:    上
border-right:    右
border-bottom:    下
border-left:   左

4、位置:

margin: 0 auto      水平居中
margin-top:    距离上xx像素
margin-right:   距离右xx像素
margin-bottom:   下
margin-lift:    左
三、选择器

1、ID选择器:

id属性,整个页面唯一

1.页面元素必须设置id属性:
<input type="text" name="username" id="input2">
2.通过选择器设置属性:
#input2{font-size: 20px;color: red;text-align: right;
}

2、class选择器: class属性,多个元素可以相同,同一个元素可以有多个class值

1.先创建class属性
<input type="text" name="username" id="input1" class="c1" style="width:300px;height: 50px;background-color: blanchedalmond; border: 1px solid red;">
<input type="text" name="username" id="input2" class="c1 c2">
2.类选择器:.c1{font-weight: 800;}.c2{font-family: 仿宋;}

3、标签选择器: 直接通过标签名进行设置

1.选择需要设置属性的标签
<span>1</span><br>
<span>2</span><br>
<span>3</span><br>
<span>4</span><br>
<span>5</span><br>
2.标签选择器设置:
span{font-size: 46px;
}
四、css引入方式:

1、外部样式: 在页面所在项目中,通过link标签中的href属性引入写在css目录的.css扩展名的文件。

1.先创建一个css文件:
内容  选择器{属性:值;}
2.在html页面中,
<link href="../css/xxx.css" rel="stylesheet">

2、内部样式: 通过在head标签中使用style标签引入的方式,可以影响整个页面

<style>选择器{属性:值;...}选择器2{属性:值;...}
</style>

3、内联样式(行内样式):在页面元素得标签中,通过style属性引入的样式

<input type="text" name="username" style="width:300px;">

优先级:就近原则

DAY2 PHP

一、概述

php:是一门解释型语言,也是弱类型语言。php代码必须下载php代码块中<?php ?>,php文件必须放在apache执行目录下(htdocs),所有的php访问,必须通过http或者https协议向apache发送请求。

二、使用

1、输出:

echo 内容;    //只能输出字符串
print();     //只能输出字符串
print_r();    //可以输出任何数据类型
var_dump();   //输出任意类型同时,显示类型、个数和长度输出时,如果需要同时输出多个字符串,可以通过"."或者“,”拼接字符串。

2、注释:

//   单行注释
/* content */   多行注释

3、变量:

1.必须谁用$开始
2.中间必须使用字母或者“_”或者数字,不能使用空格
3.不要使用数字开头或者纯数字。
4.变量名区分大小写。
定义字符串:
$a = "woniu";
$b = 'hello';
$c = `ip a`;     //将字符串当系统命令;
echo "hello".$a;
echo "hello $a";
当字符串与变量拼接时,如果需要将变量直接放入字符串中,那么字符串必须使用双引号。长度获取:strlen(字符串);
定义数字:
$n = 123;      //整形
$m = 3.14;     //浮点型
布尔类型:
$bl = true;
$bool = false;echo $bl:  //如果值为true,页面显示1,否则页面没有任何回显。
数组类型:
索引数组:[元素1,元素2,...]$arr = [1,2,3,4,5];$arr = array('a','b','c');$arr = array();$arr[0] = 'hello';$arr[1] = 'woniu';$arr = [0=>'a',1=>'b'];$arr = array(0=>1,1=>2);print_r($arr);
关联数组:[键=>值,键=>值,...]$arr = ['a'=>1,'b'=>2,'c'=>3];$arr = array();$arr['a']=1;$arr['b']=2;$arr['c']=3;$arr = array('a'=>1,"b"=>2,"c"=>3);print_r($arr);数组操作:
1.添加元素:
$arr[索引] = 值;
$arr[键] = 值;
2.修改元素:
$arr[索引] = 值;
$arr[键] = 值;
3.删除元素:
unset($arr[索引]);  
unset($arr[键])
4.删除数组:
unset($arr);长度获取:count($arr);

三、控制结构

1、分支:

if-else:

if(条件1){语句;
}elseif(条件2){语句;
}else{语句;
}

switch-case:

switch(变量){case 1:语句;break;...default:语句;
}

2、循环:

for:

for(变量;判断;自增|自减){循环语句;
}

foreach

1.索引数组:
foreach(数组 as 元素){元素的操作;
}
2.关联数组:
foreach(数组 as  值){语句;
}
foreach(数组  as  键=>值){语句;
}
例如:
$a=array('zhangsan'=>13.4,'lisi'=>14,'wangwu'=>15);
foreach($a as $k=>$v){print_r($k);print_r('----');print_r($v);print_r('----');
}

练习:['mysql'=>91,'python'=>89,'php'=>95],求最高成绩的科目;

while

变量=值;
while(条件){语句;变量自增|自减;
}

do-while

变量=值;
do{语句;变量自增|自减;
}while(条件);

四、函数

1、内置函数(方法):

1.字符串:
strlen();    字符串长度获取
explode(“分隔符”,被拆分的字符串);     拆分字符串,返回数组; 
str_replace(需要替换的字符,替换后字符,原字符串);    替换字符串,区分大小写
str_ireplace(需要替换的字符,替换后字符,原字符串);     替换字符串,不区分大小写
strtolower()     将字符串转小写
strtoupper()     将字符串转大写2.数组:
count()      数组中元素个数
array_pop(数组)   从数组右边移除一个元素
array_shift(数组)    从数组左边移除一个元素
array_unshift(数组,值)  从左边添加一个元素
array_push(数组,值)    从右边添加一个元素
end(数组)      获取数组最后一个元素

2、自定义函数:

function 函数名($参数1,$参数2,...){函数体;return 数据;
}函数名(参数1,参数2,...);

五、超全局变量

用于接收前端发送请求中的数据,还可以收集与服务相关数据,

$_GET[变量名]      接收get请求中传递的参数
$_POST[变量名]      接收post请求传递的参数
$_REQUEST[变量名]    接收post或者get请求传递的参数
$_FILES[变量名]      接收文件上传的数据$_SESSION[]      从session中获取数据,或者向session文件中写入内容,需要先打开session,                          session_start();
$_COOKIE[]       从cookie中获取数据
$_SERVER[]       从服务器中获取数据$GLOBALS         包含php中所有的变量的一个数组

六、php连接数据库(非预处理)

1、创建一个连接对象:

mysql(老版本)
mysqli ; php5.6.40使用的内建库;$conn  = mysqli_connect(ip/hostname,user,pwd,db,port);

xx2、编码格式:

//如果查询结果出现乱码,需要设置一下编码格式
mysqli_set_charset($conn,"utf8");

3、执行sql

1.准备sql命令:
$sql="select * from user";
2.执行:
$re = mysqli_query($conn,$sql);

4、如果是查询:

$arr = mysqli_fetch_all($re);
$arr = mysqli_fetch_assoc($re);

5、添加修改删除操作

//1.添加
$sql="insert into user (name,passwd) values ('小明','111')";
if (mysqli_query($conn, $sql)) {echo "新记录插入成功";
} else {echo "Error: " . $sql . "<br>" . mysqli_error($conn);
}
//2.修改
$sql="update user set passwd='234' where id=1";
if (mysqli_query($conn, $sql)) {echo "修改成功";
} else {echo "Error: " . $sql . "<br>" . mysqli_error($conn);
}
//3.删除
$sql="delete from user where id=1";
if (mysqli_query($conn, $sql)) {echo "删除";
} else {echo "Error: " . $sql . "<br>" . mysqli_error($conn);
}

七、php连接数据库(预处理)

//添加数据
$conn = mysqli_connect('127.0.0.1','root','1234','bugdemo',3306);//连接数据库
mysqli_set_charset($conn,'utf8');//设置编码格式
$sql = "insert into user (name,passwd) values(?,?)";//定义sql语句
$stmt = mysqli_prepare($conn,$sql);//执行预处理mysqli_stmt_bind_param($stmt,"ss",$name,$passwd);//绑定参数$name = "王五";//定义参数并赋值
$passwd = "1234";//定义参数并赋值$cnt = mysqli_stmt_execute($stmt);//执行sql
//根据结果判断是否成功
if($cnt){echo 'success';
}else{print_r(mysqli_stmt_error($stmt));
}
mysqli_close($conn);//关闭数据库连接//查询数据
$conn = mysqli_connect('127.0.0.1','root','1234','bugdemo',3306);
mysqli_set_charset($conn,'utf8');
$sql = "select * from user where id in(?,?,?)";
$stmt = mysqli_prepare($conn,$sql);mysqli_stmt_bind_param($stmt,"iii",$id4,$id5,$id6);$id4=4;
$id5=5;
$id6=6;mysqli_stmt_execute($stmt);mysqli_stmt_bind_result($stmt,$col1,$col2,$col3);while(mysqli_stmt_fetch($stmt)){printf("%d %s %s\n",$col1,$col2,$col3);
}mysqli_close($conn);

八、面向对象操作数据库

//添加操作
$conn = new mysqli("localhost","root","1234","bugdemo",3306);
$conn->set_charset("utf8");$sql = "insert into user (name,passwd) values(?,?)";
$stmt = $conn->prepare($sql);
$name="赵六";
$passwd="321";
$stmt->bind_param("ss",$name,$passwd);
$stmt->execute();
$conn->close();//查询操作
$conn = new mysqli("localhost","root","1234","bugdemo",3306);//创建一个连接对象
$conn->set_charset("utf8");//设置编码格式
$sql = "select * from user where id in(?,?)";
$stmt = $conn->prepare($sql);//预处理语句
$id1=4;//定义参数
$id2=5;//定义参数
$stmt->bind_param("ii",$id1,$id2);//绑定查询参数
$stmt->execute();//执行查询
$stmt->bind_result($id,$name,$passwd);//查询结果的列,分别绑定一个参数
//执行查询,并且循环取每一行的值
while($stmt->fetch()){echo "id:".$id."-name:".$name."-password:".$passwd."<br>";
}
//关闭连接
$conn->close();

九、文件包含

include引入写在其他文件中的有用的代码。

//1.php的代码
<?php 
echo "1.php 111111";
echo "1.php  22222 ";
?>//info.php代码
<?php
include '1.php';echo "info..111..";
echo "info...222.";
echo "info...333.";
?>

DAY3 正则表达式/文件上传/文件读写

①正则表达式

一、概述

Regular Experssion , 可以通过正则字符串从指定的内容中,查找,替换字符。

二、方法

1、preg_match() 可以返回找到字符的个数,或者返回找到的字符(左边第一个);

$str = "hello";
$n = preg_match("/o/",$str);
echo $n;     //返回找到的字符,只能找一个

2、preg_match_all() : 返回找到的字符个数,或者返回找到的所有字符。

$str = "hello world";
$n = preg_match_all("/l/",$str);
echo $n;      //返回所有找到的字符的个数

3、preg_replace() : 用于替换指定类型的数据

$str = "hello world";
$pattern="/o/";
echo preg_replace($pattern," ",$str);
三、语法

1、字符类

字符模式周围的方括号称为字符类,例如[ABC]。 字符类始终匹配指定字符列表中的单个字符,这意味着表达式[abc]只匹配a、b或c字符。

表达式说明
[abc]匹配字符a,b或c中的任何一个。
[^abc]匹配a,b,c以外的任何一个字符。
[a-z]匹配从小写字母a到小写字母z的任意一个字符。
[A-Z]匹配从大写字母A到大写字母Z的任意一个字符。
[0-9]匹配0到9之间的一个数字。
[a-z0-9]匹配a与z之间 或 0与9之间的单个字符。

2、预定义字符类

一些字符类(例如数字,字母和空格)被频繁使用,以至于它们都有快捷方式名称。下表列出了那些预定义的字符类:

表达式说明
.匹配除换行符\n之外的任何单个字符。
\d匹配任何数字字符。 与[0-9]相同。
\D匹配任何非数字字符。
\s匹配任何空白字符(空格,制表符,换行符或回车符)。 与[\t\n\r]相同。
\S匹配任何非空格字符。
\w匹配任何单词字符(定义为a到z,A到Z,0到9和下划线)。 与[a-zA-Z_0-9]相同
\W匹配任何非单词字符。

3、重复量词

表达式说明
p+匹配一个或多个字母p。
p*匹配零个或多个出现的字母p。
p?匹配零个或一个出现的字母p。
p{2}正好匹配两个字母p。
p{2,3}匹配至少两个出现的字母p,但不超过三个出现的字母p。
p{2,}匹配两次或超过2次出现的字母p。
p{,3}最多匹配三个出现的字母p

4、开头结尾

表达式说明
^p与行首的字母p匹配。
p$与行尾的字母p匹配。

5、模式修饰符

表达式说明
i使匹配不区分大小写。
四、检测手机号
$str = "15390129909";$result = preg_match("/^1[3456789][0-9]{9}$/",$str);

②文件读写

一、函数

1、文件输入输出流:

(1)fopen(): 打开输入输出流

$f = fopen(文件名,mode)
mode:
r  :  读
w  :  写,如果文件不存在,则创建文件
a  :  追加写
x  :  写,如果文件存在,则返回false
r+ :  读写
w+ :  写读
a+ :  写读
b  :  打开二进制文件
t  : 打开文本文件

(2) fclose(): 关闭输入输出流

fclose($f);

(3)fgets() : 获取文件内容,按行取值。 一般放在循环中取值

while(!feof($f)){fgets($f)
}

(4)fread(): 按字节读取文件内容

echo fread($f,1024);

(5)fwrite() : 写入内容:

$f = fopen(文件名,"w");   //执行该代码,立即清空指定文件。如果文件不存在,则创建文件。
fwrite($f,内容);
fclose($f);

(6)fseek() 移动光标

$f = fopen("3.txt","a+");
fwrite($f,"hello woniu\r\n");
fseek($f,0);   //将光标移动到文件最开始位置。
echo fread($f,1024);
fclose($f);

(7)fgetc读取一个字符

$fr=fopen("1.txt","r");
$fw=fopen("2.txt","a+");
fseek($fr,3);//把光标移动到位置3
while(!feof($fr)){fwrite($fw,fgetc($fr));
}fclose($fr);
fclose($fw);

(8)file_get_contents(): 从指定文件中获取内容

echo  file_get_contents(文件名)

(9)file_put_contents(): 向指定文件写入内容

file_put_contents(文件名,内容);   //默认为w模式
file_put_contents(文件名,内容,FILE_APPEND);   //追加模式写入内容

③文件上传

一、文件上传实现

1、通过form表单提交上传数据

注意:

  • 上传时候,一定要能使用POST方法提交

  • 表单已经使用enctype="multipart/form-data"属性

<form action="../php/upload.php" method="post" enctype="multipart/form-data"><input type="file" name="photo"><input type="submit" value="确定">
</form>

2、php: 通过超全局变量接收文件

$name = $_FILES['photo']['name'];    //获取文件名字
$tmp = $_FILES['photo']['tmp_name'];     //获取临时保存文件
$type = $_FILES['photo']['type'];   //获取文件MIME类型
$size = $_FILES['photo']['size'];   //获取文件大小
二、保存上传文件

1、删除已存在的同名文件:

@unlink(文件名);
@: 不在页面显示报错信息,(如果文件不存在,unlink会报错)

2、判断文件是否存在:

file_exists(文件名);

3 、输入输出流方式保存文件:

$f = fopen("/tmp/abc",'r');
$content = fread($f,$size); 
fclose($f);$f = fopen("../images/$name",'w');
fwrite($f,$content);
fclose($f);

4、读写文件函数操作:

$content = file_get_contents($f);    //读文件
file_put_contents($f,$content);        //写文件

5、文件移动函数:

move_uploaded_file($f,"../images/$name");
三、修改保存文件的名称

1、获取扩展名:

$ext = end(explode($name));

2、生成新名称:

//设置时区date_default_timezone_set("PRC");
//或者全局修改时区:修改php.ini文件,将Module Settings的[Date]块的date.timezone前的;去掉,改成date.timezone = PRC。这样在程序里直接使用date函数就可以了。$newName = date("ymdhis").rand(100,999).".".$ext;

DAY4 AJAX不跳转提交

一、概述

ajax.是javascrip中用于提交数据的方式。与form表单不同的是,该方式提交数据不需要刷新页面。

二、使用

1、原生ajax:

XMLHttpReuqust:用于创建ajax请求的对象

xhr = new XMLHttpRequest();

open() : 设置请求方式以及url

xhr.open("get|post",url)

onreadystatechange :ajax请求状态变化

xhr.onreadystatechange=function(){接收响应代码
}

onreadyState : 响应状态

状态描述
0UNSENT代理被创建,但是尚未调用open方法
1OPENEDopen方法已经被调用
2HEADERS_RECEIVEDsend方法已经调用,并且头部和状态码已经可以获得
3LOADING响应中,responseText属性已经包含部分数据
4DONE响应完成
if(xhr.readyState==4)

status : 响应状态码

100:  建立一个长连接
200:  正确获取响应
300:  重定向
400:  请求端错误
500:  服务端错误
if(xhr.status<400)

send() : 发送请求,如果使用post.请求正文必须放在send()中。

xhr.send(data)

setRequestHeader() : 在open()之后,send()之前设置请求头。

xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
xhr.setRequestHeader("User-Agent","Mozilla/5.0 (Windows NT 10.0; WOW64; rv:46.0) Gecko/20100101 Firefox/46.0")
post请求:
xhr = new XMLHttpRequest();
xhr.onreadystatechange=function(){if(xhr.readyState==4 && xhr.status==200){alert('请求成功');cont = xhr.responseText;alert('服务器返回的内容是:'+cont);}
}xhr.open("post","http://192.168.32.129/secure21/php/login.php");
xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
xhr.send("username=zhangsan&password=123")
get请求:
xhr = new XMLHttpRequest();
xhr.open("get","http://192.168.32.129/secure21/php/checkuser.php?username="+user);xhr.onreadystatechange=function(){if(xhr.readyState==4 && xhr.status<400){resp = xhr.responseText;alert(resp)}
}
xhr.send();
2、jquery(重点)

(1)get请求:

$.get(url,function(data){alert(data);    //data就是响应正文})

(2)post请求

param={键:值,...
}
$.post(url,param,function(data){alert(data);
})

(3)选择器:

$(".类名")--------document.getElementsByClassName()
$("#id")-----document.getElementById()
$("标签名")---document.getElementsByTagName()

(4)获取或者写入内容:

val()    可以获取input标签的value值,也可以向value中写入
text()     可以向标签对中写入内容,也可以从标签对中获取内容。

(5) 另外一种方式发送ajax

$.ajax({type:"get|post",url:"http://xxx",data:{}success:function(data){alert(data)}
})

DAY5 OOP面向对象编程

一、概述

oop(object orientied programming ) 面向对象编程。

1、类

具有相同属性和行为的事物

属性:用于表述个体特征的标识

行为:事物所表现出的动作。在类中也叫方法。

2、对象

类的实例化个体。

二、类定义

class 类名{访问修饰符 ;  //属性访问修饰符 function 方法名(形参列表){     //方法方法体;}
}
访问修饰符:
属性:
public :  该成员能被外部代码访问和操作
proteted :只允许该类的子类进行访问
private :只允许同一个类内部进行访问  
方法:
public  : 该成员能被外部代码访问和操作
proteted: 只允许该类的子类进行访问  
private :只允许同一个类内部进行访问   
class Human{public $name="zhang";private $age=1;public function talk(){return "我是".$this->name."--我今年".$this->age."岁了";}private function run(){echo "跑步";}}$h = new Human;//使用new关键字创建一个Human类的对象
$re = $h->talk();//调用对象的talk方法
echo $re;//打印talk方法返回的结果$h->run();//这一行会报错,因为
run方法是用private修饰的

三、继承

一个类可以复用另外一个类的属性、方法

至少涉及两个类,父类和子类,使用关键字extends表示继承关系

class Dad{public $height=1.8;public $eyecolor="blue";private $weight=200;public function swim(){return "我会游泳";}protected function sing(){return "我会唱歌";}private function speakEnglish(){return "我会讲英文";}
}class Son extends Dad{//定义一个静态方法public static function run(){echo '静态方法run';}
}$s = new Son;
echo $s->height;
echo $s->eyecolor;
// echo $son->weight;//这行报错,因为weight是用private修饰的
echo $s->swim();
Son::run();//调用静态方法,只用类名就可以,不需要对象
// echo $son->sing();//这行报错,因为sing是用protected修饰的,只能在子类Son中使用,不能在外部用
// echo $son->speakEnglish();//这行报错,因为speakEnglish是用private修饰的

四、魔术方法

方法描述
__construct( )新对象被创建时候调用
__destruct()对象被销毁时候调用
__call()在对象中调用一个不可访问方法时,__call()会被调用。
__callStatic()在静态上下文中调用一个不可访问方法时,__callStatic() 会被调用。
__get()读取不可访问(protected 或 private)或不存在的属性的值时会被调用
__set()在给不可访问(protected 或 private)或不存在的属性赋值时会被调用
__isset()当对不可访问(protected 或 private)或不存在的属性调用 isset()或 empty() 时,__isset() 会被调用。
__unset()当对不可访问(protected 或 private)或不存在的属性调用 unset()时,__unset() 会被调用。
__sleep()执行序列化操作时候先执行这个方法
__wakeup()执行反序列化操作时候先执行这个方法
__toString()当一个类被当成字符串使用的时候会调用
__invoke()当尝试以调用函数的方式调用一个对象时这个方法会调用
__clone()当复制完成时,如果定义了__clone() 方法,则新创建的对象(复制生成的对象)中的 __clone() 方法会被调用,可用于修改属性的值(如果有必要的话)。
class Human{public $name="zhang";private $age=1;public function talk(){return "我是".$this->name."--我今年".$this->age."岁了";}//创建对象时候调用public function __construct(){echo "__contruct<br>";}//对象销毁时候调用public function __destruct(){echo "<br>__destruct";}//调用不存在的方法时候,会调用这个public function __call($name,$args){echo "你调用了不存在的方法:".$name."<br>";}//调用不存在的静态方法时候,会调用这个public static function __callstatic ($name,$args){echo "你调用了不存在的静态方法:".$name."<br>";}//读取不存在或者无法访问到的属性时候,会调用这个方法public function __get($name){echo "读取不存在或者无法访问到的属性:".$name."<br>";}//设置不存在或者无法访问到的属性时候,会调用这个方法public function __set($name,$value){echo "设置不存在或者无法访问到的属性:".$name."<br>";}//当对不可访问(protected 或 private)或不存在的属性调用 isset()或 empty() 时,__isset() 会被调用public function __isset($name){echo "当对不可访问(protected 或 private)或不存在的属性调用 isset()或 empty() 时,__isset() 会被调用:".$name."<br>";}//当对不可访问(protected 或 private)或不存在的属性调用 unset()时,__unset() 会被调用。public function __unset($name){echo "当对不可访问(protected 或 private)或不存在的属性调用 unset()时,__unset() 会被调用:".$name."<br>";}//当一个类被当成字符串使用的时候会调用public function __toString(){return  "对象要转成字符串__toString方法调用"."<br>";}//当一个类被当成字符串使用的时候会调用public function __invoke($value){echo  "当尝试以调用函数的方式调用一个对象时这个__invoke方法会调用"."<br>";}//当复制完成时,如果定义了\__clone() 方法,则新创建的对象(复制生成的对象)中的 __clone() 方法会被调用public function __clone(){$this->name="woniu";echo "新对象克隆完成:"."<br>";}}$hu = new Human;//对象初始化
$hu->abc();//调用不存在的方法
Human::staticMethod();//调用不存在的静态方法
echo $hu->xyz;//读取不存在或者无法访问到的属性
$hu->xxx="abc";设置不存在或者无法访问到的属性
isset($hu->xyz);//对不可访问(protected 或 private)或不存在的属性调用 isset()
unset($hu->xyz);//当对不可访问(protected 或 private)或不存在的属性调用 unset()时,__unset() 会被调用。
echo $hu; //当一个类被当成字符串使用的时候会调用
$hu(1);//当尝试以调用函数的方式调用一个对象时这个方法会调用
$newhu = clone $hu;//克隆新对象
echo $newhu->name;//打印新对象的name属性

五、序列化和反序列化

1、序列化

在页面使用面向对象方式时,传递数据中如果需要使用对象。则需要将对象转化为可以还原的字符串。通常使用序列化对象的方式,将对象转化为序列化字符串。

serialize(对象) ==> 生成了序列化字符串

//定义Human类,并且序列化class Human{public $name="zhang";private $age=1;protected $score=100;//创建对象时候调用public function __construct(){echo "__contruct<br>";}//对象销毁时候调用public function __destruct(){echo "<br>__destruct";}//对象序列化时候调用public function __sleep(){return array('name', 'age', 'score');}//对象反序列化时候调用public function __wakeup() {echo "<br>__wakeup";}
}
$hu = new Human;
echo serialize($hu);//这个是不使用编码输出的序列化结果
echo "<hr>";
echo urlencode(serialize($hu));//这个是使用编码输出的序列化结果以上要注意序列化时候自动 调用了魔术方法__sleep()注意:如果遇到属性有proteted或者private,需要将字符串转码,防止出现无法复制的字符
urlencode(serialize(对象)) ==> url编码的序列化字符串:结果:
O%3A5%3A%22Human%22%3A3%3A%7Bs%3A4%3A%22name%22%3Bs%3A5%3A%22zhang%22%3Bs%3A10%3A%22%00Human%00age%22%3Bi%3A1%3Bs%3A8%3A%22%00%2A%00score%22%3Bi%3A100%3B%7D

2、反序列化

在php页面上,通过unserialize() 接收传入的序列化字符串,还原对象。

$obj = unserialize($_GET['str']);url; xxx.php?str=O%3A5%3A%22Human%22%3A3%3A%7Bs%3A4%3A%22name%22%3Bs%3A5%3A%22zhang%22%3Bs%3A10%3A%22%00Human%00age%22%3Bi%3A1%3Bs%3A8%3A%22%00%2A%00score%22%3Bi%3A100%3B%7Dclass Human{public $name="zhang";private $age=1;protected $score=100;//创建对象时候调用public function __construct(){echo "__contruct<br>";}//对象销毁时候调用public function __destruct(){echo "<br>__destruct";}//对象序列化时候调用public function __sleep(){return array('name', 'age', 'score');}//对象反序列化时候调用public function __wakeup() {echo "<br>__wakeup";}
}$obj = unserialize($_GET['str']);//获取到浏览器传的序列化的结果,并执行反序列化echo "<br>".$obj->name;//从反序列化的对象中获取变量name的值

序列化字符串中,只包含类名,属性名:属性值。 没有方法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_996362.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

打家劫舍(java版)

&#x1f4d1;前言 本文主要是【动态规划】——打家劫舍(java版)的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是听风与他&#x1f947; ☁️博客首页&#xff1a;CSDN主页听风与他 &#x1f304;每日一…

chrome插件chrome.storage数据写入失败QUOTA_BYTES_PER_ITEM quota exceeded

Unchecked runtime.lastError while running storage.set: QUOTA_BYTES_PER_ITEM quota exceeded at Object.callback 在开发浏览器插件的时候&#xff0c;报错提示&#xff1a;超出存储限制&#xff0c;浏览器插件存储官方文档&#xff1a;https://developer.chrome.com/docs…

springcloud和基础服务的搭建以及封装

代码仓库地址&#xff1a;https://github.com/zhaoyiwen-wuxian/springcloud-common page分页也进行了封装&#xff0c;只需要添加到pom中&#xff0c;将会自动进行分页&#xff0c;并且后端不需要写任何的分页数据。只需要前端自己传分页参数即可&#xff0c;并且里面封装了很…

基于单片机的轴承售卖系统设计

目 录 摘 要 I Abstract II 引 言 3 1总体方案设计及选择 5 1.1设计方案与选择 5 1.2总体方案设计 5 1.2.1系统总体设计 5 2 硬件电路的设计 8 2.1电源电路 8 2.2 控制核心STC89C52单片机 8 2.3 时钟电路 8 2.4 复位电路 8 2.5 按键模块 9 2.6 NFR24L01无线传输模块 10 2.7 LC…

three.js如何实现简易3D机房?(三)显示信息弹框/标签

接上一篇&#xff1a; three.js如何实现简易3D机房&#xff1f;(二&#xff09;模型加载的过渡动画&#xff1a;http://t.csdnimg.cn/onbWY 目录 七、创建信息展示弹框 1.整体思路 &#xff08;1&#xff09;需求&#xff1a; &#xff08;2&#xff09;思路&#xff1a;…

新书速览|PyTorch语音识别实战(人工智能技术丛书)

实战语音唤醒、音频特征抽取、语音情绪分类、Whisper语音转换、鸟叫多标签分类、多模态语音文字转换 01 本书内容 《PyTorch语音识别实战》使用PyTorch 2.0作为语音识别的基本框架&#xff0c;循序渐进地引导读者从搭建环境开始&#xff0c;逐步深入到语音识别基本理论、算法以…

论文学习—Model-based Adversarial Meta-Reinforcement Learning

Model-based Adversarial Meta-Reinforcement Learning Abstract1. Introduction2. Related work3 Preliminaries基于模型的强化学习&#xff08;MBRL&#xff09;:区别和联系&#xff1a; 4 Model-based Adversarial Meta-Reinforcement Learning4.1 Formulation 4.2 Computin…

【C语言】还有柔性数组?

前言 也许你从来没有听说过柔性数组&#xff08;flexible array&#xff09;这个概念&#xff0c;但是它确实是存在的。C99中&#xff0c;结构中的最后⼀个元素允许是未知⼤⼩的数组&#xff0c;这就叫做『柔性数组』成员。 欢迎关注个人主页&#xff1a;逸狼 创造不易&#xf…

vue+Nodejs+Koa搭建前后端系统(九)-- 上传图片

web2.0的到来使网页世界正式进入了寒武纪&#xff0c;各式各样的多媒体资源屡见不鲜&#xff0c;上传资源变得刻不容缓&#xff01; 前言 本文是在该系列的基础上&#xff0c;针对前后端代码的修改。 准备 HTTP上传图片时Content-Type值常见的有2种&#xff1a;application…

Python之Web开发初学者教程—ubuntu下vi的使用

Python之Web开发初学者教程—ubuntu下vi的使用 vi\vim 文本编辑器 i 切换到输入模式&#xff0c;以输入字符。 x 删除当前光标所在处的字符。 : 切换到底线命令模式&#xff0c;以在最底一行输入命令。 vi 保存并退出&#xff1a;esc键退出编辑-…

NotePad++下载

notepad官网地址是https://notepad-plus-plus.org/。提供了许多强大的功能和工具&#xff0c;使其成为许多程序员和开发人员的首选工具。 Notepad 是一款广受欢迎的开源文本编辑器&#xff0c;它提供了许多强大的功能和工具&#xff0c;使其成为许多程序员和开发人员的首选工具…

AntV L7初体验

本案例使用L7库和Mapbox GL JS创建的简单地图可视化示例&#xff0c;加载点数据。 文章目录 1. 引入 CDN 链接2. 导出模块3. 创建地图3.1. 注册 token3.2. 创建地图实例 4. 创建场景5.创建点图层6. 演示效果7. 代码实现 1. 引入 CDN 链接 <!-- 1.引入CDN链接 --> <!--…

Go 简单设计和实现可扩展、高性能的泛型本地缓存

相信大家对于缓存这个词都不陌生&#xff0c;但凡追求高性能的业务场景&#xff0c;一般都会使用缓存&#xff0c;它可以提高数据的检索速度&#xff0c;减少数据库的压力。缓存大体分为两类&#xff1a;本地缓存和分布式缓存&#xff08;如 Redis&#xff09;。本地缓存适用于…

2.2 评估方法 机器学习

我们若有一个包含m个样例的数据集&#xff0c;若我们既需要训练&#xff0c;也需要测试&#xff0c;我们该如何处理呢&#xff1f;下面是几种方法&#xff1a; 2.2.1 留出法 “留出法”直接将数据集D划分为两个互斥的集合&#xff0c;其中一个作为训练集S&#xff0c;另一个作…

面试问答之Spring进阶

文章目录 &#x1f412;个人主页&#xff1a;信计2102罗铠威&#x1f3c5;JavaEE系列专栏&#x1f4d6;前言&#xff1a;&#x1f380;说说你对Spring的认识与理解&#x1f415;Bean的分类&#x1f415; BeanFactory 接口和ApplicationContex 接口 的区别&#x1f415;SpringBe…

时间序列-AR MA ARIMA

一、AR模型(自回归) AR探索趋势和周期性 预测依赖于过去的观测值和模型中的参数。模型的阶数 p pp 决定了需要考虑多少个过去时间点的观测值。 求AR模型的阶数 p和参数 ϕ i \phi_i ϕi​ &#xff0c;常常会使用统计方法如最小二乘法、信息准则&#xff08;如AIC、BIC&#xf…

暗黑大气MT苹果CMS MT主题源码-PC版适用于苹果CMS V10

苹果CMS MT主题是一款多功能的主题&#xff0c;适用于苹果CMS V10的暗黑大气风格。 地 址 &#xff1a; runruncode.com/houtai/19704.html 初次使用说明&#xff1a; 在后台设置中&#xff0c;选择MT主题&#xff0c;并在模板目录中填写HTML。 后台地址为&#xff1a;MT主题…

day14_用户前台项目环境搭建(首页接口开发,分类接口开发,网关服务搭建,Redis缓存,Spring Cache)

文章目录 1 尚品甄选H5介绍1.1 业务功能介绍1.2 系统架构1.3 前端H5开发说明 2 搭建项目环境2.1 项目结构说明2.2 模块依赖说明2.3 环境说明2.4 项目模块创建2.4.1 spzx-parent2.4.2 spzx-service2.4.43 service-product 2.5 导入接口文档 3 首页接口开发3.1 需求分析3.3 接口开…

java上传本地文件到服务器共享

在Windows系统中,将本地文件夹中的某个文件上传到另一台Windows服务器电脑上,前提:两台电脑网络互通,要接收文件的Windows服务器文件夹开启了共享,可以被本机用如下方式进行写入和读取: 如何配置服务器共享请自行百度查找。 所需要的maven依赖如下: <dependency>…

解决vue项目本地开发完成后部署到服务器后报404的问题

一、如何部署 前后端分离开发模式下&#xff0c;前后端是独立布署的&#xff0c;前端只需要将最后的构建物上传至目标服务器的web容器指定的静态目录下即可 我们知道vue项目在构建后&#xff0c;是生成一系列的静态文件 常规布署我们只需要将这个目录上传至目标服务器即可 /…