网站开发开题报告范文2019,如何做网站推广营销,win2008 iis建网站,广州白云区最新信息本周重点
①HTML/JavaScript/CSS
②PHP
③正则表达式/文件上传/文件读写
④AJAX不跳转提交
⑤ OOP面向对象编程
本周主要内容
DAY1 HTML/JavaScript/CSS
①HTML
一、基本结构
HTML
head
//头部内容
title网页标题/title
/headHTML
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/h1h2/h2h3/h3h4/h4h5/h5h6/h6标题
7、ulli/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 输入框
--typetext 文本输入
--typepassword 密码输入
--typesubmit 提交按钮
--typeradio 单选按钮每次只能选一个
--typecheckbox 复选按钮可以同时选多个
--typefile 文件上传
18、selectoption/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
1Number
可以识别整形和浮点型
2String:
通过引号定义的类型。
3Undefined:
输出一个未定义的变量类型
4null:
通过定义的方式直接赋值null.
5数组
将一组数据保存在一个变量中。
arr [值,值2,...]
arr new Array(值1,值2)
arr new Array();
arr[索引]值
3、类型转化
1Number-String隐式类型转换
stringnumber
数字.toString()
2String-Number显示类型转换
parseInt(字符串);
parseFloat(字符串)
4、运算符
1算术运算符 - * / % ** 位移运算
2比较运算符 只要数值相同就可以 全相等类型和数据都要一样 ! !
3自增自减 --
4成员运算符
in,instanceof
三、控制结构
1、 分支结构
1if -- else
if(条件){语句;
}else if(条件){语句;
}else{语句;
}
2switch -- case
switch(变量){case 数字整形:语句break;...default:语句;
}
2 、循环结构
1for
for(i0;i10;i){语句
}
2while
while(条件){语句;
}
3do-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的函数
1setTimeout(); 当设定时间结束时触发操作
setTimeout(function(){操作;
},时间)
时间以毫秒为单位
2setInterval() ; 在设定时间重复操作
setInterval(function(){操作;
},时间)
时间以毫秒为单位
③CSS层叠样式表
一、概述
html页面如果需要对元素进行大小、颜色、形状设定需要使用css.
csscascading 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 typetext nameusername idinput2
2.通过选择器设置属性
#input2{font-size: 20px;color: red;text-align: right;
}
2、class选择器 class属性多个元素可以相同同一个元素可以有多个class值
1.先创建class属性
input typetext nameusername idinput1 classc1 stylewidth:300px;height: 50px;background-color: blanchedalmond; border: 1px solid red;
input typetext nameusername idinput2 classc1 c2
2.类选择器.c1{font-weight: 800;}.c2{font-family: 仿宋;}
3、标签选择器 直接通过标签名进行设置
1.选择需要设置属性的标签
span1/spanbr
span2/spanbr
span3/spanbr
span4/spanbr
span5/spanbr
2.标签选择器设置
span{font-size: 46px;
}
四、css引入方式
1、外部样式: 在页面所在项目中通过link标签中的href属性引入写在css目录的.css扩展名的文件。
1.先创建一个css文件
内容 选择器{属性:值;}
2.在html页面中
link href../css/xxx.css relstylesheet
2、内部样式: 通过在head标签中使用style标签引入的方式,可以影响整个页面
style选择器{属性:值;...}选择器2{属性:值;...}
/style
3、内联样式行内样式在页面元素得标签中通过style属性引入的样式
input typetext nameusername stylewidth: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 [0a,1b];$arr array(01,12);print_r($arr);
关联数组[键值,键值,...]$arr [a1,b2,c3];$arr array();$arr[a]1;$arr[b]2;$arr[c]3;$arr array(a1,b2,c3);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 键值){语句;
}
例如
$aarray(zhangsan13.4,lisi14,wangwu15);
foreach($a as $k$v){print_r($k);print_r(----);print_r($v);print_r(----);
}练习[mysql91,python89,php95],求最高成绩的科目 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命令
$sqlselect * from user;
2.执行
$re mysqli_query($conn,$sql);
4、如果是查询
$arr mysqli_fetch_all($re);
$arr mysqli_fetch_assoc($re);
5、添加修改删除操作
//1.添加
$sqlinsert into user (name,passwd) values (小明,111);
if (mysqli_query($conn, $sql)) {echo 新记录插入成功;
} else {echo Error: . $sql . br . mysqli_error($conn);
}
//2.修改
$sqlupdate user set passwd234 where id1;
if (mysqli_query($conn, $sql)) {echo 修改成功;
} else {echo Error: . $sql . br . mysqli_error($conn);
}
//3.删除
$sqldelete from user where id1;
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);$id44;
$id55;
$id66;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赵六;
$passwd321;
$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);//预处理语句
$id14;//定义参数
$id25;//定义参数
$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]匹配字符ab或c中的任何一个。[^abc]匹配abc以外的任何一个字符。[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到zA到Z0到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、文件输入输出流
1fopen() 打开输入输出流
$f fopen(文件名,mode)
mode:
r : 读
w : 写,如果文件不存在则创建文件
a : 追加写
x : 写如果文件存在则返回false
r : 读写
w : 写读
a : 写读
b : 打开二进制文件
t : 打开文本文件
2 fclose(): 关闭输入输出流
fclose($f);
3fgets() : 获取文件内容按行取值。 一般放在循环中取值
while(!feof($f)){fgets($f)
}
4fread(): 按字节读取文件内容
echo fread($f,1024);
5fwrite() : 写入内容
$f fopen(文件名,w); //执行该代码立即清空指定文件。如果文件不存在则创建文件。
fwrite($f,内容);
fclose($f);
6fseek() 移动光标
$f fopen(3.txt,a);
fwrite($f,hello woniu\r\n);
fseek($f,0); //将光标移动到文件最开始位置。
echo fread($f,1024);
fclose($f);
7fgetc读取一个字符
$frfopen(1.txt,r);
$fwfopen(2.txt,a);
fseek($fr,3);//把光标移动到位置3
while(!feof($fr)){fwrite($fw,fgetc($fr));
}fclose($fr);
fclose($fw); 8file_get_contents() 从指定文件中获取内容
echo file_get_contents(文件名)
9file_put_contents(): 向指定文件写入内容
file_put_contents(文件名,内容); //默认为w模式
file_put_contents(文件名,内容,FILE_APPEND); //追加模式写入内容
③文件上传
一、文件上传实现
1、通过form表单提交上传数据
注意 上传时候一定要能使用POST方法提交 表单已经使用enctypemultipart/form-data属性
form action../php/upload.php methodpost enctypemultipart/form-datainput typefile namephotoinput typesubmit 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.onreadystatechangefunction(){接收响应代码
}
onreadyState 响应状态
值状态描述0UNSENT代理被创建但是尚未调用open方法1OPENEDopen方法已经被调用2HEADERS_RECEIVEDsend方法已经调用并且头部和状态码已经可以获得3LOADING响应中responseText属性已经包含部分数据4DONE响应完成
if(xhr.readyState4)
status : 响应状态码
100 建立一个长连接
200 正确获取响应
300 重定向
400 请求端错误
500 服务端错误
if(xhr.status400)
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.onreadystatechangefunction(){if(xhr.readyState4 xhr.status200){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(usernamezhangsanpassword123)
get请求
xhr new XMLHttpRequest();
xhr.open(get,http://192.168.32.129/secure21/php/checkuser.php?usernameuser);xhr.onreadystatechangefunction(){if(xhr.readyState4 xhr.status400){resp xhr.responseText;alert(resp)}
}
xhr.send();
2、jquery(重点)
1get请求
$.get(url,function(data){alert(data); //data就是响应正文})
2post请求
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 $namezhang;private $age1;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 $height1.8;public $eyecolorblue;private $weight200;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 $namezhang;private $age1;public function talk(){return 我是.$this-name.--我今年.$this-age.岁了;}//创建对象时候调用public function __construct(){echo __contructbr;}//对象销毁时候调用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-namewoniu;echo 新对象克隆完成:.br;}}$hu new Human;//对象初始化
$hu-abc();//调用不存在的方法
Human::staticMethod();//调用不存在的静态方法
echo $hu-xyz;//读取不存在或者无法访问到的属性
$hu-xxxabc;设置不存在或者无法访问到的属性
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 $namezhang;private $age1;protected $score100;//创建对象时候调用public function __construct(){echo __contructbr;}//对象销毁时候调用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?strO%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 $namezhang;private $age1;protected $score100;//创建对象时候调用public function __construct(){echo __contructbr;}//对象销毁时候调用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的值
序列化字符串中只包含类名属性名属性值。 没有方法。