本周重点
①HTML/JavaScript/CSS
②PHP
③正则表达式/文件上传/文件读写
④AJAX不跳转提交
⑤ OOP面向对象编程
本周主要内容
DAY1 HTML/JavaScript/CSS
①HTML
一、基本结构
//头部内容网页标题 网页内容的主体
二、主要标签
1、文字单独一个段落 2、
换行 3、 字体加粗 4、字体加粗 5、 6、标题 7、
展示列表
8、斜体
9、文字加下划线
10、视频标签
11、
表格
12、
表格的一行
13、
一个单元格
14、引入图片
15、网页超链接
16、
块级元素,自己会占一行
17、表单
18、输入框
–type=text 文本输入
–type=password 密码输入
–type=submit 提交按钮
–type=radio 单选按钮,每次只能选一个
–type=checkbox 复选按钮,可以同时选多个
–type=file 文件上传
18、 单选下拉列表
②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(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属性: 2.通过选择器设置属性: #input2{ font-size: 20px; color: red; text-align: right; }2、class选择器: class属性,多个元素可以相同,同一个元素可以有多个class值
1.先创建class属性 2.类选择器: .c1{ font-weight: 800; } .c2{ font-family: 仿宋; }3、标签选择器: 直接通过标签名进行设置
1.选择需要设置属性的标签 1
2
3
4
5
2.标签选择器设置: span{ font-size: 46px; }四、css引入方式:
1、外部样式: 在页面所在项目中,通过link标签中的href属性引入写在css目录的.css扩展名的文件。
1.先创建一个css文件: 内容 选择器{属性:值;} 2.在html页面中,2、内部样式: 通过在head标签中使用style标签引入的方式,可以影响整个页面
选择器{ 属性:值; ... } 选择器2{ 属性:值; ... }3、内联样式(行内样式):在页面元素得标签中,通过style属性引入的样式
优先级:就近原则
DAY2 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 . "
" . mysqli_error($conn); } //2.修改 $sql="update user set passwd='234' where id=1"; if (mysqli_query($conn, $sql)) { echo "修改成功"; } else { echo "Error: " . $sql . "
" . mysqli_error($conn); } //3.删除 $sql="delete from user where id=1"; if (mysqli_query($conn, $sql)) { echo "删除"; } else { echo "Error: " . $sql . "
" . 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 %sn",$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."
"; } //关闭连接 $conn->close();九、文件包含
include引入写在其他文件中的有用的代码。
//1.php的代码 //info.php代码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 | 匹配任何空白字符(空格,制表符,换行符或回车符)。 与[tnr]相同。 |
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 woniurn"); 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”属性
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 : 响应状态
值 | 状态 | 描述 |
---|---|---|
0 | UNSENT | 代理被创建,但是尚未调用open方法 |
1 | OPENED | open方法已经被调用 |
2 | HEADERS_RECEIVED | send方法已经调用,并且头部和状态码已经可以获得 |
3 | LOADING | 响应中,responseText属性已经包含部分数据 |
4 | DONE | 响应完成 |
if(xhr.readyState==4)
status : 响应状态码
100: 建立一个长连接 200: 正确获取响应 300: 重定向 400: 请求端错误 500: 服务端错误
if(xhr.statussend() : 发送请求,如果使用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.status2、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
"; } //对象销毁时候调用 public function __destruct(){ echo "
__destruct"; } //调用不存在的方法时候,会调用这个 public function __call($name,$args){ echo "你调用了不存在的方法:".$name."
"; } //调用不存在的静态方法时候,会调用这个 public static function __callstatic ($name,$args){ echo "你调用了不存在的静态方法:".$name."
"; } //读取不存在或者无法访问到的属性时候,会调用这个方法 public function __get($name){ echo "读取不存在或者无法访问到的属性:".$name."
"; } //设置不存在或者无法访问到的属性时候,会调用这个方法 public function __set($name,$value){ echo "设置不存在或者无法访问到的属性:".$name."
"; } //当对不可访问(protected 或 private)或不存在的属性调用 isset()或 empty() 时,__isset() 会被调用 public function __isset($name){ echo "当对不可访问(protected 或 private)或不存在的属性调用 isset()或 empty() 时,__isset() 会被调用:".$name."
"; } //当对不可访问(protected 或 private)或不存在的属性调用 unset()时,__unset() 会被调用。 public function __unset($name){ echo "当对不可访问(protected 或 private)或不存在的属性调用 unset()时,__unset() 会被调用:".$name."
"; } //当一个类被当成字符串使用的时候会调用 public function __toString() { return "对象要转成字符串__toString方法调用"."
"; } //当一个类被当成字符串使用的时候会调用 public function __invoke($value){ echo "当尝试以调用函数的方式调用一个对象时这个__invoke方法会调用"."
"; } //当复制完成时,如果定义了__clone() 方法,则新创建的对象(复制生成的对象)中的 __clone() 方法会被调用 public function __clone(){ $this->name="woniu"; echo "新对象克隆完成:"."
"; } } $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
"; } //对象销毁时候调用 public function __destruct(){ echo "
__destruct"; } //对象序列化时候调用 public function __sleep(){ return array('name', 'age', 'score'); } //对象反序列化时候调用 public function __wakeup() { echo "
__wakeup"; } } $hu = new Human; echo serialize($hu);//这个是不使用编码输出的序列化结果 echo "
"; 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%7D class Human{ public $name="zhang"; private $age=1; protected $score=100; //创建对象时候调用 public function __construct(){ echo "__contruct
"; } //对象销毁时候调用 public function __destruct(){ echo "
__destruct"; } //对象序列化时候调用 public function __sleep(){ return array('name', 'age', 'score'); } //对象反序列化时候调用 public function __wakeup() { echo "
__wakeup"; } } $obj = unserialize($_GET['str']);//获取到浏览器传的序列化的结果,并执行反序列化 echo "
".$obj->name;//从反序列化的对象中获取变量name的值
序列化字符串中,只包含类名,属性名:属性值。 没有方法。
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
相关推荐: [经验] 天猫盒子怎么投屏手机照片 #经验分享#其他#经验分享
天猫盒子怎么投屏手机照片 1、天猫盒子怎么投屏 天猫盒子怎么投屏 天猫盒子作为一个融合了电视直播、网络影视、游戏娱乐等多种功能的智能电视机顶盒,受到了广大用户的关注和喜爱。其中最具实用性的功能之一是投屏,也就是将手机、平板、电脑等设备上的内容通过天猫盒子投影到…