PHP 开发基础知识笔记
PHP 基本語法
普通變量: 普通變量的定義語法,以及通過各種方式判斷字符串是否為空.
<?php$var = ""; // 定義字符串define("CON_INT",100); // 定義常量if(empty($var))echo "字符串為空 <br>";if(isset($var))echo "字符串為空 <br>";if(!is_null($var))echo "字符串為空 <br>";if(is_string($var))echo "字符串變量 <br>";if(defined("CON_INT"))echo "屬于常量 <br>";echo "當前系統是: " . PHP_OS . "<br>";echo "當前PHP版本: " . PHP_VERSION . "<br>";echo "當前的行號是: " . __LINE__ . "<br>";echo "當前的PHP文件名: " . __FILE__ . "<br>" ?>PHP中運算符:
<?php$x = 10%3;$year = 2018;var_dump($x);try{if(($year%4==0 && $year%100!=0)||($year%400==0))echo "%year 是閏年 <br>";elseecho "%year 是平年 <br>";$error = "產生異常.";// throw new Exception($error);}catch(Exception $e){echo "異常類型: " . $e->getMessage() . "<br>";} ?>where 循環與判斷:
<html><body><table align="center" border="1" width=600><caption><h2>where 循環</h2></caption><?php$out=0;while ($out < 5){if($out%2===0)$bgcolor = "#fffffff";else$bgcolor = "#ddddddd";echo "<tr bgcolor=" . $bgcolor . ">";$in = 0;while($in < 10){echo "<td>" . ($out*10+$in). "</td>";$in++;}echo "</tr>";$out++;}?></body> </html>for循環:
<html><body><?phpfor($x=1; $x<=9; $x++){for($y=1; $y<=$x; $y++){echo "$y * $x = ". $y*$x . " ";}echo "<br>";}?><?phpfor($x=9; $x>=1; $x--){for($y=$x; $y>=1; $y--){echo "$y * $x = ". $y*$x . " ";}echo "<br>";}?></body> </html>函數參數傳遞:
<?phpfunction CreateTable($table_name,$rows,$cols){echo "<table align='center' border='1' width=600>";echo "<caption><h2> $table_name </h2></caption>";for($out=0; $out<$rows; $out++){echo "<tr>";for($in=0; $in<$cols; $in++){echo "<td>" . ($out*$cols+$in) . "</td>";}echo "</tr>";}}CreateTable("財務部",5,5);CreateTable("銷售部",3,3); ?>可變長參數傳遞:
<?php// 普通固定參數傳遞function Person($name="lyshark",$age=24){echo "姓名: {$name},年齡: {$age} <br>";}Person("admin",33);// 可變長參數傳遞function more_args(){$args = func_get_args();for($x=0; $x<count($args); $x++){echo "第 {$x} 個參數是 -> {$args[$x]} <br>";}}more_args("admin","guest","lyshark");// 可變長變量函數function func_one($x,$y){return $x+$y;}function func_two($x,$y){return $x*$y;}$point = "func_one";echo "call func_one: " . $point(2,3) . "<br>";$point = "func_two";echo "call func_one: " . $point(2,3) . "<br>"; ?>設置Cookie登錄: 基于Cookie設置實現的用戶登錄模塊,清空與設置Cookie選項.
<?phpfunction ClearCookie(){setCookie('username','',time()-3600);setCookie('isLogin','',time()-3600);}// 檢測是否登陸路,如果登錄則提示你好if($_COOKIE['isLogin']){echo "您好: " . $_COOKIE['username'] . "<br>";echo "<a href='index.php?action=logout'>退出</a>";}// 判斷用戶是否執行登錄if($_GET['action']=='login'){ClearCookie();if($_POST['username']=='admin' && $_POST['password']='123123'){setCookie('username',$_POST['username'],time()+60*60*24*7);setCookie('isLogin','1',time()+60*60*24*7);header("Location:index.php");}else{echo "密碼錯誤";}}else if($_GET['action']=="logout"){ClearCookie();header("Location:index.php");} ?><form action="index.php?action=login" method="post">用戶: <input type="text" name="username" size=25><br>密碼: <input type="password" name="password" size=25><input type="submit" value="登錄"> </form>PHP 數組操作
數組的賦值: PHP中的數組既可以做數組,也可以做鍵值對字典,且不存在限制,非常靈活.
<?php// 定義純數組格式$array_one[0] = 100;$array_one[1] = 200;$array_one[2] = "lyshark";$array_one[3] = [1,2,3,4,5,6];echo $array_one[0] . $array_one[2] . "<br>";echo "數組中的數組: " . $array_one[3][1] . "<br>";// 定義字典格式的數組$array_two['ID'] = 1001;$array_two['name'] = "lyshark";$array_two['age'] = 25;echo "姓名: " . $array_two['name'] . "<br>"; ?>數組的定義與遍歷: 分別定義一維數組與二維數組,并通過兩種方式分別遍歷數組元素.
<?php// 定義一維數組$var = array("first"=>1,"second"=>2,"third"=>3,"montd"=>4);foreach ($var as $key => $value){echo "鍵 => {$key} --> 值 => {$value} <br>";}// 定義二維數組$var_two = array("書籍" => array("文學","歷史","地理"),"水果" => array(1=>"蘋果",2=>"橙子",3=>"水蜜桃"));foreach($var_two as $key => $value){echo "鍵=" . $key . " ";foreach($var_two[$key] as $index => $value){echo " 索引: " . $index . " --> 值: " . $value;}echo "<br>";}// 二維數組其他遍歷方法$array_two = array(array('北京','上海','深圳','廣州'),array('黑龍江','吉林','遼寧','江蘇'));for($x=0; $x< count($array_two); $x++){for($y=0; $y<count($array_two[$x]); $y++){echo "輸出數組: " . $array_two[$x][$y] . "<br>";}} ?>數組元素統計: 統計出數組中指定元素的個數,或者統計每個元素出現的次數.
<?php// 一維數組統計$lamp = array("Linux","Apache","MySQL","PHP");echo "lamp 元素個數: " . count($lamp) . "<br>";// 二維數組統計$web = array('lamp' => array("Linux","Apache","MySQL","PHP"),'j2ee' => array("Unix","Tomcat","Oracle"));echo "二維中一維個數: " . count($web) . "<br>";echo "整個數組的大小: " . count($web,1) . "<br>";// 統計元素出現次數,返回數組$array = array("php","asp","jsp","php","python","node.js");$new_array = array_count_values($array);foreach($new_array as $key => $value){echo "數組元素 => {$key} ---> 出現頻率 => {$value} <br>";} ?>二維數組遍歷回顯: 通過傳統的循環結構遍歷特定數組中的元素,并用表格展示出來.
<?php$data = array(array(1,'admin','北京',"admin@blib.cn"),array(2,'guest','天津',"guest@blib.cn"),array(3,'lyshark','洛杉磯',"lyshark@blib.cn"));echo "<table border='1' width='600' align='center'>";echo "<caption><h1>輸出列表</h1></caption>";echo "<tr bgcolor='#ddddddd'>";echo "<th>編號</th><th>姓名</th><th>住址</th><th>郵箱</th>";echo "</tr>";for($row=0; $row < count($data); $row++){echo "<tr>";for($clo=0; $clo<count($data[$row]); $clo++){echo "<td>" . $data[$row][$clo] . "</td>";}echo "</tr>";}echo "</table>"; ?>三維數組遍歷回顯: 由于FOR語句遍歷數組的局限性,所以PHP中提供了更加強大的ForEach結構.
<?php$data = array("市場部" => array(array(1,"張某","經理",5000),array(2,"劉某","員工",3000)),"銷售部" => array(array(1,"李某","職員",2000),array(2,"孫某","經理",6000)),"財務部" => array(array(1,"吳某","經理",8000)));foreach($data as $sector => $table){echo "<table border='1' width='600' align='center'>";echo "<caption><h1>" . $sector . "</h1></caption>";echo "<tr bgcolor='#ddddddd'>";echo "<th>編號</th><th>姓名</th><th>職務</th><th>薪資</th>";echo "</tr>";foreach($table as $row){echo "<tr>";foreach($row as $col){echo "<td>" . $col . "</td>";}echo "</tr>";}echo "</table><br>";} ?>指針操作數組: 數組內部指針式數組內部的組織機制,指向一個數組中的某個元素.
<?php$info = array('admin','guest','lyshark');// 將數組中所有的的元素轉換為變量list($x,$y,$z) = $info;echo "變量: " . $x . $y . $z . "<br>";// 將數組中指定元素轉換為變量list(,,$z)= $info;echo "變量: " . $z . "<br>";// 數組指針操作reset($info);echo "元素索引: " . key($info) . "元素值: " . current($info) . "<br>";next($info);echo "元素索引: " . key($info) . "元素值: " . current($info) . "<br>";prev($info);echo "元素索引: " . key($info) . "元素值: " . current($info) . "<br>";end($info);echo "元素索引: " . key($info) . "元素值: " . current($info) . "<br>";// 通過指針循環遍歷for(reset($info); current($info);next($info)){echo "數據: " . current($info) . "<br>";} ?>數組鍵值對操作: 數組中的每個元素都是由鍵值對組成的,通過元素的鍵訪問對應的值.
<?php$info = array("ID" => 1001,"Name" => "admin","Age" => 24 );$var1 = array("a"=>"python","b"=>"php","c"=>"C/C++","d"=>"java");$var2 = array("1"=>"a","2"=>"b","3"=>"c","4"=>"d");// 獲取所有的鍵值print_r(array_keys($info));print_r(array_values($info));// 獲取特定的鍵print_r(array_keys($info,"admin"));// 值作為新數組的鍵$new = array_combine($var1, $var2);print_r($new); echo"<br>";// extrace()將數組轉換成標量變量extract($var1);echo $a."<br>";echo $b."<br>"; ?>判斷鍵值是否存在: 檢查特定數組中是否存在某個值,即在數組中搜索給定的值.
<?php// 函數的簡單用法$info = array("Mac","Windows NT","AIX","Linux");if(in_array("Mac",$info))echo "存在 <br>";// 嚴格模式,必須類型一致,否則失敗$info = array('10.24',12,45,1,2);if(in_array(10.24,$info,true))echo "存在 <br>";// 查詢數組中的數組$info = array(array(1,2),array(3,4));if(in_array(array(3,4),$info))echo "存在 <br>";// search 同樣可以實現檢索$info = array("ID" => 1001,"Name" => "admin","Age" => 24 );if(array_search("admin",$info))echo "存在 <br>";// 檢查下標元素是否在數組中if(array_key_exists('ID',$info))echo "存在 <br>";// 使用isset同理if(isset($info['ID']))echo "存在 <br>"; ?>數組交換/統計/去重: 實現數組的交換,統計,與去重等操作.
<?php$info = array("OS" => "Linux","WebServer" => "Nginx", "DataBase" => "MySQL");// 交換數組中的鍵值$new_info = array_flip($info);print_r($info); echo "<br>";print_r($new_info); echo "<br>";// 數組元素反轉$new_info = array_reverse($info);print_r($info); echo "<br>";print_r($new_info); echo "<br>";// 統計元素個數$var_count = count($info);echo "元素個數: " . $var_count . "<br>";// 統計數組中所有元素出現次數$array = array(1,2,3,3,2,4,5,6,6,7,7,7,6,8,7,4,3);$array_count = array_count_values($array);print_r($array_count); echo "<br>";// 數組元素去重操作$array = array("1" => "PHP","2" => "MySQL","3" => "PHP");print_r(array_unique($array)); ?>數組回調與過濾: PHP提供了回調函數,可以實現對數組中元素的過濾功能,例如將每個元素遞增10等.
<?php// array_filter 定義第一個回調函數function EvenNumber($var){if($var %2 ==0) return true;}$info = array(1,2,3,4,5,6,7,8,9,10);print_r(array_filter($info,"EvenNumber"));echo "<br>";// array_walk 第二種回調函數的過濾寫法function PrintFunction($value,$key){$value = $value + 10;echo "KEY= " . $key . " VALUE= " . $value . "<br>";}$info = array("UID" => 1001,"GID" => 0, "age"=> 25);array_walk($info,"PrintFunction");// array_map 第三種回調函數過濾寫法(可替換指定數組元素)function ReplaceMap($var1){if($var1 === "MySQL")return "Oracle";return $var1;}$info = array("Linux","Windows","Apache","MySQL","PHP");print_r(array_map("ReplaceMap",$info));echo "<br>";// array_map 傳遞多個參數實現回調 (可用于對比多個數組的異同點)function Contrast($var1,$var2){if($var1 == $var2)return "True";return "False";}$Array_A = array("Linux","PHP","MySQL");$Array_B = array("Linux","MySQL","MySQL");print_r(array_map("Contrast",$Array_A,$Array_B)); ?>基本的數組排序: 在PHP中提供了多種排序函數,相比于C來說更加的簡單實用.
<?php// 對數組進行正反向排序$info = array(5,6,8,2,7,8,9,0,2,1,3,4,5);if(sort($info))echo "sort 正向排序:"; print_r($info);echo "<br>";if(rsort($info))echo "sort 反向排序:"; print_r($info);echo "<br>";// 根據key=>鍵名稱來實現數組排序$info = array(5 => "five",8 => "eight",1 => "one");if(ksort($info))echo "ksort 正向排序:"; print_r($info);echo "<br>";if(krsort($info))echo "ksort 反向排序:"; print_r($info);echo "<br>";// 根據value=>值來實現數組排序$info = array(5 => "five",8 => "eight",1 => "one");if(asort($info))echo "asort 正向排序:"; print_r($info);echo "<br>";if(arsort($info))echo "asort 反向排序:"; print_r($info);echo "<br>";// 根據自然排序法對數組排序$info = array("file1","file11","File2","FILE12","file");if(natsort($info))echo "natsort 大寫排在前面:"; print_r($info);echo "<br>";if(natcasesort($info))echo "natcasesort 忽略大小寫自然排序:"; print_r($info);echo "<br>"; ?>自定義/多維數組排序: 除了使用上面提供的排序方法以外,我們還可以自定義排序規則.
<?php// 回調函數實現自定義排序$info = array("Linux","Apache","MySQL","PHP");function SortByLen($var1,$var2){// 如果兩個字符串長度一致則保留if(strlen($var1) === strlen($var2))return 0;elsereturn (strlen($var1)>strlen($var2)?1:-1);}if(usort($info,"SortByLen"))echo "自定義排序:"; print_r($info);echo "<br>";// 多維數組的排序方法$info = array(array("id" => 1,"soft" => "Linux","rating" => 8),array("id" => 2,"soft" => "Apache","rating" => 1),array("id" => 3,"soft" => "Nginx","rating" => 5));foreach($info as $key => $value){// 將$info中每個元素中鍵為soft的值形成新數組$soft$soft[$key] = $value["soft"];$rating[$key] = $value['rating'];}array_multisort($rating,$soft,$info); // 開始排序echo "多維數組排序: "; print_r($info); echo "<br>"; ?>拆分/合并/分解數組: 數組常用的處理函數,包括對數組進行拆分,合并,結合,等常用操作.
<?php// array_slice(數組,開始下標,取出個數) 在數組中根據條件取值并返回.$info = array("Linux","PHP","Apache","MySQL","Nginx","Zabbix");print_r(array_slice($info,1,2));echo "<br>";// array_splice(數組,開始下標,替換次數,替換為) 替換指定數組中的指定元素$info = array("Linux","PHP","Apache","MySQL","Nginx","Zabbix");array_splice($info,1,1,"AAAA");echo "將下標1的位置替換為AAAA "; print_r($info); echo "<br>";array_splice($info,2);echo "從第2個元素向后的都刪除掉 "; print_r($info); echo "<br>";// array_combine() 將兩個數組合并為新數組 (兩個數組必須相等)// 其中第一個數組為KEY 第二個數組為Value$key = array("1","2","3");$value = array("Apache","Nginx","Cpp");$new_array = array_combine($key,$value);echo "合并后: "; print_r($new_array); echo "<br>";// array_merge() 將兩個數組合并為新數組 (合并時自動去重)$varA = array("a" => "Linux","b" => "MySQL");$varB = array("c" => "Python","a" => "PHP");echo "合并后: "; print_r(array_merge($varA,$varB)); echo "<br>";// array_ntersect()/array_diff() 計算兩個數組的交集/差集$varA = array(1,2,3,4,5);$varB = array(3,4,5,6,7);echo "交集: "; print_r(array_intersect($varA,$varB));echo "<br>";echo "差集: "; print_r(array_diff($varA,$varB));echo "<br>"; ?>數組模擬實現棧/隊列: 數組同樣可以實現棧與隊列的基本操作,如下所示.
<?php// 實現數組棧$stack = [];array_push($stack,1);array_push($stack,2);array_pop($stack);echo "簡易版: "; print_r($stack);echo "<br>";// key-value類型的棧$kv_stack = array(1 =>"Linux");array_push($kv_stack,2,"Apache");echo "key-value版棧: "; print_r($kv_stack);echo "<br>";// 實現隊列$kv_loop = array(1 =>"Linux");array_unshift($kv_loop, 2, "Apache");array_shift($kv_loop);echo "key-value 版隊列: "; print_r($kv_loop);echo "<br>"; ?>數組的打亂/互轉: 實現對數組的打亂,或將數組與字符串實現互相轉換.
<?php// $var = array(1,2,3,4,5,6,7,8,9,10);$var = range(0,10);echo "當前數組: "; print_r($var); echo "<br>";echo "隨機取出一個元素: " . array_rand($var,1) . "<br>";echo "隨機打亂數組: " . shuffle($var) . "<br>";echo "數組求和: " . array_sum($var) . "<br>";array_unshift($var, "perl"); # 在數組頭部添加元素print_r($var);echo "<br>";array_push($var, "golang"); # 在數組尾部添加元素print_r($var);echo "<br>";array_shift($var); # 刪除數組第一個元素print_r($var);echo "<br>";array_pop($var); # 刪除數組最后一個元素print_r($var);echo "<br>";// 將數組轉為字符串/數組到字符串,互轉.$var = array("python","php","C","java");$var = implode(",", $var); # 數組轉換為字符串echo "字符串: "; print_r($var); echo "<br>";$var = explode(",", $var); # 字符串轉數組echo "數組: "; print_r($var); echo "<br>"; ?>PHP 字符操作
字符串輸出: 在PHP中,字符串的輸出可以使用多種函數來實現,最基本的輸出方式如下.
<?php// printf 普通的輸出函數$string = "hello lyshark";$number = 1024;printf("%s page number = > %u <br>",$string,$number);// echo 的使用方法$name = "lyshark";$age = 25;echo "姓名: {$name} 年齡: {$age} <br>";// sprintf 將內容輸出到緩沖區中$text = sprintf("float = > %0.2f",$number);echo "打印輸出內容: " . $text . "<br>";// 第三種輸出方式print_r("姓名: " . $name . "年齡:" . $age . "<br>");var_dump($name); ?>字符串處理函數: 針對字符串的大小寫轉換,去重左右去空格,左右補齊,等基本操作.
<?php$string = "@@ hello lyshark @@";// 字符串左右去除printf("字符串長度: %d <br>",strlen($string));printf("字符串截取: %s <br>",substr($string,2,4));printf("去除左側空字符: %s <br>",ltrim($string));printf("去除左側@字符: %s <br>",ltrim($string,'@'));printf("去除右側@字符: %s <br>",rtrim($string,'@'));printf("去除兩邊@字符: %s <br>",trim($string,'@'));// 字符串自動補齊echo "右邊補齊: " . str_pad($string,50,"-") . "<br>";echo "左邊補齊: " . str_pad($string,50,"-",STR_PAD_LEFT) . "<br>";echo "兩邊補齊: " . str_pad($string,50,"-",STR_PAD_BOTH) . "<br>";// 字符串大小寫轉換echo "全部小寫: " . strtolower($string) . "<br>";echo "全部大寫: " . strtoupper($string) . "<br>";echo "首字母大寫: " . ucwords($string) . "<br>";// 反轉字符串與MD5echo "反轉字符串: " . strrev($string) . "<br>";echo "MD5 加密: " . md5($string) . "<br>"; ?>字符串比較(字節序): 字節序比較可以使用strcmp/strcasecmp兩個函數,只需傳入兩個字符串即可.
<?php$username="lyshark"; $password="Abc123^";// 不區分大小寫比較字符串if(strcasecmp(strtolower($username),"lyshark") == 0)printf("用戶名正確.. <br>");// 區分大小寫驗證密碼switch(strcmp($password,"Abc123^")){case 0:echo "兩個字符串相等.";break;case 1:echo "第一個大于第二個.";break;case -1:echo "第一個小于第二個.";break;}// 字符串實現冒泡排序$info= array("file11.txt","file22.txt","file1.txt","file2.exe");function MySort($array){for($x=0; $x<count($array); $x++)for($y=0;$y<count($array)-1; $y++)if(strnatcmp($array[$y],$array[$y+1])){$tmp = $array[$y];$array[$y] = $array[$y+1];$array[$y+1] = $tmp;}return $array;}print_r(MySort($info)); ?>字符串替換/切割: 將字符串切割為多個部分,替換字符串,與連接字符串等操作.
<?php// 實現截取文件后綴function getFileName($url){$location = strrpos($url,"/")+1; // 獲取URL中最后一個/出現的位置$fileName = substr($url,$location); // 截取從location位置到結尾的字符return $fileName;}echo getFileName("http://www.baidu.com/index.php") . "<br>";echo getFileName("file://c://windows/php.ini") . "<br>";// 實現字符串替換$string = "BASH Linux PHP MySQL Ruby Metasploit linux";echo "將Linux替換為Win: " . str_replace("Linux","Windows",$string,$count) . "<br>";echo "將Linux替換為Win: " . str_ireplace("Linux","Windows",$string,$count) . "<br>";$search = array("http","www","jsp","com"); // 搜索字符串$replace = array("https","bbs","php","net"); // 替換字符串$url = "http://www.baidu.com/index.jsp";echo "數組替換: " . str_replace($search,$replace,$url) . "<br>";// 實現字符串切割與鏈接$info = "Linux Apache MySQL PHP Web";$str_cat = explode(" ",$info);echo "切割后: " . $str_cat[1] . $str_cat[2] . "<br>";$info = "root:*:0:0::/home/dhat:/bin/bash";list($user,$pass,$uid,$gid,,$home,$shell) = explode(":",$info);echo "切割后: 用戶-> " . $user . " 終端Bash -> " . $shell . "<br>";$info = array("linux","Apache","MySQL","PHP");echo "鏈接字符串: " . implode("+",$info) . "<br>";echo "鏈接字符串: " . join("+",$info) . "<br>"; ?>正則匹配字符串: 通過使用正則我們同樣可以對字符串進行匹配,切片,組合,查找等操作.
<?php/*郵箱: '/^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/'正整數: '/^\d+$/'qq號碼:'/^\d{5,11}$/'手機號碼: '/^1(3|4|5|7|8)\d{9}$/'*/// 簡單的正則匹配方法$pattern = "/\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/";$subject = 'aaa 1181506874@qq.com test admin@blib.cn ddd';$recv = preg_match_all($pattern, $subject,$match,PREG_SET_ORDER);echo "匹配記錄: " . $recv . "條, 值: " . $match[0][0] . "," . $match[1][0] . "<br>";// 匹配數組中符合條件的字符串$array = array("LinuxHat","Nginx 2.2.3","Apache 2.29","PHP");$pattern_version = preg_grep("/^[a-zA-Z ]+(\d|\.)+$/",$array);print_r($pattern_version); echo "<br>";// 正則實現字符串替換$pattern = "/[!@#$]/";$text = "你@好!,當前日#期 01/25/2020 總#共365天";echo "替換特殊符號為空: " . preg_replace($pattern,"",$text) . "<br>";$pattern = "/(\d{2})\/(\d{2})\/(\d{4})/";echo "替換實現時間翻轉: " . preg_replace($pattern,"\${3}-\${1}-\${2}",$text) . "<br>";// 正則實現字符串切割$keyworks = preg_split("/[\s,]/","php,nginx, mysql python");echo "切割字符串為數組: "; print_r($keyworks); echo "<br>";$keyworks = preg_split("//","lyshark",-1,PREG_SPLIT_NO_EMPTY);echo "將字符串切割為字符: "; print_r($keyworks); echo "<br>"; ?>PHP 文件操作
讀文件基本信息: 文件基本信息包括文件類型,文件的創建日期等基本信息,我們可以通過以下方式來判斷.
<?php$Path = "C://Windows/System32/drivers/etc/hosts";echo "文件類型: " . filetype($Path) . "<br>";echo "文件建立時間: " . date("Y年m月j日",filectime($Path))."<br>";echo "文件最后更改時間: " . date("Y年m月j日",filemtime($Path))."<br>";echo "文件最后打開時間: " . date("Y年m月j日",fileatime($Path))."<br>";if(file_exists($Path))printf("文件存在 <br>");if(is_file($Path))printf("是一個文件 <br>");if(is_dir($Path))printf("是一個目錄 <br>");if(is_readable($Path))printf("文件可讀 <br>");if(is_writable($Path))printf("文件可寫 <br>");if(is_executable($Path))printf("文件可執行 <br>"); ?>判斷文件類型: 雖然我們可以通過filetype()函數判斷文件類型,但是不夠具體,如下是具體的判斷流程.
<?php$Path = "C://Windows/System32/drivers/etc/hosts";function GetFileType($FileName){switch(filetype($FileName)){case "file": $type = "普通文件"; break;case "dir": $type = "目錄文件"; break;case "block": $type = "塊設備文件"; break;case "fifo": $type = "命名管道文件"; break;case "link": $type = "符號文件"; break;case "unknown": $type = "未知文件"; break;default: $type = "沒有檢測到"; break;}return $type;}$type = GetFileType($Path);printf("文件類型: %s <br>",$type); ?>獲取文件大小: 文件大小的獲取可以使用filesize但此方法需要封裝后才可獲取到常規單位,代碼如下所示.
<?php$Path = "C://Windows/System32/drivers/etc/hosts";function GetFileSize($bytes){if($bytes >= pow(2,40)){$return = round($bytes/pow(1024,4),2);$suffix = "TB";}else if($bytes >= pow(2,30)){$return = round($bytes/pow(1024,3),2);$suffix = "GB";}else if($bytes >= pow(2,20)){$return = round($bytes/pow(1024,2),2);$suffix = "MB";}else if($bytes >= pow(2,10)){$return = round($bytes/pow(1024,1),2);$suffix = "KB";}else{$return = $bytes;$suffix = "Byte";}return $return . " " . $suffix;}$ret = GetFileSize(filesize($Path));echo "文件實際大小: " . $ret . "<br>"; ?>文件中的路徑解析: 根據不同的分隔符,對文件路徑進行解析,解析結果可以直接使用key-value的方式輸出.
<?php// 返回文件基本信息數組$Path = "C://Windows/System32/drivers/etc/hosts";$FilePro = stat($Path);echo "文件基本信息: "; print_r(array_slice($FilePro,13)); echo "<br>";// 返回路徑中的 page.php 文件名$Path = "/var/www/html/page.php";echo "帶文件擴展名輸出: " . basename($Path) . "<br>";echo "不帶文件擴展名輸出: " . basename($Path,".php") . "<br>";// 返回路徑的所在位置echo "文件所在位置: " . dirname($Path) . "<br>";// 返回目錄中文件詳細信息$path_parts = pathinfo($Path);echo "路徑: " . $path_parts["dirname"] . "<br>";echo "文件: " . $path_parts["basename"] . "<br>";echo "擴展名: " . $path_parts["extension"] . "<br>"; ?>文件讀寫操作: 讀寫文件首先需要使用fopen函數打開文件,然后使用fread讀取,fwrite寫入,最后使用fclose釋放句柄.
<?php// 從文件中讀出前100個字節$handle = fopen("c://test.log","r") or die("Open File Err");$context = fread($handle,100);echo $context;fclose($handle);// 循環從文件中讀取全部數據$handle = fopen("c://test.log","r") or die("Open File Err");$context = "";while(!feof($handle)){$context = fread($handle,1024);}fclose($handle);echo $context;// 另一種讀取全文的方式$handle = fopen("c://test.log","r") or die("Open File Err");$context = fread($handle,filesize("c://test.log"));fclose($handle);echo $context;// 每次讀入一個字符,直到讀取結束$handle = fopen("c://test.log","r") or die("Open File Err");while(false !==($char = fgetc($handle))){echo $char . "<br>";}// 讀取遠程文件,并輸出$file = fopen("http://www.baidu.com","r");while(!feof($file)){$line = fgets($file,1024);echo $line;}fclose($file);// 文件寫入數據$handle = fopen("c://new.txt","w") or die("open file error");for($row=0; $row<10; $row++){fwrite($handle,$row . "www.baidu.com \n");}fclose($handle); ?>遍歷文件目錄: 遍歷目錄中文件,主要用到opendir打開為文件,readdir每次讀入一條記錄,最后closedir關閉句柄.
<?php$Path = "d://";$dir_handle = opendir($Path);echo "<table border='1' width='600' cellspacing='0' cellpadding='0' align='center'>";echo "<caption><h2>目錄: " . $Path . "</h1></caption>";echo "<tr align='left' bgcolor='#ddddddd'>";echo "<th>文件名</th><th>文件大小</th><th>文件類型</th><th>修改時間</th></tr>";while($each = readdir($dir_handle)){$dir_file_path = $Path . "/" . $each; // 將目錄與文件連接起來if($num++ % 2 == 0) // 控制奇數行與偶數行不同的顏色輸出$bgcolor='#ffccf';else$bgcolor='#ccfff';echo "<tr bgcolor=" . $bgcolor . ">";echo "<td>" . $dir_file_path . "</td>";echo "<td>" . filesize($dir_file_path) . "</td>";echo "<td>" . filetype($dir_file_path) . "</td>";echo "<td>" . date("Y/n/t",filemtime($dir_file_path)) . "</td>";echo "</tr>";}echo "</table>";closedir($dir_handle);echo "目錄: " . $Path . "總共有: " . $num . " 個文件" . "<br>"; ?>統計目錄總容量: 計算文件磁盤目錄的總大小,具體思路是遞歸遍歷將每次遍歷到的文件大小存入變量遞增.
<?phpecho "磁盤剩余大小: " . disk_free_space("c://") . "<br>";echo "磁盤總計大小: " . disk_total_space("c://") . "<br>";function GetDirSize($directory){$dir_size = 0;// 首先打開目錄,并判斷目錄是否打開成功if($dir_handle = @opendir($directory)){// 循環每次讀入一個目錄下的所有文件while($filename = readdir($dir_handle)){// 判斷目錄文件,排除. .. 兩個無效路徑if($filename != "." && $filename != ".."){$file_path = $directory . "/" . $filename;// 如果是目錄,則需要繼續遞歸調用自身函數if(is_dir($file_path))$dir_size += GetDirSize($file_path);// 如果是文件則統計大小if(is_file($file_path))$dir_size += filesize($file_path);}}}closedir($dir_handle);return $dir_size;}$dir_size = GetDirSize("D://htmlcss/");echo "目錄大小: " . round($dir_size/pow(1024,2),2). "MB" . "<br>";echo "目錄大小: " . round($dir_size/pow(1024,1),2). "KB" . "<br>"; ?>目錄遞歸拷貝: 如果需要拷貝單個文件可以直接使用copy函數,如果要拷貝目錄則需要遞歸拷貝.
<?phpfunction CopyFileDir($dir_src,$dir_dst){if(is_file($dir_dst)){printf("目標不是目錄,無法執行.");return;}if(!file_exists($dir_dst))mkdir($dir_dst);// 首先打開目錄,并判斷目錄是否打開成功if($dir_handle = @opendir($dir_src)){// 循環每次讀入一個目錄下的所有文件while($filename = readdir($dir_handle)){// 判斷目錄文件,排除. .. 兩個無效路徑if($filename != "." && $filename != ".."){$sub_file_src = $dir_src . "/" . $filename;$sub_file_dst = $dir_dst . "/" . $filename;if(is_dir($sub_file_src))CopyFileDir($sub_file_src,$sub_file_dst);if(is_file($sub_file_src))copy($sub_file_src,$sub_file_dst);}}closedir($dir_handle);}return $dir_size;}// 將d://test目錄,拷貝到c://testCopyFileDir("d://test","c://test"); ?>目錄遞歸刪除: 遞歸刪除需要先調用unlink函數將目錄中每個文件都刪掉,然后贊調用rmdir刪除空目錄.
<?phpfunction DelFileDir($directory){// 判斷目錄是否存在if(file_exists($directory)){if($dir_handle = @opendir($directory)){while($filename = readdir($dir_handle)){if($filename!='.' && $filename != ".."){$sub_file = $directory . "/" . $filename;if(is_dir($sub_file))DelFileDir($sub_file);if(is_file($sub_file))unlink($sub_file);}}closedir($dir_handle);rmdir($directory);}}}// 刪除c://test整個目錄DelFileDir("c://test"); ?>PHP 面向對象
定義基本的類: 在類中我們可以定義各種數據成員和成員函數,其中public修飾的函數與變量可以在任何地方被調用,而private修飾的函數只能在本類中被調用子類不可調用,而protected修飾的則可以在本類和子類中被調用但不可以在外部調用.
<?phpclass SportObj{public $username = "lyshark"; // 公有屬性private $password = "12345"; // 私有屬性protected $type = "root"; // 受保護的function init($name,$height,$age,$sex){echo "當前的類名是: " . get_class($this) . "<br>";if($height >= 180 and $age >= 18)return "用戶: " . $name . " 符合 <br>";elsereturn "用戶: " . $name . " 不符合 <br>";}function GetVariable(){echo "用戶名: {$this->username} 密碼: {$this->password} 類型: {$this->type} <br>";}}// 實例化 $person = new SportObj();echo "訪問公有屬性: {$person->username} <br>"; echo $person->init("lyshark","180","20","男"); echo $person->GetVariable(); ?>構造函數/析構函數: 在PHP中聲明構造函數使用__construct,而聲明析構函數則使用__destruct,構造函數主要完成對類的初始化工作,析構函數則主要負責對類的清理工作.
<?phpclass Books{public $obj_name;public $obj_type;// 定義構造函數public function __construct($name,$type){$this->obj_name = $name;$this->obj_type = $type;echo "默認自動執行構造方法" . "<br>";}// 定義析構函數public function __destruct(){echo "函數執行完成之后清理工作" . "<br>";}public function boolObj(){if ($this->obj_type >= "10" and $this->obj_name == "lyshark")return $this->obj_name;elsereturn "-1";}}$obj = new Books("lyshark","100"); echo $obj->boolObj() . "<br>"; ?>面向對象繼承: 子類繼承父類的所有成員變量和方法包括構造方法,當子類被創建時PHP會先在子類中查找構造方法,如果子類有自己的構造方法,那么PHP會率先調用子類的方法,當子類沒有時,PHP則會調用父類的構造方法,這就是PHP中的繼承.
<?php# 創建父類,或者說基類class BaseObj{public $name;public $age;public $sex;public function __construct($name,$age,$sex){$this->name = $name;$this->age = $age;$this->sex = $sex;}public function showMe(){echo "這句話不會顯示." . "<br>";}public function extenShow(){echo "hello world";}}# 子類繼承父類的所有方法class BeatBask extends BaseObj{public $height;public function __construct($name,$height){$this->height = $height;$this->name = $name;}public function showMe(){if($this->height >= 100){return $this->name . ", 符合條件!";}else{return $this->name . ", 不符合條件!";}}}# 子類繼承父類的所有方法class Lifting extends BaseObj{public function ShowName(){return $this->name;}}$persion = new BeatBask("lyshark","199"); echo $persion->showMe() . "<br>"; # 默認調用子類的方法 echo $persion->extenShow() . "<br>"; # 繼承父類可以調用public的子類 $persion_1 = new Lifting("lyshark","199","1"); echo "來自基類的變量:" . $persion_1->ShowName(); ?>有時我們需要在子類中調用父類中被覆蓋的方法,此時我們就可以使用以下方式實現,先調用原始構造函數,然后再增加新的功能,這樣子類中就可以直接調用父類中的方法了.
<?phpclass Person{protected $name;protected $sex;protected $age;function __construct($name="",$sex="none",$age=0){$this->name = $name;$this->sex = $sex;$this->age = $age;}function say(){echo "姓名: {$this->name} 性別: {$this->sex} 年齡: {$this->age} ";}}class Student extends Person{private $school;function __construct($name="",$sex="none",$age=0,$school="none"){// 調用被本方法覆蓋的,父類的構造方法parent::__construct($name,$sex,$age);$this->school = $school;}function say(){parent::say(); // 調用父類中被覆蓋的方法echo "在: {$this->school} 學校上學 <br>"; // 在原有基礎上增加功能}}$student = new Student("lyshark","男",25,"家里蹲");$student->say(); ?>面向對象重載: 重載指一個標識符被多個函數名,且能夠通過函數的參數個數或參數類型將這些同名函數區分開來,調用不發生混淆,其好處是可實現代碼重用,不用為了對不同參數類型或參數個數而寫多個函數.
多個函數使用同一個名字,但參數個數參數數據類型不同,調用時雖然方法名相同但根據參數個數或參數的數據類型不同而調整調用不同的函數,這就是重載.
<?phpclass persion{// __call = 根據參數調用函數(匿名函數調用,不同參數調用不同函數處理)public function __call($name,$argc){echo "調用方法名稱: " . $name . "<br>";echo "參數存在個數: " . count($argc) . "<br>";if(count($argc) == 1 and $name == "show"){echo $this->MyPrintA($argc[0]);}if(count($argc) == 2 and $name == "show"){echo $this->MyPrintB($argc[0],$argc[1]);}}public function MyPrintA($x){return "調用MyPrintA: 參數x = ". $x . "<br>";}public function MyPrintB($x,$y){return "調用MyPrintB: 參數x = ". $x . "參數y = " . $y . "<br>";}}$point = new persion();$point->show(100); $point->show(1000,2000); ?>面向對象接口: PHP中類的繼承只能單繼承,如果需要多繼承那么就需要使用接口技術了,接口是一種特殊的抽象類,使用關鍵字interface來聲明,不能實例化對象.
接口中的方法必須全是抽象方法成員屬性必須是常量,所有的權限必須是public且由子類來拓展,使用implements代替extends來實現接口,一個類只能繼承一個父類,但是可實現多個接口,如果一個類同時使用了繼承父類和實現接口,必須先繼承再實現.
<?php# 創建一個人類的基類class people{public function eat(){echo "就會吃東西,宅在家里做貢獻. <br>";}}# 聲明接口 MPopedominterface MPopedom{const NAME = "lyshark"; # 接口屬性必須是常量public function popedom(); # 方法必須是public,允許子類繼承}# 聲明接口 MPurviewinterface MPurview{public function purview();}# 創建子類Member 實現一個接口 MPurviewclass Member implements MPurview{public function purview(){echo "當前是在 Member 類中,它繼承了MPurview. <br>";}}# 創建子類 Manager 實現多個接口繼承 MPopedom,MPurviewclass Manager implements MPopedom,MPurview{public function purview(){echo "當前在Manager里面,它是一個多繼承 purview .<br>";}public function popedom(){echo "當前在Manager里面,它是一個多繼承 popedom .<br>";}}# 創建My類,繼承people基類,然后再實現多接口繼承.class My extends people implements MPopedom,MPurview{public function purview(){echo "當前在My里面,它是一個多繼承 purview .<br>";}public function popedom(){echo "當前在My里面,它是一個多繼承 popedom .<br>";}}$var = new Member(); $var->purview();$var1 = new Manager(); $var1->purview(); $var1->popedom();$var2 = new My(); $var2->eat(); $var2->purview(); $var2->popedom(); ?>對象的克隆: 有時我們需要建立一個對象的副本,改變原來的對象時不希望影響副本,此時可使用對象的克隆,即將原對象的所有信息從內存中復制一份,存儲在新開辟的內存中用于對象的拷貝,克隆后兩個對象互不干擾.
<?phpclass Person{private $name;private $age;function __construct($name="",$age=""){$this->name=$name;$this->age=$age;}function say($count){for($x=0; $x<$count; $x++)echo "姓名: {$this->name} 年齡: {$this->age} <br>";}}$p1 = new Person("admin","22"); $p1->say(3);$p2 = clone $p1; $p2->say(4); ?>上面的程序一共創建了兩個對象,由于使用了克隆則兩個對象的數據成員以及成員屬性是一樣的,但如果我們想要在克隆后給克隆對象分配新的成員屬性,此時可以使用_clone方法,該魔術方法可在克隆時指定新的參數.
<?phpclass Person{private $name;private $age;function __construct($name="",$age=""){$this->name=$name;$this->age=$age;}// 當被克隆是執行此方法,初始化變量值.function __clone(){$this->name = "none";$this->age = "0";}function say($count){for($x=0; $x<$count; $x++)echo "姓名: {$this->name} 年齡: {$this->age} <br>";}}$p1 = new Person("admin","22"); $p1->say(3);$p2 = clone $p1; $p2->say(4); ?>類中常量與靜態變量: 在類中定義變量是添加static修飾,即可定義為靜態變量,同樣如果增加const關鍵字則定義為常量.
<?php// 定義類中靜態變量:與靜態函數的定義與使用class StaticClass{static $count;function __construct(){ self::$count++; }static function GetCount() { return self::$count; }}// 在類外可以調用到類內的靜態變量 StaticClass::$count = 0; $res1 = new StaticClass(); $res2 = new StaticClass();echo "調用類內靜態方法: " . StaticClass::GetCount(). "<br>"; echo "第二種調用靜態變量: " . $res1->GetCount() . "<br>";// ---------------------------------------------------------------------- // 定義類中常量:類內定義常量并調用class Book{const BOOK_TYPE = " < PHP開發從入門到入土>";public $obj_name;function setObjName($name){$this->obj_name = $name;}function getObjName(){return $this->obj_name;}}$c_book = new Book(); $c_book->setObjName("PHP 類圖書");echo "輸出內部常量:" . Book::BOOK_TYPE . "<br>"; echo "輸出類名:" . $c_book->getObjName(); ?>定義抽象類: 抽象類就是使用了abstract前綴聲明過的方法與類,該類是一種不能被實例化的類,或者說只能包含聲明部分,而作為其他類的基類來繼承后重寫使用,且該類無法被直接被調用,另外如果被final修飾過就是最終版,說明該類既不可被繼承,也不能再有子類派生類.
<?php// final 定義最終類,該類無法被繼承,繼承會報錯final class FinalObj { public $id;}// abstract 定義抽象類,該類無法實現功能,只能被繼承abstract class Abs_Base{protected $username;protected $password;function __construct($name="",$pass=""){$this->username = $name;$this->password = $pass;}// 定義抽象方法abstract function service($getName,$Price);abstract function GetUser();}// 定義子類MyBook,并繼承抽象類PersionObjclass MyBook extends Abs_Base{public function service($getName,$Price){echo "書名: {$getName} 價格: {$Price} 元 <br>";}public function GetUser(){echo "用戶: {$this->username} 密碼: {$this->password} <br>";}}$var = new MyBook("lyshark","123456"); $var->GetUser(); $var->service("《PHP 入土》",62.67); ?>Implements 實現多態: 如果需要使用接口中的成員,則需要通過子類去實現接口中的全部抽象方法,但通過類去繼承接口時需要使用Implements關鍵字來實現,并不是使用extends實現,多態類似于接口implements是實現多個接口,,接口的方法一般為空的,,必須重寫才能使用.
<?phpinterface USB{const WIDTH = 5;public function load();public function stop(); } class computer{function using_usb(USB $u){$u->load();$u->stop();} }class Mouse implements USB{function load(){echo "load mouse success <br>";}function stop(){echo "stop mouse success <br>";} }class keyboard implements USB{function load(){echo "load keyboard success <br>";}function stop(){echo "stop keyboard success <br>";} }class main{function using(){$c = new computer();$m = new Mouse();$k = new keyboard();$c->using_usb($m);$c->using_usb($k);} }$var = new main(); $var->using(); ?>對象的序列化: 對象也是在內存中實際存儲的數據類型,有時候我們需要將對象中的值記錄下來,這個過程就叫做對象序列化,通常用于對象需要持續保存,將對象序列化后寫入數據庫等.
<?php// 實現普通數組的序列化$array = array("one","two","three","five");$json = serialize($array); // 序列化//print_r(unserialize($json)); // 反序列化$code = json_encode($array); // 序列化//print_r(json_decode($code,false)); // 反序列化// ---------------------------------------------// 實現對類的序列化,反序列化class Person{private $name;private $age;function __construct($name="none",$age=0){$this->name = $name;$this->age = $age;}function say(){echo "我是: {$this->name} 年齡: {$this->age}";}}$person = new Person("lyshark",24); $person_string = serialize($person); // 序列化 echo "序列化后: {$person_string} <br>"; // 輸出序列化后的數據 file_put_contents("c://out.log", $person_string); // 將序列化后的數據寫入磁盤$load_person = file_get_contents("c://out.log"); // 從磁盤中讀出 $person = unserialize($load_person); // 讀入類 $person->say(); ?>魔術方法SET: 該方法的作用是在程序運行過程中為私有屬性的成員設置值,它不需要有任何返回值,但需要有兩個參數,第一個是傳入在為私有屬性設置值時的屬性名,第二個則是傳入要為屬性設置的值.
<?phpclass Person{private $name;private $age;private $sex;// 定義構造函數,并給與默認參數.function __construct($name="none",$age=0,$sex="none"){$this->name = $name;$this->age = $age;$this->sex = $sex;}// 聲明魔術方法,傳入兩個參數,可以添加過濾條件,過濾一些非法參數public function __set($PropertyName,$PropertyValue){if($PropertyName == "sex"){// 條件判斷,只允許傳入男或者女不能傳入其他值,如果傳入參數非法直接返回if( !($PropertyValue == "男" || $PropertyValue == "女")){return;}// 如果通過驗證則直接賦值$this->$PropertyName = $PropertyValue;}}// 定義打印函數,輸出結果.public function say(){echo "姓名: {$this->name} 年齡: {$this->sex} 性別: {$this->age} <br>";}}$person = new Person("張三",25,"男"); $person->say();// 如下是將sex屬性名傳遞給__set方法,set方法內部會判斷. $person->sex = "中性"; // 此時會賦值失敗,參數被過濾 $person->sex = "女"; // 賦值成功,不會被過濾 $person->say(); ?>魔術方法GET: 該方法與SET方法類似,如果在類中使用GET,則在外部獲取私有屬性的值時,會自動調用此方法,返回私有屬性的值,同時也可以增加一些條件限制,保證私有屬性不會被非法的讀取.
<?phpclass Person{private $name;private $age;private $sex;// 定義構造函數,并給與默認參數.function __construct($name="none",$age=0,$sex="none"){$this->name = $name;$this->age = $age;$this->sex = $sex;}// 聲明魔術方法,傳入兩個參數,可以添加過濾條件,過濾一些非法參數public function __get($PropertyName){if($PropertyName == "sex"){return "保密";}else if($PropertyName == "age"){if($this->age >= 20 && $this->age <= 100 )//return $this->age;return $this->$PropertyName;elsereturn "不符合";}else{// 對其他屬性不加任何限制,可以任意讀取.return $this->$PropertyName;}}}$person = new Person("張三",40,"男"); echo "姓名: {$person->name} <br>"; echo "性別: {$person->sex} <br>"; echo "年齡: {$person->age} <br>"; ?>魔術方法IsSET/UnSET: 魔術方法isset函數的主要用于測定一個變量是否存在,unset函數則是用來刪除指定的變量,其傳入參數為要刪除的變量名稱,如果想要刪除測試類中的方法就需要使用類內定義的魔術方法來實現.
<?phpclass Person{private $name;private $age;private $sex;// 定義構造函數,并給與默認參數.function __construct($name="none",$age=0,$sex="none"){$this->name = $name;$this->age = $age;$this->sex = $sex;}// 在對象外面使用isset()測定私有成員屬性,并傳遞到外部.public function __isset($PropertyName){// 如果傳入的是name屬性,則禁止其測試if($PropertyName == "name")return false;return isset($this->PropertyName);}// 使用unset()方法刪除私有屬性.public function __unset($PropertyName){// 如果是name屬性則禁止刪除.if($PropertyName == "name")return false;unset($this->PropertyName);}// 調用輸出函數public function say(){echo "姓名: {$this->name} 年齡: {$this->age} 性別: {$this->sex} <br>";}}$person = new Person("張三",25,"男");var_dump(isset($person->name)); // 禁止測試該變量 var_dump(isset($person->age)); // 可以測試 unset($person->sex); // 刪除變量$person->say(); ?>魔術方法Call: 當程序試圖調用不存在或不可見的成員方法時,PHP會先調用call方法來存儲方法名稱及其參數,該函數包含兩個參數,即方法名和方法參數,其中方法參數是以數組形式存在的.
<?phpclass BaseObj{public function MyDemo(){echo "調用方法如果存在,則會直接執行";}public function __call($method,$parameter){echo "方法名為:" . $method . "<br>";echo "方法名: {$method} <br>";echo "參數列表: "; var_dump($parameter);}}$var = new BaseObj(); $var->MyDemo(); // 調用方法存在則正常執行 $var->MyPrint("how","what","where") // 不存在則執行call方法 ?>魔術方法callStatic: 當用戶調用了一個類中不存在的函數時,默認會觸發該函數。
<?phpclass BaseObj{static $name= "lyshark";function __invoke(){echo "hello lyshark <br>";}static function __callstatic($name,$args){echo "{$name} 函數沒有找到. <br>";var_dump($args);}}$var = new BaseObj(); $var; # 觸發__invoke方法 BaseObj::hello("lyshark","22"); # 如果方法不存在則會執行__callstatic ?>魔術方法toString: 當使用echo或print輸出對象時,可以自動將對象轉換為字符串輸出,如果沒有該方法,直接輸出對象將會發生致命錯誤。
<?phpclass BaseObj{private $name = "lyshark";public function __toString(){return $this->name;}}$var = new BaseObj(); echo "對象 var 的值是: ". $var; ?>魔術方法autoload: 該方法可以自動實例化需要使用的類,當程序要用到一個類但沒加載時,該方法會在指定路徑自動查找該類名稱,如果找到程序繼續執行,否則會報錯。
// 首先創建: BaseObj.class.php <?phpclass BaseObj{private $count;public function __construct($count){$this->count = $count;}public function __toString(){return $this->count;}} ?>// 接著創建index.php <?php function __autoload($class_name) {$class_path = $class_name.'.class.php';if(file_exists($class_path))include_once($class_path);elseecho "未導入"; } $var = new BaseObj("hello lyshark"); echo $var; ?>新常量覆蓋舊常量: 基類中定義了一個常量,子類中同樣定義相同的常量,則兩個常量會發生沖突,覆蓋的現象.
<?phpclass persion{const NAME = "lyshark";public function __construct(){echo "當前姓名:" . persion::NAME;}}class per extends persion{const NAME="alex";public function __construct(){parent::__construct(); # 調用父類構造方法echo "新的姓名:" . self::NAME;}}$class_name = new per(); ?>對象之間的比較: 比較對象之間是否有差異,雙等于號時比較內容是否一致,三個等于號則是比較引用地址是否一致.
<?phpclass SportObj{private $book_type;public function __construct($book_type){$this->book_type = $book_type;}}$book = new SportObj("book"); $clonebook = clone $book; $referBook = $book;if($book==$clonebook) {echo "book = clonebook 兩個對象的內容相等. <br>"; } if($referBook === $book) {echo "referBook = book 兩個對象引用地址相等. <br>"; } ?>對象之間類型檢測: instanceof 操作符可以用于檢測當前的對象屬于哪個類中的成員.
<?phpclass BaseObj{public function init(){echo "這是基類 <br>";}}class MyBook extends BaseObj{public function init(){echo "這是BaseObj的派生類. <br>";}}$var = new MyBook(); if($var instanceof MyBook) {echo "對象var 屬于 MyBook類"; } ?>單例模式: 單例模式就是提供一個接口,特定的類只能實例化一個,無法實例化多個類.
<?phpfinal class Student{// 私有的靜態的保存對象的屬性private static $obj = NULL;// 構造函數私有化,阻止類外new對象private function __construct(){}// 私有的克隆方法: 組織類外clone對象private function __clone(){}public static function getInstance(){if(!self::$obj instanceof self){// 判斷對象是否存在,如果不存在則創建新對象self::$obj = new self();}// 如果對象存在則直接返回return self::$obj;}}// 數據只有一份,調用可以多次 $person = Student::getInstance(); $person1 = Student::getInstance();var_dump($perosn,$person1); ?>PHP 操作數據庫
創建測試數據: 首先我們需要創建一些測試記錄,然后先來演示一下數據庫的基本的鏈接命令的使用.
create table username ( uid int not null,name varchar(50),sex varchar(10),age int );insert into username(uid,name,sex,age) values(1,"李四","男",25); insert into username(uid,name,sex,age) values(2,"張三","男",33); insert into username(uid,name,sex,age) values(3,"王五","女",56); insert into username(uid,name,sex,age) values(4,"王二麻子","男",76); insert into username(uid,name,sex,age) values(5,"六頭","男",34); insert into username(uid,name,sex,age) values(6,"孫琪","女",25); insert into username(uid,name,sex,age) values(7,"流云","男",63);<?php$mysqli = new mysqli("localhost","root","123456","mysql");if(mysqli_connect_errno()){printf("連接失敗: %s <br>",mysqli_connect_error());}printf("當前數據庫字符集: %s <br>",$mysqli->character_set_name());printf("客戶端版本: %s <br>",$mysqli->get_client_info());printf("主機信息: %s <br>",$mysqli->host_info);printf("服務器版本: %s <br>",$mysqli->server_info);printf("服務器版本: %s <br>",$mysqli->server_version);if($mysqli->query("select * from lyshark.username;")){echo "當前記錄條數: {$mysqli->affected_rows} 條 <br>";echo "新插入的ID值: {$mysqli->insert_id} 條 <br>";}$mysqli->close(); ?>逐條讀取數據: 通過循環的方式逐條讀取數據,并將數據根據HTML格式輸出到屏幕,注意用完后釋放,否則會非常占用內存.
<?php$mysqli = new mysqli("localhost","root","123456","lyshark");if(mysqli_connect_errno())printf("連接失敗: %s <br>",mysqli_connect_error());if(!$mysqli->query("set names utf8;"))printf("切換字符集失敗 <br>");// 第一種查詢方式: 逐行遍歷結果集$result = $mysqli->query("select uid,name from lyshark.username;");while(list($uid,$name) = $result->fetch_row()){echo "UID: {$uid} --> Name: {$name} <br>";}$result->close();// 第二種遍歷方式: 遍歷時直接輸出到外部表格上$result = $mysqli->query("select * from lyshark.username;");echo "<table width='90%' border='1' align='center'>";echo "<th>用戶ID</th><th>姓名</th><th>性別</th><th>年齡</th>";while($row=$result->fetch_assoc()){echo "<tr align='center'>";echo "<td> {$row['uid']}</td>";echo "<td> {$row['name']}</td>";echo "<td> {$row['sex']}</td>";echo "<td> {$row['age']}</td>";echo "<tr>";}echo "</table>";$result->close();//第三種方式,直接輸出關聯數組$result = $mysqli->query("select * from lyshark.username;");while($row=$result->fetch_array(MYSQLI_ASSOC)){echo "UID: {$row['uid']} 姓名: {$row['name']} <br>";}$result->close();$mysqli->close(); ?>通過對象返回結果集: 該方法與前面三個不同,他將以一個對象的形式返回一條結果記錄,而不是數組,它的每個字段都需要以對象的方式進行訪問,數據列的名稱區分字母大小寫.
<?php$mysqli = new mysqli("localhost","root","123456","lyshark");if(mysqli_connect_errno())printf("連接失敗: %s <br>",mysqli_connect_error());if(!$mysqli->query("set names utf8;"))printf("切換字符集失敗 <br>");$result = $mysqli->query("select * from lyshark.username;");echo "<table width='90%' border='1' align='center'>";echo "<th>用戶ID</th><th>姓名</th><th>性別</th><th>年齡</th>";while($rowObj=$result->fetch_object()){echo "<tr align='center'>";echo "<td> {$rowObj->uid}</td>";echo "<td> {$rowObj->name}</td>";echo "<td> {$rowObj->sex}</td>";echo "<td> {$rowObj->age}</td>";echo "<tr>";}echo "</table>";$result->close();$mysqli->close(); ?>參數綁定執行: 參數綁定執行其實使用的就是預處理技術,即預先定義SQL語句模板,然后后期使用變量對模板進行填充,然后在帶入數據庫執行,這里其實可以在帶入模板時對數據進行合法驗證,保證不會出現SQL注入的現象.
<?php$mysqli = new mysqli("localhost","root","123456","lyshark");if(mysqli_connect_errno())printf("連接失敗: %s <br>",mysqli_connect_error());if(!$mysqli->query("set names utf8;"))printf("切換字符集失敗 <br>");// 聲明一個insert語句,并使用mysqli->prepare($query)對該SQL進行預處理$query = "insert into username(uid,name,sex,age) values(?,?,?,?);";$stmt = $mysqli->prepare($query);// 使用占位符綁定變量: i=>整數 d=>浮點數 s=>字符串 b=>二進制// issi => 代表 => 整數 字符串 字符串 整數$stmt->bind_param("issi",$u_id,$u_name,$u_sex,$u_age);// 填充預處理變量$u_id = 8;$u_name = "lyshark";$u_sex = "男";$u_age = 25;$stmt->execute(); // 執行插入操作echo "插入的行數: {$stmt->affected_rows} <br>";echo "自動增長ID: {$mysqli->insert_id} <br>";// 繼續填充插入新的變量$u_id = 10;$u_name = "super_user";$u_sex = "男";$u_age = 300;$stmt->execute(); // 執行插入操作echo "插入的行數: {$stmt->affected_rows} <br>";echo "自動增長ID: {$mysqli->insert_id} <br>";$stmt->close();$mysqli->close(); ?>預處理語句查詢: 使用預處理執行SQL時,拿到的執行結果并不是一個數組,我們需要自己將這些結果集綁定到指定的變量上,然后再通過遍歷變量的方式獲取到結果集中的所有數據.
<?php$mysqli = new mysqli("localhost","root","123456","lyshark");if(mysqli_connect_errno())printf("連接失敗: %s <br>",mysqli_connect_error());if(!$mysqli->query("set names utf8;"))printf("切換字符集失敗 <br>");$query = "select uid,name,sex,age from lyshark.username;";if($res = $mysqli->prepare($query)){$res->execute(); // 執行SQL語句$res->store_result(); // 取回所有的查詢結果echo "記錄個數: {$res->num_rows} 行 <br>";// 綁定返回結果到指定變量上$res->bind_result($u_id,$u_name,$u_sex,$u_age);while($res->fetch()){printf("%d --> %s --> %s --> %d <br>",$u_id,$u_name,$u_sex,$u_age);}}$res->close();$mysqli->close(); ?>如果在SELECT查詢語句上也使用占位符去查詢,并需要多次執行這一條語句時,也可以將mysqli_stmt對象中的bind_param()和bind_result()方法結合起來.
<?php$mysqli = new mysqli("localhost","root","123456","lyshark");if(mysqli_connect_errno())printf("連接失敗: %s <br>",mysqli_connect_error());if(!$mysqli->query("set names utf8;"))printf("切換字符集失敗 <br>");// 此處我們使用一個占位符uid=?$query = "select uid,name,sex,age from lyshark.username where uid=?;";if($res = $mysqli->prepare($query)) // 預處理語句{$u_id = 1;$res->bind_param("d",$u_id); // 綁定參數,綁定到UID上$res->execute(); // 執行$res->store_result(); // 取回所有的查詢結果echo "記錄個數: {$res->num_rows} 行 <br>";// 綁定返回結果到指定變量上$res->bind_result($u_id,$u_name,$u_sex,$u_age);while($res->fetch()){printf("%d --> %s --> %s --> %d <br>",$u_id,$u_name,$u_sex,$u_age);}}$res->close();$mysqli->close(); ?>開啟事務提交: 在使用事務提交時需要讓MySQL數據庫切換到InnoDB上,然后執行事務,最后提交.
<?php$mysqli = new mysqli("localhost","root","123456","lyshark");if(mysqli_connect_errno())printf("連接失敗: %s <br>",mysqli_connect_error());if(!$mysqli->query("set names utf8;"))printf("切換字符集失敗 <br>");$success = TRUE;$age = 30;$mysqli->autocommit(0); // 暫時關閉事務提交$result = $mysqli->query("select * from lyshark.username;");// 如果SQL執行失敗,則將狀態設置為假if(!$result or $mysqli->affected_rows != 1){$success=FALSE;}// 最后判斷是否成功,成功則提交事務if($success){$mysqli->commit();echo "事務已提交 <br>";}else{$mysqli->rollback();echo "事務執行失敗,回滾到初始狀態<br>";}$mysqli->autocommit(1); // 開啟事務$result->close();$mysqli->close(); ?>PDO 連接MySQL數據庫: PDO技術就是在SQL語句中添加了一個中間層,所有的查詢方式都可以通過中間層去調用,極大的提高了數據庫操作的通用性,同時安全性也得到了更好的保障,以下是基本的語句使用:
<?php// 設置持久連接的選項數組作為最后一個參數$opt = array(PDO::ATTR_PERSISTENT => TRUE);try{$dbh = new PDO("mysql:dbname=lyshark;host=localhost","root","123456",$opt);}catch(PDOException $e){echo "數據庫連接失敗: {$e->getMessage()} <br>";exit;}// 調用getAttribute()可以獲得所有屬性名稱對應的值.echo "是否關閉自動提交: " . $dbh->getAttribute(PDO::ATTR_AUTOCOMMIT) . "<br>";echo "PDO錯誤處理模式: " . $dbh->getAttribute(PDO::ATTR_ERRMODE) . "<br>";echo "表字段字符的大小寫轉換: " . $dbh->getAttribute(PDO::ATTR_CASE) . "<br>";echo "連接狀態相關的信息: " . $dbh->getAttribute(PDO::ATTR_CONNECTION_STATUS) . "<br>";echo "空字符串轉換SQL的NULL: " . $dbh->getAttribute(PDO::ATTR_ORACLE_NULLS) . "<br>";echo "應用程序提前獲取數據大小: " . $dbh->getAttribute(PDO::ATTR_PERSISTENT) . "<br>";// 設置一個標志$dbh->setAttribute(PDO::ATTR_ERRMODE); ?>PDO 獲取表中數據: 當執行查詢語句時我們可以使用PDO中的Query()方法,該方法執行后返回受影響的行總數,也可以使用Fetch等語句,下面是三者的查詢方式.
<?php// 設置持久連接的選項數組作為最后一個參數$opt = array(PDO::ATTR_PERSISTENT => TRUE);try{$dbh = new PDO("mysql:dbname=lyshark;host=localhost","root","123456",$opt);// 設置捕獲異常$dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);}catch(PDOException $e){echo "數據庫連接失敗: {$e->getMessage()} <br>";exit;} // -------------------------------------------------// 使用 query() 完成數據查詢$query = "select uid,name,sex,age from username";try{$pdo_proc = $dbh->query($query);echo "總共查詢到: {$pdo_proc->rowCount()} 條記錄 <br>";foreach($pdo_proc as $row){echo $row['uid'] . "\t";echo $row['name'] . "\t";echo $row['sex'] . "\t";echo $row['age'] . "\t";echo "<br>";}}catch(PDOException $e){// 兩種方式都可以完成異常捕獲echo $e->getMessage();print_r($dbh->errorInfo());}// -------------------------------------------------// 使用 fetch() 方法完成遍歷$stmt = $dbh->query("select uid,name,sex,age from username");while($row = $stmt->fetch(PDO::FETCH_ASSOC)){echo $row['uid'] . "\t";echo $row['name'] . "\t";echo $row['sex'] . "\t";echo $row['age'] . "\t";echo "<br>";}// -------------------------------------------------// 使用 fetch_all() 方法完成遍歷$stmt = $dbh->prepare("select uid,name,sex,age from username;");$stmt->execute();$allRow = $stmt->fetchAll(PDO::FETCH_NUM);foreach ($allRow as $row){echo "{$row[0]} <br>";} ?>PDO 參數綁定后執行: 參數綁定執行,在上面的內容中已經嘗試過了,這里其實就是使用的引擎變成了PDO引擎,根本的東西還是老樣子.
<?php// 設置持久連接的選項數組作為最后一個參數$opt = array(PDO::ATTR_PERSISTENT => TRUE);try{$dbh = new PDO("mysql:dbname=lyshark;host=localhost","root","123456",$opt);// 設置捕獲異常$dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);}catch(PDOException $e){echo "數據庫連接失敗: {$e->getMessage()} <br>";exit;}// 直接綁定后插入數據$query = "insert into username(uid,name,sex,age) values(?,?,?,?);";$stmt = $dbh->prepare($query); // 預處理// 填充數據$u_id = 100;$u_name = "lyshark";$u_sex = "男";$u_age = 25;// 綁定參數,分別綁定1,2,3,4個位置的?號,到每個變量上$stmt->bindParam(1,$u_id);$stmt->bindParam(2,$u_name);$stmt->bindParam(3,$u_sex);$stmt->bindParam(4,$u_age);$stmt->execute(); // 執行提交// -------------------------------------------------// 第二種綁定參數的方式$query = "insert into username(uid,name,sex,age) values(:u_id,:u_name,:u_sex,:u_age);";$stmt = $dbh->prepare($query);$stmt->execute(array(":u_id" => 200,":u_name"=> "三從",":u_sex" => "女",":u_age"=>25)); ?>PDO 綁定參數實現查詢: 前面的查詢是直接寫死的SQL語句實現的查詢,這里我們需要通過PDO將其參數綁定,動態的傳入數據讓其進行查詢,該方法可以將一個列和一個指定的變量名綁定在一起.
<?php// 設置持久連接的選項數組作為最后一個參數$opt = array(PDO::ATTR_PERSISTENT => TRUE);try{$dbh = new PDO("mysql:dbname=lyshark;host=localhost","root","123456",$opt);// 設置捕獲異常$dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);}catch(PDOException $e){echo "數據庫連接失敗: {$e->getMessage()} <br>";exit;}$query = "select uid,name,sex,age from username;";try{$stmt = $dbh->prepare($query);$stmt->execute();$stmt->bindColumn(1,$u_id); // 通過序號綁定$stmt->bindColumn(2,$u_name); // 第二個參數綁定到u_name$stmt->bindColumn('sex',$u_sex); // 將sex綁定到u_sex$stmt->bindColumn('age',$u_age);while($row = $stmt->fetch(PDO::FETCH_BOUND)){echo "ID: {$u_id} --> Name: {$u_name} <br>";}}catch(PDOException $e){echo $e->getMessage();} ?>PDO 開啟事務支持: PDO技術同樣支持十五處理,事務用于保證,數據的原子性,一致性,獨立性,持久性,也就是ACID模型.
<?php// 設置持久連接的選項數組作為最后一個參數$opt = array(PDO::ATTR_PERSISTENT => TRUE);try{$dbh = new PDO("mysql:dbname=lyshark;host=localhost","root","123456",$opt);// 設置捕獲異常$dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);}catch(PDOException $e){echo "數據庫連接失敗: {$e->getMessage()} <br>";exit;}try{$dbh->beginTransaction(); // 啟動一個事務$dbh->exec("select * from username;");$dbh->commit(); // 提交事務}catch(Exception $e){$dbh->rollBack();echo "事務失敗,自動回滾: " . $e->getMessage() . "<br>";} ?>總結
以上是生活随笔為你收集整理的PHP 开发基础知识笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python写通讯录_Python:利用
- 下一篇: Android 解压中文乱码(压缩包内中