3.1網安學習第三階段第一周回顧(個人學習記錄使用)

本周重點

①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.pswp.cn/news/715375.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/715375.shtml
英文地址,請注明出處:http://en.pswp.cn/news/715375.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

內網滲透-DC-9靶機滲透

攻擊機&#xff1a;kali 192.168.236.137 目標機&#xff1a;dc-9 192.168.236.138 一、信息收集 1.使用arp-scan -l和nmap進行主機發現和端口信息收集 nmap -sS -T5 --min-rate 10000 192.168.236.138 -sC -p- 發現22端口被阻塞 2.whatweb收集一下cms指紋信息 what http…

Vue開發實例(七)Axios的安裝與使用

說明&#xff1a; 如果只是在前端&#xff0c;axios常常需要結合mockjs使用&#xff0c;如果是前后端分離&#xff0c;就需要調用對應的接口&#xff0c;獲取參數&#xff0c;傳遞參數&#xff1b;由于此文章只涉及前端&#xff0c;所以我們需要結合mockjs使用&#xff1b;由于…

《熱辣滾燙》:用堅持不懈開啟逆境中的職場出路

"你只活一次&#xff0c;所以被嘲笑也沒有關系&#xff0c;想哭也沒有關系&#xff0c;失敗更沒有關系。" “人生就像一場拳擊賽&#xff0c;你站不起來&#xff0c;就永遠不知道自己有多強” “命運只負責洗牌&#xff0c;出牌的永遠是自己。” 在今年的賀歲檔電影市…

云時代【6】—— 鏡像 與 容器

云時代【6】—— 鏡像 與 容器 四、Docker&#xff08;三&#xff09;鏡像 與 容器1. 鏡像&#xff08;1&#xff09;定義&#xff08;2&#xff09;相關指令&#xff08;3&#xff09;實戰演習鏡像容器基本操作離線遷移鏡像鏡像的壓縮與共享 2. 容器&#xff08;1&#xff09;…

為什么模電這么難學?這是我見過最好的回答

大家好&#xff0c;我是磚一&#xff0c;有很多人抱怨模電難學&#xff0c;被譽為電子信息掛科率最高之一&#xff0c;下面聽我分析一下為啥模電這么難學&#xff1f; 01 理科的抽象思維 在高等教育體系中&#xff0c;模電是涉及半導體方向的第一門工程類課程&#xff0c;是一…

2024年3月5-7日年生物發酵裝備展-環科環保科技

參展企業介紹 山東環科環保科技有限公司,是一家集環保設備的設計、制造、安裝、服務及環境治理工程總承包于一體的企業。 公司長期專注于大氣、水、危固廢三大領域&#xff0c;以科技創造碧水藍天&#xff0c;為客戶提供環保解決方案。 以穩定的產品及服務質量、適用的技術、…

【環境搭建】linux centos7安裝mosquitto消息代理軟件操作步驟以及遇到問題日常記錄

最近需要用到mqtt&#xff0c; 選擇安裝mosquitto。由于安裝mosquitto花了我一點時間&#xff0c;簡單記錄下。安裝環境是linux centos7&#xff0c; 其他像windows、mac或者ubuntu 參考下 https://mosquitto.org/download/ 英文官網&#xff0c;或者別人寫的文章。 服務器…

微型世界:嵌入式科技的無限可能

微型世界&#xff1a;嵌入式科技的無限可能 1. 嵌入式科技的定義與特點 定義&#xff1a;嵌入式科技是一種特殊的計算機系統&#xff0c;通常用于特定的應用領域&#xff0c;如智能手機、智能家居設備等。特點&#xff1a;小巧、低功耗、高效率、實時性強、可靠性高、成本較低…

洛谷題單_搜索

P1219 [USACO1.5] 八皇后 Checker Challenge - 洛谷 | 計算機科學教育新生態 (luogu.com.cn) #include <bits/stdc.h> using namespace std; const int N14; int n,ans0; int a[N][N]{},vis[N][N]{}; vector<int>rcd(n1); void dfs(int dep){if(depn1){if(ans<…

有道QAnything背后的故事---關于RAG的一點經驗分享

近日&#xff0c;我們開源了有道自研的RAG&#xff08;Retrieval Augmented Generation) 引擎QAnything。該引擎允許用戶上傳PDF、圖片、Word、Excel、PowerPoint等多種格式的文檔&#xff0c;并實現類似于ChatGPT的互動問答功能&#xff0c;其中每個答案都能精確追溯到相應的文…

