本周重點
①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 : 響應狀態
值 | 狀態 | 描述 |
---|---|---|
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.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的值
序列化字符串中,只包含類名,屬性名:屬性值。 沒有方法。