<?php/*** 三元運算符的應用*/
/*
$a = 10;
$b = 15;
echo $a > $b ? 1 : 0;
*/
// 注:php7新添加的運算符比較運算符x<=>y
// 如果x和y相等,就返回0,如果x>y,就返回1,如果x的值小于y,就返回-1/*
$a = "aaa";
$b = "bbb";
echo $a.$b;
*//*** 預定義常量*//*
class a
{function showName(){echo __METHOD__;echo "<hr>";echo __FUNCTION__;echo "<hr>";echo __CLASS__;echo __FILE__;echo __DIR__;}
}
$b = new a();
$b->showName();*//*** switch分支語句*//*
switch ($type) {case 1:echo "11";break;case 2:echo "12";break;default :echo "13";break;
}
*//*** while循環* 需要注意,while循環必須進行變量初始化*//*
$i = 1;
while ($i <= 10) {echo $i." ";$i++;
}
*//*** do while循環*/
/*
$i = 0;
do {$i++;echo $i." ";
} while($i<10);
*//*** for循環*/
/*for ($i = 0; $i < 10; $i++) {echo $i." ";
}*//*** foreach循環*//*
$arr = ['name'=>'xiaobudiu','age'=>25,'hobby'=> ['1' => 'hobby','2' => 'code']
];
foreach ($arr as $k => $v){echo $k."=>".$v;echo " ";
}
*//*** 跳轉語句之goto (還有break,continue)* goto* goto a直接跳到a 中間部分的代碼不執行*//*
goto a;
echo 'kkk';
echo '123';
a:
echo 'bbb';
echo '525';
*/
//此部分代碼瀏覽器顯示為
//bbb525/*** goto跳轉語句*//*
for($i = 0; $i < 10; $i++) {if($i == 3){goto a;}echo $i;
}
a:
echo "跳出循環";
*/
//瀏覽器顯示為
//012跳出循環/*** 引用傳遞*/
/*
function test(&$a)
{$a = $a + 1;return $a;
}$x = 1;
echo test($x); // 2
echo "<hr>";
echo $x; // 2
*//*** 函數的默認參數* 為了避免意外情況發生,一般,默認參數放在非默認參數的右側*/
/*
function aa($a = 2, $b)
{echo $a + $b;
}
aa(3,5);
// 瀏覽器顯示8
// 這里,如果調用時aa(3)只給了一個參數,則會報錯
*//*** 可變參數變量* 參數可包含'...'來表示函數可接受一個可變數量的參數* 可變參數將會被當做一個數組傳遞給函數*/
/*
function test(...$num)
{$sum = 0;foreach ($num as $k => $value){$sum += $value;}return $sum;
}echo test(1, 3, 4, 5);
//結果1+3+4+5 = 13
*//*** return跳轉語句* return 本身只能返回一個值,不能返回數組,我們通過這種方法來實現返回數組,并在調用時用list接收* return之后的代碼不在執行,這里,echo "111"代碼執行不了,所以瀏覽器只返回了28 11*/
/*
function aak($a, $b)
{$sum = $a * $b;$sum2 = $a + $b;return array($sum, $sum2);
}
list($a1, $a2) = aak(4,7);
echo $a1." ".$a2;
//瀏覽器顯示 28 11
*//*** 使用get_loaded_extensions 我們來查看一下現在的php程序加載了哪些拓展*/
//var_dump(get_loaded_extensions());/*** 匿名函數(也叫閉包函數)* 允許臨時創建一個沒有指定名稱的函數,經常用作回調函數(callback)參數的值* 閉包函數也可以作為變量的值來使用(比如此例)*/
/*
$greet = function ($name)
{echo "hello,$name";
};
$greet('xiaobudiu'); //瀏覽器顯示 hello,xiaobudiu
*//*** 遞歸思想* 斐波那契數列* 1,1,2,3,5,8...*$n表示第幾個數*/
/*
function compute($n)
{if ($n > 2) {return compute($n - 1) + compute($n - 2);} else {return 1;}
}
echo compute(7);
*//*** 迭代思想* 利用變量的原值推算出變量的一個新值*/
/*
function dieDai($n)
{for ($i = 0 , $j = 0; $i < $n; $i++) {$j = $i + $j;}return $j;
}
echo dieDai(50);
*//*** 單引號和雙引號*/
/*
$str = "i dont't want to go shoping";
echo ucwords($str);
*//*** 字符串替換*str_ireplace();str_replace()*/
/*
$str = "hello,world,hello,world";
echo str_replace('or', 'dd', $str);
$replace = 'hi';
echo substr_replace($str, $replace, 0, 7);//將第0到第7個字符替換成$replace字符
// 瀏覽器顯示hiorld,hello,world
*//**** 截取字符串*/
/*
$str = 'abcdefg';
echo substr($str,0,4);
// 瀏覽器顯示:abcd
*//*** 去掉字符串首尾特殊字符* trim();ltrim();rtrim()*/
/*
$str = ' .abcded .gk.';
echo $str;
echo "<hr>";
$str = trim($str);
echo $str;//.abcded .gk.(空格去掉了)
echo '<hr>';
$str = ltrim($str,'.');//abcded .gk.(左邊的點被去掉了)
echo $str;
echo '<hr>';
$str = rtrim($str,'.');//(右側的點被去掉了)
echo $str;
*//*** str_replace()*/
/*
$str = 'hello,world,d,hello,world,ef';
//要求把第二個hello替換成hi
echo str_replace('hello','hi',$str);
*/
//str_replace()單獨實現不了替換限制次數的需求,要替換,都替換,無法替換單獨一個/*** 對字符串執行指定次數替換* @param Mixed $search 查找目標值* @param Mixed $replace 替換值* @param Mixed $subject 執行替換的字符串/數組* @param Int $limit 允許替換的次數,默認為-1,不限次數* @return Mixed*/
/*
function strReplaceLimit($search, $replace, $subject, $limit= -1)
{if (is_array($search)) {foreach ($search as $k => $v) {$search[$k] = '`'. preg_quote($search[$k], '`'). '`';}} else {$search = '`'. preg_quote($search, '`'). '`';}return preg_replace($search, $replace, $subject, $limit);
}
$str = "abccddefccggcccg";
echo strReplaceLimit('cc', 'c',$str, 2);
echo '<hr>';
*/
// 瀏覽器顯示:abcddefcggcccg(前兩個cc都被替換了,最后一個ccc沒有被替換)/*** 截取字符串* substr*/
/*
$str = "abcdefghijklmn";
echo substr($str,-4, 2); // kl
*//** 計算字符串長度* str_len、mb_strlen*/
/*
$str = "abcde我";
echo strlen($str); // 8 (中文3個字符,英文1個字符)
echo mb_strlen($str, 'UTF8'); // 6 (中文、英文都算一個字符)
*//*** 轉義和還原字符串* 轉義:addslashes() 還原:stripslashes* 兩個參數 第一個參數字符串,第二個參數要進行轉義的字符*/
/*
$str = "I Don't wang to go shopping..";
$str = ucwords($str);
echo $str;//I Don't Wang To Go Shopping..
echo "<hr>";
//$str = addslashes($str);
$str = addcslashes($str,'.');
echo $str;//I Don't Wang To Go Shopping\.\.
*//*** 重復字符串* str_repeat*/
/*
$str = 'abcd';
echo str_repeat($str,2);
*//*** 隨機打亂字符串* str_shuffle()*/
/*
$str = "abcdefghijklmn";
echo str_shuffle($str);
*//*** 分割字符串* explode()*/
/*
$str = "piece1,piece2,piece3";
$str = explode(',',$str);
var_dump($str); //array(3) { [0]=> string(6) "piece1" [1]=> string(6) "piece2" [2]=> string(6) "piece3" }
echo "<hr>";
$str = implode('-',$str);
echo $str; //piece1-piece2-piece3
*//*** 創建一個指定范圍的數組* range() 第三個參數step 步進值*/
/*
$array = range('0', '9', 2);
var_dump($array); //array(5) { [0]=> int(0) [1]=> int(2) [2]=> int(4) [3]=> int(6) [4]=> int(8) }
*//*** 檢查數組中是否存在某個值* in_array*/
/*
$arr = ['beijing', 'shanghai', 'hangzhou', 'shenzhen'];
var_dump(in_array('hangzhou', $arr));//bool(true)
*//*** 數組轉換成字符串* implode()*/
/*
$array = ['beijing', 'shanghai', 'hangzhou', 'shenzhen'];
$arrayStr = implode('-', $array);
echo $arrayStr; // beijing-shanghai-hangzhou-shenzhen
*//*** 計算數組中的單元數目* count()* 第二個參數可選,默認0,識別不了無限遞歸,1:可以識別無限遞歸* 此例中,輸出的count就是6*/
/*
$array = ['beijing','shanghai'=>['pudong','jiaoda'],'hangzhou','shenzhen'
];
echo count($array); // 4
echo "<hr>";
echo count($array,1); // 6
*//*** 數組當前單元和指針* current(),next(),prev(),end(),reset()*/
/*
$foods = ['banana', 'apple', 'orange'];
var_dump(current($foods));
var_dump(next($foods));//將數組指針向后移動一位
var_dump(current($foods));
*//*** 數組中的鍵名和值* key() next()*//*** 檢查給定鍵名或索引是否存在于數組中* array_key_exits*//*** 獲取數組中鍵名* array_keys()*//*** 獲取數組中所有的值* array_values*/
/*
$arr = ['12' => 'beijing','25' => 'shanghai','3' => 'hangzhou','4' => 'shenzhen'
];
var_dump(array_values($arr));
*//*** 搜索給定值返回鍵名 (存在多個返回第一個匹配元素的鍵)* array_search*/
/*
$arr = ['0' => 'blue','2' => 'red','3' => 'green','5' => 'red'
];
var_dump(array_search('red', $arr)); // 2
*//*** 填補數組* array_pad()* pad_size:填補后數組的長度(若為負數,則填補到左側)* pad_value:填補的內容*/
/*
$arr = ['0' => 'blue','2' => 'red','3' => 'green'
];
$arr = array_pad($arr, 6, 'orange');
var_dump($arr);
*//*** 使用指定的鍵和值填充數組* array_fill_keys*/
/*
$arr = ['banana', 'apple', 2, 5];
$arr = array_fill_keys($arr, ['hangzhou', 'shanghai', 'beijing']);
echo "<pre>";
print_r($arr);
print_r($arr['banana']);
*//** 瀏覽器顯示Array
([banana] => Array([0] => hangzhou[1] => shanghai[2] => beijing)[apple] => Array([0] => hangzhou[1] => shanghai[2] => beijing)[2] => Array([0] => hangzhou[1] => shanghai[2] => beijing)[5] => Array([0] => hangzhou[1] => shanghai[2] => beijing))
*//*** 從數組中隨機取出一個或多個單元* array_rand* 注:返回隨機條目的一個或多個鍵*/
/*
$array = ['0' => 'blue','2' => 'red','3' => 'green','4' => 'color'
];
$arrayTwo = array_rand($array, 3);
var_dump($arrayTwo);
*//*** 數組排序與打亂數組* sort()、asort()、shuffle()*/
/*
$arr = range('a','z');
shuffle($arr);
foreach($arr as $v){echo $v;echo " ";
}
*//*** 遍歷數組* for、foreach()、each()、list()*/$array = ['beijing', 'shanghai', 'guangzhou', 'hangzhou', 'shenzhen'];
$arrayTwo = ['haerbin', 'zhengzhou' => 'henan', 'nanjing'];
/*
//for循環寫法
for($i = 0; $i < count($array); $i++){echo $array[$i];echo '<br>';
}
echo "<hr>";//foreach寫法
foreach($arrayTwo as $v) {echo $v;echo ' ';
}
*//*** list() 將數組的值分給賦給變量**/
/*
$array = ['beijing', 'shanghai', 'guangzhou', 'hangzhou', 'shenzhen'];
list($a[1], $a[2], $a['x']) = $array;
var_dump($a);
*//*** 數組的拆分,拆分成n組,每組幾個元素* array_chunk()*/
/*
$array = ['beijing', 'shanghai', 'guangzhou', 'hangzhou', 'shenzhen'];
$array = array_chunk($array, 2, true);
echo "<pre>";
print_r($array);
*//*** 合并數組(不自動去重,如果需要去重結合array_unique()使用)* array_merge()*/
/*
$array = ['beijing', 'shanghai', 'guangzhou', 'hangzhou', 'shenzhen'];
$arrayTwo = ['haerbin', 'zhengzhou'=>'henan', 'nanjing', 'hangzhou'];
$arr = array_merge($array, $arrayTwo);
echo "<pre>";
print_r($arr);
*//*** 增加刪除數組中的元素* array_shift() 可在數組開頭插入一個1或多個單元* array_unshift() 可將數組開頭的單元移除數組* array_push() 用來將一個或多個單元壓入數組的末尾(入棧)* array_pop() 可將數組的最后一個單元彈出(出棧)*//*** 從數組中取出一段* array_slice() 字符串 substr*/
/*
$array = ['beijing', 'shanghai', 'guangzhou', 'hangzhou', 'shenzhen'];
var_dump(array_slice($array, 2, 3, true));
//array(3) { [2]=> string(9) "guangzhou" [3]=> string(8) "hangzhou" [4]=> string(8) "shenzhen" }
*//*** 把數組中的一部分去掉,并用其他值取代* array_splice()*/
/*
$array = ['haerbin', 'zhengzhou' => 'henan', 'nanjing', 'hangzhou'];
array_splice($array, 1, 2, 'code');
echo "<pre>";
var_dump($array); //array(3) { [0]=> string(7) "haerbin" [1]=> string(4) "code" [2]=> string(8) "hangzhou" }
*//*** 系統預定義數組 $_SERVER $_GET $_POST*///var_dump($_SERVER);
//var_dump($_POST);
//var_dump($_GET);
/*
$name = $_POST['name'];
$pass = $_POST['pass'];
var_dump($_POST);
*//*** 獲取通過post方式上傳文件的相關信息* $_FILES*/
/*
session_start();
session_id();
var_dump(session_id());
echo "<hr>";
$_COOKIE['name'] = 'xiaobudiu';
$_COOKIE['pass'] = '56611';
echo "<pre>";
print_r($_COOKIE);
setcookie('session_id','');
*//*** 獲取當前時間* time();*/
// var_dump(date('Y-m-d H:i:s', time()));/***取得日期時間信息* getdate()*/
/*$arr=getdate();
var_dump($arr);*/
/*
array(11) {["seconds"]=>int(57)["minutes"]=>int(58)["hours"]=>int(18)["mday"]=>int(4)["wday"]=>int(4)["mon"]=>int(1)["year"]=>int(2018)["yday"]=>int(3)["weekday"]=>string(8) "Thursday"["month"]=>string(7) "January"[0]=>int(1515063537)
}
*//*** 常用時間處理**//*** 默認時區設置* date_default_timezone_set()*/
//date_default_timezone_set('PRC');/*** 計算兩個日期的時間差* 2017年1月4日20時28分30秒 2018年5月6日19時30分15秒* @param $hour_start int 起始小時 (這里填20)* @param $minutes_start int 起始分鐘數 (這里填28)* @param $seconds_start int 起始秒數 (這里填30)* @param $month_start int 起始月份 (這里填1)* @param $day_start int 起始日期(這里填4)* @param $year_start int 起始年份(這里填2017)* @param $hour_end* @param $minutes_end* @param $second_end* @param $month_end* @param $day_end* @param $year_end*/
/*
function diff_time($year_start, $month_start, $day_start, $hour_start, $minutes_start, $seconds_start,$year_end, $month_end, $day_end, $hour_end, $minutes_end, $second_end)
{//2016年1月1日19點30分0秒時間戳//$start = mktime(19,30,0,1,1,2016)$start = mktime($hour_start, $minutes_start, $seconds_start, $month_start, $day_start, $year_start);//2016年7月7日7點30分0秒時間戳//$end = mktime(7,30,0,7,7,2016);$end = mktime($hour_end, $minutes_end, $second_end, $month_end, $day_end, $year_end);//時間戳之差$diff_seconds = $end - $start;//一周的秒數是24*60*60*7=604800$diff_weeks = floor($diff_seconds / 604800);//一天的秒數是24*60*60=86400$diff_days = floor($diff_seconds / 86400);$diff_hours = floor($diff_seconds / 3600);$diff_minutes = floor($diff_seconds / 60);echo "兩個時間相差".":".$diff_weeks."個星期,".$diff_days."天,".$diff_hours."小時,".$diff_minutes."分,". $diff_seconds."秒";
}
//示例: 2016年9月25日18時25分30秒 2017年1月4日20時36分15秒
diff_time(2016, 8, 25, 18, 25, 30, 2017, 1, 4, 20, 36, 15);
*//*** 將具體時間日期轉化為時間戳*/
/*
echo mktime(10,25,25,10,25,2016);
echo "<hr>";
echo strtotime('20161025102525');
*//*** 求兩個日期的時間差* 求2016.9.4 10:32:33 與2017.1.4 21:22:23* @param $start int 起始日期 20160904103233* @param $end int 結束日期 20170104212223* 注:也可以不用strtotime,用mktime()去轉化時間戳,其他步驟一樣*/
/*
function diff_time($start,$end)
{$start = strtotime($start);$end = strtotime($end);//計算兩個時間的時間戳$diff_seconds = $end - $start;//求相差多少個星期$diff_weeks = floor($diff_seconds / (24 * 60 * 60 * 7));//求相差多少天$diff_days = floor($diff_seconds / (24 * 60 * 60));//求相差多少小時$diff_hours = floor($diff_seconds / (60 * 60));//求相差多少分$diff_minutes = floor($diff_seconds / 60);//輸出結果echo "兩個時間相差".":".$diff_weeks."個星期,".$diff_days."天,".$diff_hours."小時,".$diff_minutes."分,". $diff_seconds."秒";
}
diff_time('20160904103233','20170104212223');
*//*
$start = 'last Friday';
$time1 = strtotime("$start + 1days");
echo date('Y-m-d H:i:s',$time1);
*//*
$start = '20170430122531';
$end = '20180104224925';
//求兩個時間戳的差
$diff_time = strtotime($end) - strtotime($start);
//求相差多少天
$diff_days = floor($diff_time/(24*60*60));
echo "兩個時間相差".$diff_days."天";
*//*** 驗證日期* checkdate()*/
//var_dump(checkdate(12,32,2016)); //bool(false)/*** 表單的種類*input文本域**//*
var_dump($_POST);
echo "<hr>";
var_dump($_FILES);
*//*** 處理文件上傳* 在html頁面上傳文件到本方法所在php文件,在php文件中,調用方法即可(html頁面中type為file的input name值為file* 如果想更改,本方法中$_FILES['file']也要對應更改*///function upLoadFiles()
//{
// if ($_FILES['file']['error'] > 0) {
// echo "Error:".$_FILES['file']['error']."<br />";
// } else {
// echo "<pre>";
// print_r($_FILES['file']);
// //將臨時文件移動到永久文件
// //判斷文件是否是通過http post上傳的
// if(is_uploaded_file($_FILES['file']['tmp_name'])) {
// $uploadFile = $_FILES['file'];
// //獲取數組里的值
// $name = $uploadFile['name'];
// $tmp_name = $uploadFile['tmp_name'];
// //移動上傳文件到指定目錄(這里用絕對路徑,也可以用相對路徑,但要注意在文件夾前加上網站根目錄)
// /* define('ROOT', dirname(__FILE__)); //E:\PHP\phpstudy\WWW\Project\kk
// //對移動臨時文件是否成功做判斷
// if(!move_uploaded_file($tmp_name,ROOT."\Upload\\".$name)) {
// echo "Error:移動文件失敗,請確認文件名全為英文";
// }*/
// if(@!move_uploaded_file($tmp_name,"E:\PHP\phpstudy\WWW\Project\kk\Upload\\".$name)){
// echo "Error:移動文件失敗,請確認文件名全為英文";
// }
//
// }
// }
//
//}
//upLoadFiles();
//var_dump(__FILE__);
//var_dump(dirname(__FILE__));/*** Class myClass* 靜態屬性(類屬性)* 類內用self調用,類外使用類名調用*/
/*
class myClass
{static $staticVal = 10;function getStatic(){return self::$staticVal;}
}
echo myClass::$staticVal;
echo "<hr>";
$a = new myClass();
var_dump($a->getStatic());
*//*** 靜態方法(類方法)**///class myClass
//{
// static $staticVal = 10;
// public $val = 100;
//
// /**
// * 獲取類屬性(靜態屬性 $staticVal)
// */
// static function getStaticVal()
// {
// echo self::$staticVal;
// }
//
// /**
// * 類內調用類屬性,并對類屬性進行改變
// */
// static function changeStaticVal()
// {
// self::$staticVal++;
// echo self::$staticVal;
// }
//}
//
//myClass::getStaticVal();//10
//myClass::changeStaticVal();//11/*** 文件名操作* basename()*/
/*
echo __FILE__; //E:\PHP\phpstudy\WWW\Project\kk\index.php
echo "<hr>";
$a = basename(__FILE__,".php");
echo $a; //index
*//*** 構造方法* 創建對象時自動調用的方法* __construct* 構造方法常用的場景是在創建對象時給變量賦值*///class yourClass
//{
//
// public $name;
// public $age;
//
// /**
// * yourClass constructor.
// * 構造方法
// * 創建對象時自動調用此方法
// */
// function __construct($name,$age)
// {
// $this->name = $name;
// $this->age = $age;
// }
//
// /**
// * 析構方法
// * __destruct
// * 析構方法是在對象被銷毀前自動執行的方法
// */
// function __destruct()
// {
//
// }
//}
//$a = new yourclass('xiaoming',25);
//echo $a->name;/*** 封裝和繼承* public 任何地方都可以調用* protected 本類和子類中可以被調用* private 只有本類可以調用*//*** 封裝,就是將類中的成員屬性和方法內容細節盡量隱藏起來,確保類外部代碼不能隨意訪問類內內容*//*** 繼承* extends*//*** 多態* 多態,通過繼承,復用代碼實現 可編寫出健壯可擴展的的代碼 減少流程控制語句的使用* 在運行時,根據傳遞的對象參數,決定調用不用的方法*//*** 回顧函數總結:* 函數的三個特性:封裝,繼承,多態* 封裝:將函數的成員屬性成員方法內容細節盡可能隱藏起來,確保類外部代碼不能隨意訪問類中內容* 繼承:一個類作為公共基類,其他類繼承這個類,則其他類都具有這個類的屬性和方法* 多態:通過繼承復用代碼而實現 運行時根據傳遞的參數對象,決定調用哪一個對象的方法*//*** 魔術方法* php提供了內置的攔截器,他可以'發送'到未定義方法和屬性的消息* __set() __get() __isset() __unset() __call() __toString()**//*** __set()* 在代碼要給未定義的屬性賦值時調用,或在類外部修改被private修飾的類屬性時被調用* 它會傳遞兩個參數;屬性名和屬性值* 通過__set()方法也可以實現對private關鍵詞修飾的屬性值進行更改*//*** __get()* 當在類外部訪問被private或protected修飾的屬性或訪問一個類中原本不存在的屬性時被調用*//*** __isset()* 當在類外部對未定義的屬性或者非公有屬性使用isset()函數時,__isset()將會被調用*///注:結合 property_exists() property_exists()用來檢測類中是否定義了該屬性
//用法:property_exists('magic',$key) 檢測在magic類中是否定義了$key屬性/*** __unset()* 對類中未定義的屬性或非公有屬性進行unset()操作時,將會觸發__unset()方法.* 如果屬性存在,unset操作會銷毀這個屬性,釋放該屬性在內存中占用的空間* 再用對象訪問這個屬性時,將會返回NULL*//*** __call()* 當試圖調用不存在的方法時會觸發__call()* __call()有兩個參數,即方法名和參數,參數以索引形式存在*/
/*
class magic
{function __call($func,$param){echo "$func method not exists";var_dump($param);}
}
$obj = new magic();
$obj-> register('param1','param2','param3'); //實例化的對象調用不存在的register()方法
*//** 瀏覽器結果顯示:* register method not existsarray(3) {[0]=>string(6) "param1"[1]=>string(6) "param2"[2]=>string(6) "param3"}*//*** toString()* 當使用echo或print打印對象時會被調用__toString()方法將對象轉化為字符串*/
/*
class magic
{function __toString(){return 'when you want to echo or print the object, __toString() will be called';}
}$obj = new magic();
print $obj; //瀏覽器顯示 when you want to echo or print the object, __toString() will be called
*//*** 自動加載* __autoload()* 當在代碼嘗試加載未定義的類時會觸發__autoload()函數* 用法簡單示例:*/
//假設有兩個文件為myClass.php和yourClass.php,另外, 在同一目錄下寫一個autoload.php文件,代碼如下/*
// myClass.php代碼class myClass
{function myName(){echo "My Name Is xiaobudiu";}
}// yourClass.php代碼
class yourClass
{function yourName(){echo "Your Name Is pgone";}
}// autoload.php代碼
function __autoload($name){if(file_exists($name.".php")){$path = $name . 'php';require_once $path;}else{echo "The Path Is Error";}
}
$my = new myClass();
$my -> myName();
$your = new yourClass();
$your -> yourName();
*//*** 自動加載* spl_autoload_register(),和__autoload()方法功能相似,實現自動加載二選其一即可* 可以實現自動加載以及注冊給定的函數作為__autoload()的實現* 兩個參數 第一個參數autoload_function為要注冊的自動裝載函數,第二個參數throw為布爾值,true為默認,拋出異常;false不拋出異常* 實例:假設當前目錄下存在myClass.php和yourClass.php,并且代碼和上面一樣,autoload.php代碼進行更改*/
/*
function my_autoloader($class)
{include $class.'.php';
}
spl_autoload_register('my_autoloader');
$my = new myClass();
$my->myName();
$your = new yourClass();
$your->yourName();
//此時運行autoload.php 執行結果 My Name Is xiaobudiu Your Name Is pgone
*//*** 抽象類* abstract* 一種對下級代碼的規范* 抽象類和接口都是不能被實例化的特殊類* 可以在抽象類和接口中保留公共的方法,將抽象類和接口作為公共的基類* 一個抽象類必須至少包含一個抽象方法,抽象類中的方法不能被定義為私有的(private),因為抽象類中的方法需要被子類覆蓋* 同樣抽象類中的方法也不能用final修飾,因為其需要被子類繼承* 抽象類中的抽象方法不包括方法實體.如果一個類中包含了一個抽象方法,那么這個類也必須聲明為抽象類* 抽象方法不實現具體的功能,由子類來完成* 子類必須實現抽象類中的所有方法,否則會報錯*
語法:
abstract class class_name
{abstract public function func_name1(arg1, arg2);abstract public function func_name2(arg1, arg2, arg3);
}**///示例:計算矩形的周長/*
abstract class Shape
{abstract protected function get_area();
}class Rectangle extends Shape
{private $width;private $height;function __construct($width = 0, $height = 0){$this->width = $width;$this->height = $height;}function get_area(){echo ($this->width + $this->height) * 2;}
}
$Shape_Rect = new Rectangle(20, 10);
$Shape_Rect->get_area();
*//*** 接口* interface* 一種對下級代碼的規范* 與抽象類不同,一個子類可以繼承自多個接口,接口之間用','隔開,* 接口實現了php的多重繼承* 接口需要被繼承,所以接口中定義的方法不能為私有方法或被final修飾* 接口中定義的全部方法都必須被子類實現,并且不能包含實體**/
//示例:定義database接口
/*
interface Database
{function connect($host, $username, $pwd, $db);function query($sql);function fetch();function close();function test();
}class mysql implements Database
{protected $conn;protected $query;function connect($host, $username, $pwd, $db){$this->conn = new mysqli($host,$username,$pwd,$db);}function query($sql){return $this->conn->query($sql);}function fetch(){return $this->query->fetch();}function close(){$this->conn->close();}function test(){echo "test";}
}
*///類中的關鍵字/*** final* 子類可覆寫父類中的方法,但是在有些時候并不希望父類中的方法被重寫,這時只要在父類中的方法前加上final控制符,* 該方法便不能被子類重寫,否則會報錯*///錯誤示范:
/*
class father
{final function test(){echo "My Name Is xiaobudiu";}
}class son extends father
{function test(){echo "My Name Is PGone";}
}
*/
//執行程序,瀏覽器會報錯 Fatal error: Cannot override final method father::test()/*** clone* 可通過clone關鍵字克隆一個對象,克隆后的對象相當于在內存中重新開辟了一個空間* 克隆得到的對象擁有和原來對象相同的屬性和方法* 修改克隆得到的對象不會影響到原來的對象*/
//示例:
/*
class father
{public $name = 'xiaobudiu';function test(){echo "test";}
}
$obj = new father();
$obj_clone = clone $obj;
$obj_clone->name = 'PGone';
echo $obj_clone->name; //PGone
echo $obj->name //xiaobudiu
*/// 如果使用"="將一個對象賦給一個變量,那么得到的將是一個對象得引用,通過這個變量改變屬性的值將會影響原來的對象
// 示例:
/*
class father
{public $name = 'xiaobudiu';function test(){echo "test";}
}
$obj = new father();
$obj_clone = $obj;
$obj_clone->name = 'PGone';
echo $obj->name,$obj_clone->name;
// PGonePGone
*//*** __clone()* 可以使用__clone()魔術方法將克隆后的副本初始化* 可以理解為當對象被克隆時自動調用這個方法*///示例:
/*
class father
{public $name = 'xiaobudiu';function test(){echo "test";}function __clone(){echo "hi,shuaige";$this->name = 'PGone';//當克隆對象時,克隆后的對象得到的將是此處的name屬性值}
}
$obj = new father();
$obj_clone = clone $obj; //觸發__clone()方法 //hi,shuaige
echo $obj->name,$obj_clone->name;//xiaobudiuPGone
*//*** instanceof關鍵字* instanceof可以檢測對象屬于哪個類* 也可以用于檢測生成實例的類是否繼承自某個接口*/
//示例:
/*
class father
{public $name = 'xiaobudiu';function test(){echo "test";}
}interface Database
{function test();
}class mysql implements Database
{function test(){echo "test";}
}$obj = new father();
$mysql = new mysql();
var_dump($obj instanceof father);
var_dump($mysql instanceof Database);
var_dump($obj instanceof Database);
//bool(true) bool(true) bool(false)
*//*** 正則表達式* php中有兩套函數庫支持正則表達式* PCRE(Perl Compatible Regular Expression)庫提供,與Perl語言兼容的正則表達式函數,以"preg_"為函數的前綴名稱* POSIX(Portable Operating System Interface)擴展語法正則表達式函數,以"ereg_"為函數的前綴名稱* PCRE的執行效率高于POSIX*//*** 普通字符* 如 'A','B','C'等*//*** 元字符* 分為單字元字符和多字元字符* 如;\d 與數字字符相匹配*//*單字符元字符
//* 零次或多次匹配前面的字符或表達式 zo* 與"z"和"zoo"匹配 {0,}
//+ 一次或多次匹配前面的字符或表達式 zo+ 與"zo"和"zoo"匹配,但與"z"不匹配 {1,}
//? 零次或一次匹配前面的字符或表達式 zo? 與"z"和"zo"匹配,但與"zoo"不匹配 {0,1}
//^ 匹配搜索字符串開始的位置 ^\d{3} 與搜索字符串開始處的3個數字匹配
//^ 如果將^用作括號表達式的第一個字符,就會對字符集求反 比如: [^abc] 匹配除abc以外的任何字符
//$ 匹配搜索字符串結尾的位置 \d{3}$ 與搜索字符串結尾處的3個數字匹配
//. 匹配除換行符\n之外的任何單個字符 a.c與"abc","alc"和"a-c"匹配
//. 若要匹配包括\n在內的任意字符,可以使用[\s\S]之類的模式(\s \S屬于'非打印字符')
//[] 標記括號表達式的開始和結尾 [1-4]與"1","2","3","4"匹配 [^aeiouAEIOU]與任何非元音字符匹配
//{} 標記限定符表達式的開始和結尾 a{2,3}與"aa"和"aaa"匹配
//() 標記子表達式的開始和結尾,可以保存子表達式,以備將來之用 A(\d)與"A0"至"A9"匹配
//| 指示在兩個或多個選項之間進行選擇 z|food 與"z"或"food"匹配; (z|f)ood與"zood"或"food"匹配
/// 表示JScript中的文本正則表達式模式的開始或結尾.在第二個"/"后添加單字符標志可以指定搜索行為
/// /abc/gi 是與"abc"匹配的JScript文本正則表達式.g(全局)標志指定查找模式的所有匹配項,i(忽略大小寫)標志使搜索不區分大小寫
//\ 轉義字符 \\與"\"匹配, \(與"("匹配, \n與換行符匹配
*/
/*多字符元字符
\b 與一個字邊界匹配(即字與空格間的位置) er\b與"never"中的"er"匹配,但與"verb"中的"er"不匹配
\B 與非邊界字匹配 er\B與"verb"中的er匹配,但與"never"中的er不匹配
\d 與數字字符匹配,等效于[0-9] \d{2}與"12 345"中的"12"和"34"匹配
\D 與非數字匹配,等效于[^0-9] \D+與"abc123 def"中的'abc"和"def"匹配
\w 與a-z,A-Z,0-9,和下劃線中的任意字符匹配 在"my name is xiaobudiu..."中,\w與"my","name","is","xiaobudiu"匹配
\W 與除a-z,A-Z,0-9,和下劃線中的任意字符匹配 等效于[^a-zA-Z0-9]
[xyz] 字符集,與任何一個指定字符匹配 [abc]與"plane"中的a匹配
[^xyz] 反向字符集,與未指定的任何字符匹配
[a-z] 字符范圍,匹配指定范圍內的任何字符
[^a-z] 反向字符范圍,與不在指定范圍內的任何字符匹配
{n} 正好匹配n次,n是非負整數 o{2}與'Bob'中的"o"不匹配,但與"food"中的"oo"匹配
{n,} 至少匹配n次,n是非負整數 o{2,}與'Bob'中的'o'不匹配,但與"fooood"中的所有"o"匹配
{n,m} 匹配至少n次,至多m次 在搜索字符串"1234567"中,\d{1,3}與"123","456"和"7"匹配
(模式) 與模式匹配并保存匹配項 (Chapter|Section) [1-9]與"Chapter 5"匹配,保存"Chapter"以備將來之用
(?:模式) 與模式匹配,但不保存匹配項以備將來之用 industr(?:y|ies)與industry|industries相等
*//*非打印字符
\f 換頁符
\n 換行符
\r 回車符
\t Tab字符
\v 垂直制表符
\s 任何空白字符,包括空格,制表符,換頁符 等效于[\f\n\r\t\v]
\S 任何非空白字符 等效于[^\f\n\r\t\v]
*/#--------------------------- 正則表達式正式部分 -------------------------------------
/*** php中使用正則表達式** 匹配與查找* preg_match()* preg_match_all()* preg_grep()** 搜索與替換* preg_replace()* preg_filter()** 分割與轉義* preg_split()* preg_quote()*//*** 匹配與查找* preg_match* 返回int* 語法: preg_match($pattern,$subject [array & $matches[,$flags=0 [,$offset=0]]])* pattern是要搜索的模式,例如'/^def/';* subject是指定的被搜索的字符串* 它的值是0或1,在匹配一次后就會停止搜索*//*
$subject = "abcdefghijkdef";
$pattern_1 = '/def/';
$num = preg_match($pattern_1, $subject);
var_dump($num);
*/
// int(1)/*** 匹配與查找* preg_match_all()函數* 返回int* 與preg_match功能相似,只不過在搜索到一次結果之后會繼續搜索,知道末尾*//*** 匹配與查找* preg_grep()函數* 返回array* 可返回匹配模式的數組條目*/
/*
//代碼示例:
$subject = ['abc', 'def', 'efg', 'hijk', 'abcdef', 'defabc'];
$pattern = '/def$/';
$grep_1 = preg_grep($pattern,$subject);//返回與$pattern匹配的元素組成的數組
var_dump($grep_1);
$grep_2 = preg_grep($pattern, $subject, PREG_GREP_INVERT);//返回與$pattern不匹配的元素組成的數組
var_dump($grep_2);
*//*
//瀏覽器顯示:array(2) {[1]=>string(3) "def"[4]=>string(6) "abcdef"
}
array(4) {[0]=>string(3) "abc"[2]=>string(3) "efg"[3]=>string(4) "hijk"[5]=>string(6) "defabc"
}
*//*** 搜索與替換* preg_replace()* 返回替換之后的字符串* 三個參數,第一個參數:$pattern 搜索模式(規則) 可以是一個字符串或字符串數組* 第二個參數:$replacement 用于替換的字符串或字符串數組* 第三個參數:$subject 要進行搜索和替換的字符串或字符串數組* limit 每個模式在每個subject上進行替換的最大次數 默認-1(無限)* count 如果指定,就會被填充為完成的替換次數*/
/*
$string_1 = 'lily likes apple,no reason';
$pattern_1 = ['/lily/','/likes/','/apple/'];
$replacement_1 = ['tom','hates','orange'];
echo preg_replace($pattern_1,$replacement_1,$string_1); //tom hates orange,no reason
$arr = ['lily likes apple,no reason','Tom hates orange,no reason'];
$pattern_2 = ['/no/','/reason/'];
$replacement_2 = ['why','?'];
var_dump(preg_replace($pattern_2,$replacement_2,$arr)); //array(2) { [0]=> string(22) "lily likes apple,why ?" [1]=> string(22) "Tom hates orange,why ?" }
*//*** 搜索與替換* preg_filter()* 與preg_replace()功能相似* preg_filter()只返回執行替換的元素(替換后的)(沒執行替換的不返回)* 而preg_replace()返回全部元素(替換后的)(替沒替換都返回)*//*** 分割* preg_split* 通過一個正則表達式分割字符串* array preg_split($pattern $subject[,$limit=-1 [,$flag=0]])* $patern 用于搜索的模式(規則)* $subject 輸入字符串* $limit 如果指定,就將限制分隔得到的子串最多只有limit個,返回的最后一個子串將包含所有剩余部分 limit為-1,0,null時都代表不限制*/
//示例://$subject = "I LIKE APPLE,AND YOU";
//$patern = '/[\s,]+/';
//var_dump(preg_split($patern,$subject));/*array(5) {[0]=>string(1) "I"[1]=>string(4) "LIKE"[2]=>string(5) "APPLE"[3]=>string(3) "AND"[4]=>string(3) "YOU"
}*//*** 轉義* preg_quote()* 函數轉義正則表達式* preg_quote($str [,$delimiter])* $str 函數會向字符串中的每一個特殊字符前增加一個反斜線* 如果指定了$delimiter,則在指定的$delimiter前也加反斜線* 正則表達式特殊字符包括 . \ + * ? [ ? ] $ ( ) { } = ! < > | : -*/
//示例:
/*
$keywords = "$40 for \a g3/400*10/x";
$keywords = preg_quote($keywords,'x');
echo $keywords; //\$40 for \\a g3/400\*10/\x
*//*** 異常處理* php自帶的Exception異常類*//*error_reporting(0);//設置錯誤級別為0,不報錯
function theDatabaseObj() {$mysql = mysqli_connect('127.0.0.1','root2','root');if($mysql){return $mysql;}else{throw new Exception("could't connect to the database,try again");}}function db(){try{$db = theDatabaseObj();var_dump($db);}catch (Exception $e){echo $e->getMessage();
// echo $e->getCode();
// echo $e->getLine();}
}db();*//*** 創建自己的異常類**/
/*class aException extends Exception
{function aEX(){return "This is the bad way";}
}
class aaa {function a(){if (2 < 1) {echo "wrong";} else {throw new aException('你錯了,太笨了le');}}function b(){try{$b = $this->a();var_dump($b);}catch (Exception $E) {echo $E->getMessage();}}
}$obj = new aaa();
$obj->b();*///實現的功能,調用exception異常處理
/*
function aaa()
{if($_GET['name'] == 'xiaobudiu') {return "尊貴的管理員,請登錄";} else {throw new Exception('你沒有權限登錄');}
}function upload() {try {$upload = aaa();var_dump($upload);} catch (Exception $e) {echo $e->getMessage();}
}
upload();*//**.* php7中的錯誤處理* 大多數錯誤開始被當做Error異常拋出,而不是Exception異常* catch($Error $e)*/
/*try {$a = new zoo();
} catch (Error $E) {echo "error_msg:".$E->getMessage();
}*/
//error_msg:Class 'zoo' not found
//注:這種Error異常處理方式只適用于php7,php5版本還是要用Exception異常類來處理錯誤及異常#-------------------------------- 圖像處理 -------------------------------------
/*** 圖像處理* 圖像處理要求GD庫*/
//使用函數查看一下當前安裝沒有GD庫
//echo "<pre>";
//var_dump(get_loaded_extensions());/*** 取得圖像大小* getimagesize()* 返回圖像的尺寸以及文件類型*/
//print_r(getimagesize('./Upload/IGS09651F94M.jpg'));/*瀏覽器結果
Array
([0] => 740 //寬度像素值[1] => 1166 //高度像素值[2] => 2 //圖像標記,gif是1,jpg是2,png是3,swf是4,psd是5....[3] => width="740" height="1166" //文本字符串[bits] => 8 //每種顏色的位數[channels] => 3 //RGB圖像是3,CMVK圖像是4[mime] => image/jpeg
)*//*** getimagesizefromstring()* 從字符串中獲取圖像尺寸信息* 與getimagesize()函數的參數和返回結果相同,區別是getimagesizefromstring()的第一個參數是圖像數據的字符串表達,而不是文件名*/
//$img = file_get_contents('./Upload/IGS09651F94M.jpg');
//var_dump(getimagesizefromstring($img));/*瀏覽器結果:array(7) {[0]=>int(740)[1]=>int(1166)[2]=>int(2)[3]=>string(25) "width="740" height="1166""["bits"]=>int(8)["channels"]=>int(3)["mime"]=>string(10) "image/jpeg"
}*//*** imagesx,imagesy* 取得圖像的寬度和高度*/
/*$img = imagecreatetruecolor(300,200);
echo imagesx($img);//300
echo imagesy($img);//200*//*** 圖像繪制* imagecreate(),可創建一個基于調色板的圖像* 與imagecreateturecolor()作用和參數相同* 返回一個圖像標識符,代表了一幅大小為x_size和y_size的空白圖像* 1.創建畫布* 2.在畫布上繪制圖形* 3.保存并輸出結果圖像* 4.銷毀圖像資源*//*
//創建一個空白畫布,并輸出一個png格式的圖片
header("Content-type:image/png");//設置mime類型
$image = @imagecreate(120,30) or die("Cannot Initialize new GD image stream"); //創建畫布$background_color = imagecolorallocate($image,255,255,0);//定義顏色imagepng($image);//輸出png格式圖像imagedestroy($image);//銷毀圖像資源,釋放內存
*//*** 定義顏色* imagecolorallocate()* 給圖像的邊框背景和文字等元素指定顏色* 返回一個標識符,代表由給定的RGB成分組成的顏色* 與imagecolorallocate()功能相似的第一個函數是imagecolorallocatealpha(),區別在于后者多了一個透明度參數0-127 127表示完全透明*//*** 繪制橢圓* imageellipse()*/
//新建一個空白的圖像
/*
$image = imagecreatetruecolor(400,300);
//填充背景色
$bg = imagecolorallocate($image,255,255,255);
//選擇橢圓的顏色
$col_ellipse = imagecolorallocate($image,55,55,255);
//畫一個橢圓
imageellipse($image,200,150,300,200,$col_ellipse);
//輸出圖像
header("Content-type:image/png");
imagepng($image);
*//*** 將文字寫入圖像* imagefttext()*///echo "<img src=code.php>";//生成圖片#--------------------------------- 目錄文件操作 --------------------------------------
/*** 判斷文件類型* filetype()* 返回文件的類型.可能值有fifo,char,dir,block,link,file和unknown,出錯返回false*/
//echo filetype('code.php');//file
//echo filetype('./Public');//filedir/*** 判斷是否是一個目錄* is_dir()*/
//var_dump(is_dir('Upload'));//bool(true)
//var_dump(is_dir('index.php'));//bool(false)
//var_dump(is_dir('Upload/aa.jpg'));//bool(false)/*** 創建目錄* mkdir()* 創建成功返回true recursive值為true時,表示允許遞歸創建目錄*/
/*/
error_reporting(0);
function mkd($name)
{if (file_exists($name)) {echo "file already exists";} else {try {mkdir($name,0777,true);echo "創建成功";} catch (Exception $e) {throw new Exception('創建目錄失敗,請核查后重試');}}
}
mkd('./aa/bb');
*//*** 刪除目錄* rmdir* 嘗試刪除dir所指定的目錄.該目錄必須為空,并且要擁有相應權限*/
/*
error_reporting(0);
$dir = './aa/bb';
if (rmdir($dir)) {echo "Remove Dir Successfuly";
} else {die('failes to delete folders...');
}
// 注:只能刪除一個文件夾,例如$dir中的'./aa/bb',就只刪除了一個bb文件夾,aa仍在
*//*** scandir* 列出指定路徑中的文件和目錄* 第二個參數shorting可選,設為1,即按字母降序,默認升序**/
//$dir = './';
//$dir1 = scandir($dir,1);
//var_dump($dir1);
/*
array(16) {[0]=>string(9) "test.html"[1]=>string(11) "option.html"[2]=>string(11) "indexx.html"[3]=>string(9) "index.php"[4]=>string(5) "index"[5]=>string(11) "favicon.ico"[6]=>string(8) "code.php"[7]=>string(2) "aa"[8]=>string(6) "Upload"[9]=>string(6) "Public"[10]=>string(5) "2.css"[11]=>string(5) "1.php"[12]=>string(5) "1.css"[13]=>string(5) ".idea"[14]=>string(2) ".."[15]=>string(1) "."
}*//*** dirname()* 返回路徑中的目錄部分*/
//echo dirname('./Public/favicon.ico'); // ./Public/*** 查看磁盤空間* disk_free_space(); 返回磁盤分區可用字節數* disk_total_space();返回磁盤分區總容量*///echo disk_total_space('/');//191392714752/*** 打開文件* fopen()* 有參數r,r+,w,w+,a,a+,x,x+,c,c+*//*** 讀取文件* fgets()* 第一個參數表示資源* 第二個參數表示讀取多少字節,默認1kb(1024字節)*/
/*
$file = fopen("code.php", "r");
//輸出文本中所有的行,直到文件結束為止。
//feof() 函數檢測是否已到達文件末尾 (eof)。
//如果文件指針到了 EOF 或者出錯時則返回 TRUE,否則返回一個錯誤(包括 socket 超時),其它情況則返回 FALSE
while(! feof($file))
{echo fgets($file). "<br />";
}fclose($file);
*/
/*
//要求:讀取code.php中所有行數內容
//打開文件
$file = fopen('code.php',"r");
//讀取文件
while(!feof($file)){//只要不讀到末尾,就輸出本行echo fgets($file)."<br>";
}
fclose($file);
*//*** 獲取文件上次訪問的時間* fileatime()*/
/*
$file = 'code.php';
if(file_exists($file)){echo $file."上次訪問的時間是".date("Y-m-d H:i:s",fileatime($file));
}else{echo "您所訪問的文件不存在,請核查后重新操作";
}
//code.php上次訪問的時間是2018-01-08 00:17:28
*//*** 獲取文件上次被修改的時間* filemtime()*/
/*
$file = "code.php";
if(file_exists($file)) {echo $file."上次修改的時間為".date("Y-m-d H:i:s", filemtime($file));
} else {echo "您所訪問的文件不存在,請核查后重新操作";
}
//code.php上次修改的時間為2018-01-08 00:17:28
*//*** filesize()*獲取文件的大小* 返回文件大小的字節數*/
//echo filesize('./code.php');//1937/*** filetype()* 返回文件的類型*/
//echo filetype('./code.php');//file/*** stat()* 給出文件的詳細信息* 能返回上次訪問,上次修改,文件大小等各種信息*/
//var_dump(stat("./code.php"));
/*array(26) {[0]=>int(4)[1]=>int(0)[2]=>int(33206)[3]=>int(1)[4]=>int(0)[5]=>int(0)[6]=>int(4)[7]=>int(1937)[8]=>int(1515341848)[9]=>int(1515341848)[10]=>int(1515334800)[11]=>int(-1)[12]=>int(-1)["dev"]=>int(4)["ino"]=>int(0)["mode"]=>int(33206)["nlink"]=>int(1)["uid"]=>int(0)["gid"]=>int(0)["rdev"]=>int(4)["size"]=>int(1937)["atime"]=>int(1515341848)["mtime"]=>int(1515341848)["ctime"]=>int(1515334800)["blksize"]=>int(-1)*//*** 復制文件* copy()* 第一個參數是resource,第二個參數dist表示復制到哪里*/
/*
$file = './code.php';
$newfile = 'aa/code2.php';
if (copy($file,$newfile)) {echo "復制文件".$file."到".$newfile."成功";
} else {echo "復制文件".$file."失敗";
}
*//*** 刪除文件* unlink()*/
/*
$file = './aa/code2.php';
if(unlink($file)){echo "刪除文件".$file."成功";
}else{echo "刪除文件失敗";
}
*//***移動或重命名文件* rename()*/
/*
error_reporting(0);
if(rename('2.php','1.php')) {echo "文件重命名成功";
} else {echo "Rename Failed";
}
*//*** 文件指針* 可以實現文件指針的定位和 查詢,從而實現所需信息的快速查詢* rewind() 將文件位置指針設為文件流的開頭* fseek() 在文件指針中定位* ftell() 返回文件指針讀寫的位置*/
/*
$file = "./code.php";
$file = fopen($file,"r");
echo ftell($file);
*/#------------------------------ COOKIE 及 SESSION -------------------------------------
/*** COOKIE* 一種存儲在客戶端的數據,能存儲cookie的客戶端不只是瀏覽器,但絕大多數都是由瀏覽器來實現的* 瀏覽器通過HTTP協議和服務端進行Cookie交互* 在實現過程中,編程語言是通過指令通知瀏覽器,然后是瀏覽器實現設置Cookie的功能的* 讀取cookie則是通過瀏覽器請求服務端時攜帶的HTTP頭部中的Cookie信息得來的*//*** 設置cookie* setcookie()* 第一個參數name是必選參數,表示cookie名稱* 第二個參數可選,value表示值* 第三個參數可選,expire表示cookie的有效時間,以秒為單位,不設置此值,瀏覽器關閉,cookie隨之失效* 第四個參數可選,path,設置有效目錄,設置為'/'表示當前目錄下均可用,設置為'/aa'表示只有aa目錄下可用* 第五個參數可選,domain,設置cookie的作用域名,默認在本域名下有效,比如設置為example.com表示在example域名下的所有子域名都有效* 第六個參數可選,secure,用來設置是否對Cookie進行加密傳輸,默認false,如果設置為true,則只有使用https時候才會設置Cookie* 第七個參數為true表示只能通過HTTP協議才能訪問Cookie,意味著客戶端javascipt不可以操作這個cookie,使用此參數可減少xss攻擊的風險* 注:php和javascript都可以設置cookie,不同的是,php設置的cookie需要刷新頁面后的下一次請求中才有效,而javascript設置的cookie在本次請求中就有效*//*** cookie經常用來存儲一些不敏感的信息,如用來防止刷票,記錄用戶名,限制重復提交等* 示例:限制重復提交* 原理:當用戶第一次提交表單時,設置cookie有效時間1分鐘,當再次提交時,判斷cookie是否過期來限制用戶的提交*//*** Session設置* $_SESSION[key] = value* Session存儲在服務器,本質上和Cookie沒有區別,都是針對HTTP協議的局限性而提出的一種保持客戶端和服務端間會話狀態的機制.**/
//開啟session會話
/*
session_start();
//設置session
$_SESSION['name'] = 'xiaobudiu';
session_id();
var_dump($_SESSION);
echo "<hr>";
var_dump($_COOKIE);
*///var_dump(get_loaded_extensions());
/*** 使用Redis存儲Session* 對于大訪問量的網站來說,會有許多客戶端和服務端建立連接,就會生成許多session文件,由于session文件是存儲在硬盤上的,因此每次* 服務器去讀取這些session文件都要經過許多I/O操作.* PHP可以使用session_set_save_handle()函數自定義session保存函數(如打開,關閉,寫入,讀取等),如果想使用php內置的會話機制之外的方式,* 可以使用本函數.例如,可以自定義會話存儲函數來將會話數據存儲到數據庫.函數參數說明如下:**/#--------------------------- Mysql數據庫的使用 ------------------------------------
/*** 關系型數據庫,數據以表格的形式出現* 每行為各種記錄名稱* 每列為記錄名稱所對應的數據域,許多的行和列構成一張數據表,許多的表構成一個數據庫**//*** MYSQLi連接操作數據庫**/
/*** Mysqli執行插入數據操作**/
/*
$db = new mysqli('localhost','root','root','test');
$sql = "insert into `user` (`username`,`email`) VALUES (?,?)";
//定義參數
$username = "xiaobudiu";
$email = "xiaobudiu163@126.com";
//預處理
$sm = $db->prepare($sql);
//綁定參數
$sm->bind_param('ss',$username,$email);
//執行語句
if($sm->execute()) {echo "Insert Successfully";
}
$db->close();
*//***MYSQLi查詢數據*/
/*
$db = new mysqli('localhost','root','root','test');
$sql = "select * from user where uid<4";
$re = $db->query($sql);
echo "<pre>";
while($arr = $re->fetch_assoc()) {var_dump($arr);
}
//釋放查詢結果
$re->free();
//斷開數據庫連接
$db->close();
*/
/*array(3) {["uid"]=>string(1) "1"["username"]=>string(4) "kate"["email"]=>string(12) "kate@126.com"
}
array(3) {["uid"]=>string(1) "2"["username"]=>string(5) "admin"["email"]=>string(12) "admin@qq.com"
}
array(3) {["uid"]=>string(1) "3"["username"]=>string(4) "mary"["email"]=>string(14) "mary@itcast.cn"
}*//*** pdo連接操作mysql數據庫*/
/*
$dsn = 'mysql:dbname=test;host=127.0.0.1';
$user = 'root';
$pass = 'root';
try {$pdo = new PDO($dsn,$user,$pass);
// var_dump($pdo);
} catch (PDOException $e) {echo "Connection failed:".$e->getMessage();
}
*/
/*
//向數據表中插入數據
$dsn='mysql:dbname=test;host=127.0.0.1';
$user = 'root';
$pass = 'root';
//實例化pdo對象,連接數據庫
$pdo = new PDO($dsn,$user,$pass);
//向數據庫插入數據
$sql = "insert into user (`username`,`email`) VALUES ('xiaowangba','sandjdsa@163.com')";
$re = $pdo->exec($sql);
if ($re) {echo "向數據庫插入數據成功";
} else {var_dump($pdo->errorInfo());
}
*//*** 修改數據表數據*/
/*
$dsn='mysql:dbname=test;host=localhost';
$user = 'root';
$pass = 'root';
$pdo = new PDO($dsn,$user,$pass);
$sql = "update user set username='wangxiaoping' where uid=8";
if ($pdo->exec($sql)) {echo "修改數據成功";
} else {echo "<pre>";var_dump($pdo->errorInfo());
}
*//*** 刪除數據表中的數據**/
/*
$dsn='mysql:dbname=test;host=127.0.0.1';
$user = 'root';
$pass = 'root';
$pdo = new PDO($dsn,$user,$pass);
$sql = "delete from user where uid=7";
if ($pdo->exec($sql)) {echo "刪除數據成功";
} else {var_dump($pdo->errorInfo());
}
*//*** 查詢數據表*/
/**
$dsn='mysql:dbname=test;host=localhost';
$user = 'root';
$pass = 'root';
$pdo = new PDO($dsn,$user,$pass);
$sql = "select `username`,`email` from user where `uid` BETWEEN 2 AND 8";
//預處理
$re = $pdo->prepare($sql);
$re->execute();
$arrs = $re->fetchAll();
echo "<pre>";
var_dump($arrs);*/#------------------------------------------- PHP 與 Redis ------------------------------------------
/*** 關系型數據庫能滿足編程中一般的存儲查詢需求,隨著網站業務量的增加,我們還需要存儲許多數據,并且要求能夠很快的將數據查詢出來,這時,關系型數據庫mysql* 就會稍顯吃力.* 當網站用戶并發性非常高(高并發讀寫往往達到每秒上萬次請求)時,對于傳統關系型數據庫來說,硬盤I/O是一個很大的瓶頸,因為mysql的數據存儲是寫入磁盤上的.* 同時,網站每天產生的數據量是巨大的,對于關系型數據庫來說,在一張包含海量數據表中查詢效率也是非常低的* 針對關系型數據庫的不足,出現了很多NOSQL產品,這些數據庫中很大一部分都是針對某些特定應用需求出現的,對于該類應用具有極高性能,依據結構化方法以及應用* 場合不同,主要分為以下幾類:* 面向高性能并發讀寫的key-value數據庫,主要特點是具有極高的并發讀寫性能.Redis,TokyoCabinet,Flare是這類數據庫的代表* 面向海量數據訪問的面向文檔數據庫,這類數據庫的特點是可以在海量的數據中快速查詢數據,典型代表為MongoDB和CouchDB* 面向可擴展性的分布式數據庫,相對于傳統數據庫存在的可擴展性缺陷,這類數據庫可以適應數據量的增加以及數據結構的變化*//*** Redis是一個高級開源的key-value數據庫存儲系統.支持string,list,set,zset,hash 5種數據存儲類型,支持對數據的多種操作,能夠滿足絕大部分業務需求.* Redis中的數據都是緩存在內存中的,比讀取存儲在硬盤上的數據速度要快很多.* Redis支持數據的持久化操作,可通過配置,周期性的將內存中的數據寫入磁盤,提高了數據的安全性* Redis還支持主從同步,更好的解決了高并發的問題* Redis支持在Linux,Windows,MacOS系統中運行,但在實際應用場景中,推薦使用Linux系統.*//*** 在Linux系統使用Redis* http://redis.io/ 下載Redis安裝包* Redis采用"主版本號,次版本號,補丁版本號"的命名規則.次版本號的位置,偶數表示穩定版本,如1.2 2.0 ,奇數表示測試版本,如2.9代表測試版本,n那么3.0將會是2.9.x的穩定版本*這里建議lnamp或者lnmp一鍵安裝包* lnamp默認網站根目錄 /data/wwwroot/default/index.php*/#--------------------------------------- XML -----------------------------------------------
/*** 使用字符串生成xml**/
/*
header('Content-type:text/xml');
$xmlstr=<<<XML
<?xml version='1.0' standalone='yes'?>
<movies><movie><title>shanpaojincheng</title><content>Two shan pao jin cheng</content></movie><plot><name>演的不錯</name></plot>
</movies>
XML;
echo $xmlstr;
//注: <<<xml 作用:將"<<<xml"和最后的"xml"之間的內容轉換成字符串;
*/
/*
<movies><movie><title>shanpaojincheng</title><content>Two shan pao jin cheng</content></movie><plot><name>演的不錯</name></plot>
</movies>*//*** 使用數組循環遍歷生成xml* 與使用字符串生成xml相比,數組生成xml則不用寫那么多<>標簽,輕松很多**/
/*
header('Content-type:text/xml');
echo '<?xml version="1.0" ?>'."\n";
echo "<books>\n";
$books = [['bookname' =>'微信小程序開發實戰與應用實例','press'=>'清華大學出版社','publishtime'=>'2016-07'],['bookname'=>'一周微信公眾號開發入門到精通','press'=>'延安出版社','publishtime'=>'2017-5']
];
foreach ($books as $book) {echo " <book>\n";foreach ($book as $tag=>$value){echo " <$tag>".htmlspecialchars($value)."</$tag>\n";}echo " </book>\n";
}
echo "</books>";
*//*
<books><book><bookname>微信小程序開發實戰與應用實例</bookname><press>清華大學出版社</press><publishtime>2016-07</publishtime></book><book><bookname>一周微信公眾號開發入門到精通</bookname><press>延安出版社</press><publishtime>2017-5</publishtime></book>
</books>*//*** 通過PHP SimpleXML()解析xml,將字符串解析成對象,采用對象調用屬性的方式獲取值* SimpleXML()是用來處理XML最便捷的方案* 簡化了與xml的交互,可以把元素轉換成對象屬性,位于標簽之間的文本被指定給屬性* 如果同一個位置上有多個同名元素,n那么這些元素會被放在一個列表中.元素的屬性會被轉換成一個數組元素,其中* 數組的鍵是屬性名,鍵的值就是屬性值*/
//示例:
/*
$xmlstr=<<<XML
<?xml version="1.0" standalone='yes' ?>
<movies attr="qwe" ha="hahah屬性值"><movie a="shiyanshuxing"><title tt="tt屬性值">PHP從中階進階到大神</title><characters><character><name age="22 years old" country="china">lixiaoming</name><acter>onlivia actora</acter></character><character><name>Mr.coder</name><acter>xiaobudiu</acter></character></characters></movie>
</movies>
XML;
$xml = simplexml_load_string($xmlstr);
var_dump($xml);//將字符串變成xml對象
echo $xml->movie->title;
echo ":";
echo $xml->movie->characters->character[0]->name;
//獲取屬性值
echo $xml->movie->title['tt']
*/#---------------------------------------- json的使用 ----------------------------------------
/*** json_encode() 將數組轉換成json編碼數據* json_decode() 對json格式的字符串進行解碼* PHP作為一門服務端語言,常被用來寫服務端接口邏輯,向客戶端返回json格式的數據* 與xml相比,在很多語言中,json數據的處理都比xml數據的處理簡單得多,json數據和數組可以實現非常方便的轉換* 在包含同樣信息的情況下,json數據字節數要比xml少很多* json這種便捷性和簡潔性使其可以取代xml成為互聯網信息的規范數據格式*//*** json_encode() 將數組轉換成json編碼數據*/
/*
echo "連續數組";
$a = array('foo', 'zoo', 'xiaoming', 'xiaodong');
var_dump(json_encode($a));
//連續數組string(35) "["foo","zoo","xiaoming","xiaodong"]"echo "非連續數組";
$b = [1 => 'foo',2 => 'zoo',3 => 'XIAOMING',4 => 'XIAODONG'
];
var_dump(json_encode($b));
//非連續數組string(51) "{"1":"foo","2":"zoo","3":"XIAOMING","4":"XIAODONG"}"echo "刪除一個連續數組值的方式產生的非連續數組";
unset($a[1]);
var_dump(json_encode($a));
//刪除一個連續數組值的方式產生的非連續數組string(41) "{"0":"foo","2":"xiaoming","3":"xiaodong"}"echo "二維數組";
$arr = array(array('name'=>'xiaobudiu','age'=>25,'sex'=>'man'),array('name'=>'PGone','age'=>25,'sex'=>'woman')
);
var_dump(json_encode($arr));
//二維數組string(81) "[{"name":"xiaobudiu","age":25,"sex":"man"},{"name":"PGone","age":25,"sex":"woman"}]"
*//*** json_decode()* 將json格式的字符串解碼* 第二個參數可選,選擇為true表示 將json字符串解碼成數組* 第二個參數默認false,解碼成對象object*/
//$json = '{"0":"foo","2":"xiaoming","3":"xiaodong"}';
//var_dump(json_decode($json));
/*
object(stdClass)#1 (3) {
["0"]=>string(3) "foo"
["2"]=>string(8) "xiaoming"
["3"]=>string(8) "xiaodong"
}
*/
//var_dump(json_decode($json,true));
/*array(3) {[0]=>string(3) "foo"[2]=>string(8) "xiaoming"[3]=>string(8) "xiaodong"
}
*/#------------------------------------ MVC與ThinkPHP框架 ---------------------------------------------
/*** mvc 一種軟件設計典范,用業務邏輯/數據/界面顯示分離 的方法組織代碼,將業務邏輯聚集到一個頁面里面,使得各部分的代碼做各自的事情,* 各個人員編寫的代碼負責特定的功能,降低了耦合度* 由mvc架構系統的程序執行流程:* controller截獲用戶發出的請求,調用model完成狀態的讀寫操作* controller把數據傳給view,view渲染最終效果并呈現給用戶.* 另外,php經常用來寫一些接口程序,提供接口返回特定格式的數據(一般是json),不同的客戶端(網頁前端,桌面客戶端,手機客戶端等)可通過調用接口* 獲得數據.*//*** 常用的php開源框架* ThinkPHP tp是為了簡化企業級應用開發和敏捷Web應用開發而誕生.* Yii 用于開發大型web應用.基于組件的高性能php框架通過一個簡單的命令行工具yiic可以快速創建一個web應用程序的代碼框架.* CI 組件的導入和函數的執行只有在被要求執行的時候才執行,而不是在全局范圍,因此默認的系統非常輕量級,為了達到最大的用途,每個類和它的功能都是高度自治的.* Laravel 一套簡潔,優雅的php web開發框架* Yaf (yet another framework) 提供了bootstrap,路由,分發,視圖,插件 ,是一個全功能的php框架*//*** tp5支持使用composer安裝**/#---------------------------------- 設計模式 --------------------------------------------
/*** 分為3大類:創建型模式,結構型模式,行為型模式,還有一種J2EE設計模式,共23種設計模式(設計模式-可復用的面向對象軟件元素)* 工廠模式以及單例模式屬于創建型模式.* 創建型模式的描述:這些設計模式提供了一種在創建對象的同時,隱藏創建邏輯的方式,而不是使用新的運算符直接實例化對象.* 這使得程序在判斷針對某個給定實例需要創建哪些對象時更加靈活*/
/*** 工廠模式* 工廠模式屬于創建型模式,提供了一種創建對象的方式.* 工廠模式是先定義一個創建對象的接口,讓其子類自己決定實例化哪一個工廠類.* 工廠模式的精髓就是可以根據不同的參數生成不同的類實例*/
//示例:加減乘除工廠類實例
//定義接口
/*
interface Calc
{public function getValue($num1,$num2);
}//創建實現接口的實體類
class Add implements Calc
{public function getValue($num1, $num2){return $num1+$num2;}
}class Sub implements Calc
{public function getValue($num1, $num2){return $num1 - $num2;}
}class Mul implements Calc
{public function getValue($num1, $num2){return $num1 * $num2;}
}class Div implements Calc
{public function getValue($num1, $num2){try {if ($num2 == 0){throw new Exception('除數不能為0');} else {return $num1 / $num2;}} catch (Exception $e) {echo "錯誤信息:".$e->getMessage();}}
}
// 創建一個工廠,生成基于給定信息的實體類的對象
class Factory
{public static function createObj($operate){switch ($operate) {case '+':return new Add();break;case '-':return new Sub();break;case '*':return new Mul();break;case '/':return new Div();break;}}
}$test=Factory::createObj('-');
echo $test->getValue(1,4);
//注:其實想實現本功能,定義一個類,一個公共方法,方法里采用switch也可以實現本功能,但為了代碼的可讀性以及代碼的執行效率,所以采用工廠類;
//注;這樣,我們就實現了根據用戶輸入的操作符實例化相應的對象,進而完成接下來相應的操作.在軟件開發中,php可能要鏈接mysql,也可能鏈接sqlserver.
//或者其他數據庫,這樣我們就可以定義一個工廠類,動態生成不同的數據庫連接對象;
//再比如設計一個連接服務器的框架,需要三個協議,即pop3,imap,http,可以把這三個作為產品類,共同實現一個接口.工廠模式使用場景很多,需要在實
//際開發中嘗試1應用
*//*** 單例模式* 單例模式涉及一個單一的類,該類負責創建自己的對象,同時確保只有單個對象被創建* 單例模式主要解決一個全局使用的類被頻繁創建與銷毀的問題* 由于只創建了一個類的實例,因此減少了內存的開銷,節省了系統資源* php中,單例模式經常被用在數據庫應用中.*/
//代碼示例:
/*
class Student
{//私有的靜態屬性, 作用是為了存儲對象的.private static $_instance=null;//私有的構造方法,保證不允許在類外 newprivate function __construct(){}//私有的克隆方法, 保證不允許在類外 通過 clone 來創建新對象private function __clone(){}//公有的靜態方法, 作用,就是用來實例化對象public static function getInstance(){//將創建的新對象存儲到靜態屬性中//判斷靜態屬性中是否為空if (is_null(self::$_instance)) {//如果為空,則創建新對象,并將新存儲賦給靜態屬性$instanceself::$_instance = new self;}//如果$instance不為空,則直接將對象返回return self::$_instance;}
}
//調用靜態方法來創建對象
$obj = Student::getInstance();
$obj2 = Student::getInstance();//此行不再創建新對象
//var_dump($obj);
//var_dump($obj2);
*//*** 觀察者模式* 一種事件系統.有兩個類,a類和b類,a類允許b類觀察,獲取a類的狀態,當a類狀態發生改變的時候,b類可以收到通知,并作出相應的動作* 觀察者模式提供了避免組件之間緊密耦合的另一種方法* 比如要實現用戶注冊后發送郵件通知管理員和用戶自己填寫的郵箱的功能,我們可以將發送郵件給管理員和用戶自己都寫在這個實現用戶注冊* 的類里(使用觀察者實現),這樣,即使在以后更改了用戶注冊邏輯也不會影響到發送郵件的功能實現* 再比如當用戶下單購買一件商品時,我們需要將購買記錄寫入文本日志,數據庫日志,還要發送短信,送抵兌換券積分等,我們可以在主體類中實* 現下單購買的流程并定義一個觀察者接口,當用戶下單后通知各個觀察者對象執行自己的業務邏輯.*///示例1
//觀察者模式設計兩個類
//男人類和女人類
//男人類對象 xiaoming 女人類對象 xiaohua mother
/*
class man
{//定義數組屬性,用于存放觀察者對象protected $observers=[];//將傳進來的觀察者對象存入觀察者數組中的方法function addObserver($observer){$this->observers[]=$observer;}//刪除觀察者的方法function delObserver($observer){//查找觀察者在數組中的鍵值$key=array_search($observer,$this->observers);//根據鍵值刪除對應觀察者unset($this->observers[$key]);}//男人buy()方法function buy(){foreach ($this->observers as $girl) {//當被觀察者作出buy()這個行為時,讓觀察者得到通知,并作出相應的反應$girl->dongjie();}}
}class woman
{function dongjie(){echo "你的兒子或者男朋友正在花錢<br>";}
}
//創建被觀察著對象
$xiaoming = new man();
//創建觀察者對象
$xiaohua = new woman();
$mother = new woman();
//為xiaoming添加觀察者
$xiaoming->addObserver($mother);
$xiaoming->addObserver($xiaohua);
//$xiaoming->delObserver($xiaohua);
//xiaomign執行buy()之后,看觀察者xiaohua和mother是否能得到通知,并作出相應反應
$xiaoming->buy();
*///示例2:
/*** 場景描述:* 哈票以購票為核心業務(此模式不限于該業務),但圍繞購票會產生不同的其他邏輯,如:* 1、購票后記錄文本日志* 2、購票后記錄數據庫日志* 3、購票后發送短信* 4、購票送抵扣卷、兌換卷、積分* 5、其他各類活動等** 傳統解決方案:* 在購票邏輯等類內部增加相關代碼,完成各種邏輯。** 存在問題:* 1、一旦某個業務邏輯發生改變,如購票業務中增加其他業務邏輯,需要修改購票核心文件、甚至購票流程。* 2、日積月累后,文件冗長,導致后續維護困難。** 存在問題原因主要是程序的"緊密耦合",使用觀察者模式將目前的業務邏輯優化成"松耦合",達到易維護、易修改的目的,* 同時也符合面向接口編程的思想。** 觀察者模式典型實現方式:* 1、定義2個接口:觀察者(通知)接口、被觀察者(主題)接口* 2、定義2個類,觀察者對象實現觀察者接口、主題類實現被觀者接口* 3、主題類注冊自己需要通知的觀察者* 4、主題類某個業務邏輯發生時通知觀察者對象,每個觀察者執行自己的業務邏輯。*/#--------------------------------- 定義觀察者、被觀察者接口 -----------------------------
/*
//觀察者接口(通知接口)
interface guancha
{function onBuyTicketOver($sender, $args); //得到通知后調用的方法
}//被觀察者接口(主題接口)
interface beiguancha
{function addObserver($observer); //提供添加觀察者的方法
}/主題類實現/////主題類(購票)實現主題接口(被觀察者)
class buyPiao implements beiguancha
{private $_observers = []; //數組存放觀察者對象public function buyTicket($ticket) //購票核心類,處理購票流程{//購票邏輯//循環通知,調用其onBuyTicketOver實現不同業務邏輯foreach ($this->_observers as $obs) {$obs->onBuyTicketOver ($this, $ticket); //$this 可用來獲取主題類句柄,在通知中使用}}//添加通知public function addObserver($observer) //添加N個通知{$this->_observers [] = $observer;}
}#--------------------------------------- 定義多個通知 ------------------------------------//短信日志通知
class HipiaoMSM implements guancha
{public function onBuyTicketOver($sender, $ticket){echo (date ( 'Y-m-d H:i:s' ) . " 短信日志記錄:購票成功:$ticket<br>");}
}
//文本日志通知
class HipiaoTxt implements guancha
{public function onBuyTicketOver($sender, $ticket){echo (date ( 'Y-m-d H:i:s' ) . " 文本日志記錄:購票成功:$ticket<br>");}
}
//抵扣卷贈送通知
class HipiaoDiKou implements guancha
{public function onBuyTicketOver($sender, $ticket){echo (date ( 'Y-m-d H:i:s' ) . " 贈送抵扣卷:購票成功:$ticket 贈送10元抵扣卷1張。<br>");}
}#------------------ 用戶購票 ------------------
$buy = new buyPiao();
$buy->addObserver ( new HipiaoMSM () ); //根據不同業務邏輯加入各種通知
$buy->addObserver ( new HipiaoTxt () );
$buy->addObserver ( new HipiaoDiKou () );
//購票
$buy->buyTicket ( "一排一號" );
*//*** 策略模式* 與工廠模式實現的功能相似,區別是工廠模式關注的是對象的創建,提供創建對象的接口,是創建型的設計接口,接收指令,創建出符合要求的實例* 策略模式是行為型的設計模式,接受已經創建好的實例,實現不同的行為**/#------------------------------------------- 開始進入API的世界 ------------------------------------------------
/*** 隨著移動網絡的發展,多終端的出現,為了降低服務端的工作量,和以后的維護量,我們希望開發一套可適用于多個終端的接口.* 面向接口編程要求我們將定義和實現分開,盡可能編寫粒度更細的接口,降低各個接口之間的依賴度,這些接口通過一定的組合能夠對外提供一套系統服務**/#---------------------- 傳輸消息加解密 --------------------------
/*** 單向散列加密* 常用的單向散列加密:MD5,SHA等* 單向加密是對不同輸入長度的信息進行散列計算,得到固定長度的散列計算值.輸入信息的任何微小變化都會導致散列的很大不同,并且這種計算是不可逆的* 即無法根據散列值獲得明文信息.這種單向散列加密可用于用戶密碼的保存.即不將用戶輸入的密碼直接保存到數據庫,而是對密碼進行單向散列加密.將密文* 存入數據庫,用戶登陸時進行密碼驗證,同樣對輸入的密碼進行散列加密,與數據庫中密碼的密文進行對比,若一致,則驗證通過* 雖然不能通過算法從散列密文解出明文,但是由于人們設置的密碼具有一定的模式(比如使用生日或名字作為密碼),因此通過彩虹表(密碼和對應的密文關系表)* 等手段都可以猜測式的1破解.為了增加單向散列被破解的難度,還可以給散列算法加鹽值(salt),salt相當于加密時的鑰匙,增加破解時的難度*//*** 對稱加密* 對稱加密是指加密和解密使用的是同一個秘鑰.對稱加密類似接口簽名驗證,將明文和密鑰按照一定的算法進行加密,同樣使用密鑰和一定的算法對密文進行解密* 獲得明文.* PHP提供了一個MCRYPT擴展,可用于對稱加密.* 注:php7開始,已經對mcrypt加密方式進行刪除,官方不推薦此方式了.**/
/*** mycrpt加密需要以下幾個步驟:**/
//示例1/*
$str = "我的名字是?一般人我不告訴他!"; //加密內容
$key = "key25111"; //密鑰
$cipher = MCRYPT_DES; //密碼類型
$modes = MCRYPT_MODE_ECB; //密碼模式
$iv = mcrypt_create_iv(mcrypt_get_iv_size($cipher, $modes), MCRYPT_RAND);//初始化向量
echo "加密明文:".$str."<p>";
$str_encrypt = mcrypt_encrypt($cipher, $key, $str, $modes, $iv); //加密函數
echo "加密密文:".$str_encrypt." <p>";
$str_decrypt = mcrypt_decrypt($cipher, $key, $str_encrypt, $modes,$iv); //解密函數
echo "還原:".$str_decrypt;
*//***非對稱加密* RSA是目前最有影響力的公鑰加密算法*與對稱加密不同的是,非對稱加密和解密使用的是不同的密鑰,其中一個對外公開作為公鑰,另一個只有私有者私有,成為私鑰.用私鑰加密的*信息只有公鑰能夠解開,反之用公鑰加密的信息只有私鑰能夠解開.*常用的非對稱加密有RSA算法*RSA算法基于一個非常簡單的數論事實,將兩個大質數相乘十分容易,但是想要對其乘積進行因式分解卻極其困難,因此可以將乘積公開作為加密密鑰*PHP中,提供基于RSA算法的openssl擴展可實現對數據的非對稱加密*/#------------------------------- 使用ajax進行交互 ----------------------------------
/*** 把網頁看成客戶端,服務端以提供接口的形式向客戶端提供數據的增刪改查服務.* 在網頁開發中,經常使用ajax技術實現客戶端與服務端的數據交互* ajax是一種在無須重新加載整個網頁的情況下能夠更新部分網頁的技術.* ajax通過在后臺與服務器進行少量的數據交換可以使網頁實現異步更新.*///檢測用戶名是否可用
//假設用戶名為zhangsan和lisi已經被使用了
/***html代碼
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>檢測用戶名是否被使用</title>
</head>
<body>
用戶名:<input type="text" name="name" id="name"><span id="span"></span>
</body>
<!--實現的功能是:當用戶輸入完用戶名,失去焦點時,自動檢測是否被使用了-->
<script>//獲取input元素var input = document.getElementById('name');//給其綁定失去焦點事件input.οnblur = function () {//創建xhr對象xhr = new XMLHttpRequest();//獲取用戶輸入的用戶名var name = this.value;//狀態確認后才接收數據xhr.onreadystatechange = function () {if (xhr.readyState == 4 && xhr.status == 200) {if (xhr.responseText == 1) {document.getElementById('span').innerHTML = "<font color='red'>baoqian,您輸入的用戶名已經有人注冊</font>"} else {document.getElementById('span').innerHTML = "<font color='#7fffd4'>gongxi,可以注冊此用戶名</font>"}}}//設置請求xhr.open('get','index.php?name='+name,true);//發送請求xhr.send();}
</script>
</html>*/
/***php代碼*/
/*
$name = $_GET['name'];
if ($name == 'zhangsan') {echo 1;
} else {echo 2;
}
*/