了解Spring中Bean:配置與作用域

作為一名對技術充滿熱情的學習者&#xff0c;我一直以來都深刻地體會到知識的廣度和深度。在這個不斷演變的數字時代&#xff0c;我遠非專家&#xff0c;而是一位不斷追求進步的旅行者。通過這篇博客&#xff0c;我想分享我在某個領域的學習經驗&#xff0c;與大家共同探討、共…

遞歸回溯剪枝-括號生成

LCR 085. 括號生成 - 力扣&#xff08;LeetCode&#xff09; 一. 根據題意&#xff0c;分析出符合要求的括號組合需要滿足以下兩個條件&#xff1a; 1. 左括號數或者右括號數都不能超過 n&#xff1b; 2. 從最左側開始的每一個子集&#xff0c;不可以出現右括號數大于左括號數&…

CF 1934B

冗長的代碼&#xff08;枚舉解法&#xff09; #include<bits/stdc.h>using namespace std;void solve() {int n;cin>>n;if(n1||n3||n6||n10||n15){cout<<1<<endl;return;}int cnt0;if(n>100){int tempn/15;if(temp>6){n-(temp-6)*15;cnttemp-6;…

算法復習之前綴和【備戰藍橋杯】

一維前綴和 S[i] a[1] a[2] ... a[i] a[l] ... a[r] S[r] - S[l - 1]二維前綴和 S[i, j] 第i行j列格子左上部分所有元素的和 以(x1, y1)為左上角&#xff0c;(x2, y2)為右下角的子矩陣的和為&#xff1a; S[x2, y2] - S[x1 - 1, y2] - S[x2, y1 - 1] S[x1 - 1, y1 - …

中國電子學會(CEIT)2020年06月真題C語言軟件編程等級考試四級(含詳細解析答案)

中國電子學會&#xff08;CEIT&#xff09;考評中心歷屆真題&#xff08;含詳細解析答案&#xff09; C語言軟件編程等級考試四級 2020年06月 編程題四道 總分:100分一、最長上升子序列&#xff08;25分&#xff09; 一個數的序列bi&#xff0c;當b1 < b2< … &l…

長期可用的文件二維碼怎么做?在線制作可修改的文件活碼

怎么做一個可以長期使用的文件二維碼呢&#xff1f;現在通過二維碼來傳遞文件是很流行的一種方式&#xff0c;將文件生成二維碼后印刷上墻或者分享給他人都可以快速完成文件的傳播&#xff0c;所以在下發通知、資料等方面用途較多。那么文件二維碼該如何生成呢&#xff1f; 想…

Linux內存地址空間

目錄 一、虛擬地址空間 1.虛擬地址空間的定義 2.虛擬地址空間的布局 二、內存壁壘 1.內存壁壘的定義?編輯 2.段錯誤 三、內存映射的建立與解除 &#xff08;1&#xff09;mmap &#xff08;2&#xff09;munmap &#xff08;3&#xff09;堆內存的分配和釋放 1.sbrk …

Android13 設置固定熱點ip地址192.168.43.1

Android13 設置固定熱點ip地址192.168.43.1 文章目錄 Android13 設置固定熱點ip地址192.168.43.1一、前言二、設置固定ip地址實現1、Android13 代碼中的實現&#xff1a;添加屬性寫法&#xff1a; 2、Android11 或者更舊的代碼中的實現&#xff1a; 三、其他1、Android 代碼獲連…

Python中學習調試requests模塊時出現的大坑(1)

為防止迷路: 學習機械相關,請關注公眾號:南大盛聯 學習軟件,硬件,請關注公眾號號:一訓微課 cmd模式下 不知道上面這行的話,需要補課。 pip install requests 這個不知道的話,也要補課 pip是python的安裝工具。 install是安裝的意思 requests是我們需要安裝的模…

HTML超鏈接去下劃線

當在HTML中創建超鏈接時&#xff0c;默認情況下會顯示為帶有下劃線的藍色文本。如果想要去掉下劃線&#xff0c;可以使用CSS樣式來實現。 示例代碼&#xff1a; <!DOCTYPE html> <html> <head> <style> a {text-decoration: none;color: blue; /* 設…