PHP基礎

<?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 (2){
    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) {
        $arr[$n] = compute($n - 1) + compute($n - 2);
        return $arr[$n];
    }else{
        return 1;
    }
}
echo compute(5);
*/
 
 
/**
 * 迭代思想
 * 利用變量的原值推算出變量的一個新值
 */
/*
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 str_replace_limit($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 str_replace_limit('cc','c',$str,2);
echo '<hr>';
*/
//瀏覽器顯示:abcddefcggcccg(前兩個cc都被替換了,最後一個ccc沒有被替換)
 
 
/**
 * 截取字符串
 * substr
 */
/*
$str = "abcdefghijklmn";
echo substr($str,-4,2);//kl
*/
 
 
/*
 * 計算字符串長度
 * str_len
 */
/*
$str = "abcdefghijklmn我";
echo strlen($str);//17 (中文3個字符,英文1個字符)
*/
 
 
/**
 * 轉義和還原字符串
 * 轉義: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 步進值
 */
/*
$arr = range('0','9',2);
var_dump($arr); //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()
 */
/*
$arr = [
    'beijing',
    'shanghai',
    'hangzhou',
    'shenzhen'
];
$arr = implode('-',$arr);
echo $arr; // beijing-shanghai-hangzhou-shenzhen
*/
 
 
 
/**
 * 計算數組中的單元數目
 * count()
 * 第二個參數可選,默認0,識別不了無限遞歸,1:能夠識別無限遞歸
 * 此例中,輸出的count就是6
 */
/*
$arr = [
    'beijing',
    'shanghai'=>[
        'pudong',
        'jiaoda'
    ],
    'hangzhou',
    'shenzhen'
];
echo count($arr);//4
echo "<hr>";
echo count($arr,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'
];
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,array('hangzhou','shanghai','beijing'));
print_r($arr);
*/
 
/*
 * 瀏覽器顯示
 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
 * 注:返回隨機條目的一個或多個鍵
 */
/*
$arr = [
    '0' => 'blue',
    '2' => 'red',
    '3' => 'green',
    '4' => 'color'
];
$arrs = array_rand($arr,3);
var_dump($arrs);
*/
 
 
 
 
/**
 * 數組排序與打亂數組
 * sort(),asort() shuffle()
 */
/*
$arr = range('a','z');
shuffle($arr);
foreach($arr as $k=>$v){
    echo $v;
    echo " ";
}
*/
 
 
 
/**
 * 遍歷數組
 * for,foreach(),each() list()
 */
/*
$arrs=['beijing','shanghai','guangzhou','hangzhou','shenzhen'];
$arrss=['haerbin','zhengzhou'=>'henan','nanjing'];
//for循環寫法
for($i = 0; $i < count($arrs); $i++){
    echo $arrs[$i];
    echo '<br>';
}
echo "<hr>";
//foreach寫法
foreach($arrss as &$v){
    echo $v;
    echo ' ';
}
*/
 
 
 
/**
 * list() 將數組的值分給賦給變量
 *
 */
/*
$arrs=['beijing','shanghai','guangzhou','hangzhou','shenzhen'];
list($a[1], $a[2], $a[3]) = $arrs;
var_dump($a);
*/
 
 
/**
 *數組的拆分,拆分紅幾組,每組幾個元素
 * array_chunk()
 */
/*
$arrs = ['beijing','shanghai','guangzhou','hangzhou','shenzhen'];
$arrs = array_chunk($arrs,2,true);
var_dump($arrs);
*/
 
//瀏覽器顯示
/**
array(3) {
    [0]=>
        array(2) {
        [0]=>
        string(7) "beijing"
        [1]=>
        string(8) "shanghai"
        }
    [1]=>
        array(2) {
        [2]=>
        string(9) "guangzhou"
        [3]=>
        string(8) "hangzhou"
        }
    [2]=>
        array(1) {
        [4]=>
        string(8) "shenzhen"
    }
}
 */
 
 
 
/**
 * 合併數組
 * array_merge()
 */
/*
$arrs=['beijing','shanghai','guangzhou','hangzhou','shenzhen'];
$arrss=['haerbin','zhengzhou'=>'henan','nanjing','hangzhou'];
$arr = array_merge($arrs,$arrss);
var_dump($arr);
*/
 
 
 
/**
 *增長刪除數組中的元素
 *array_shift() 可在數組開頭插入一個1或多個單元
 *array_unshift() 可將數組開頭的單元移除數組
 * array_push()   用來將一個或多個單元壓入數組的末尾(入棧)
 * array_pop()    可將數組的最後一個單元彈出(出棧)
 */
 
 
 
/**
 * 從數組中取出一段
 * array_slice()  字符串 substr
 */
/*
$arrs = ['beijing','shanghai','guangzhou','hangzhou','shenzhen'];
var_dump(array_slice($arrs,2,3,true));
//array(3) { [2]=> string(9) "guangzhou" [3]=> string(8) "hangzhou" [4]=> string(8) "shenzhen" }
*/
 
 
 
/**
 * 把數組中的一部分去掉,並用其餘值取代
 * array_splice()
 */
/*
$arrss = ['haerbin','zhengzhou'=>'henan','nanjing','hangzhou'];
array_splice($arrss,1,2,'code');
var_dump($arrss); //array(3) { [0]=> string(7) "haerbin" [1]=> string(4) "code" [2]=> string(8) "hangzhou" }
*/
/*
$arrss = ['haerbin','zhengzhou'=>'henan','nanjing','hangzhou'];
$arr3 = [3,6,9,12,13,1,21,22,4,23];
array_splice($arrss,2);
var_dump($arrss); //array(2) { [0]=> string(7) "haerbin" ["zhengzhou"]=> string(5) "henan" }
echo array_sum($arr3);//得到數組內全部數的總和
*/
 
 
/**
 * 系統預約義數組 $_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';
var_dump($_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 upfiles(){
//    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'])){
//            $upfile = $_FILES['file'];
//            //獲取數組裏的值
//            $name = $upfile['name'];
//            $tmp_name = $upfile['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:移動文件失敗,請確認文件名全爲英文";
//            }
//
//        }
//    }
//
//}
//upfiles();
//var_dump(__FILE__);
//var_dump(dirname(__FILE__));
 
 
/**
 * Class myclass
 * 靜態屬性(類屬性)
 * 類內用self調用,類外使用類名調用
 */
/*
class myclass {
    static $staticVal = 10;
    function getStatic(){
        echo self::$staticVal;
        echo "<hr>";
        self::$staticVal++;
    }
}
echo myclass::$staticVal;//10
echo "<hr>";
$a = new myclass();
var_dump($a->getStatic());//null
*/
 
 
 
/**
 * 靜態方法(類方法)
 *
 */
//class myclass{
//    static $staticVal = 10;
//    public $val = 100;
//
//    /**
//     * 獲取類屬性(靜態屬性 $staticVal)
//     */
//    static function getStaticVal(){
//        echo self::$staticVal;
//    }
//
//
//    /**
//     * 類內調用類屬性,並對類屬性進行改變
//     */
//    static function changeStaicVal(){
//        self::$staticVal++;
//        echo self::$staticVal;
//
//    }
//
//
//}
//
//myclass::getStaticVal();//10
//myclass::changeStaicVal();//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或proteced修飾的屬性或訪問一個類中本來不存在的屬性時被調用
 */
 
 
/**
 * __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 exist
   sarray(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")){
        require_once $name.'php';
    }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();
//和通常的方法不一樣的是,這個方法沒有大括號
//你不能建立這個抽象類的實例:$Shape_Rect = new Shape();
}
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 = array(
    array(
        'bookname'=>'微信小程序開發實戰與應用實例',
        'press'=>'清華大學出版社',
        'publishtime'=>'2016-07'
    ),
    array(
        '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 = array(
    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 creatObj($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::creatObj('-');
echo $test->getValue(1,4);
//注:其實想實現本功能,定義一個類,一個公共方法,方法裏採用switch也能夠實現本功能,但爲了代碼的可讀性以及代碼的執行效率,因此採用工廠類;
//注;這樣,咱們就實現了根據用戶輸入的操做符實例化相應的對象,進而完成接下來相應的操做.在軟件開發中,php可能要連接mysql,也可能連接sqlserver.
//或者其餘數據庫,這樣咱們就能夠定義一個工廠類,動態生成不一樣的數據庫鏈接對象;
//再好比設計一個鏈接服務器的框架,須要三個協議,即pop3,imap,http,能夠把這三個做爲產品類,共同實現一個接口.工廠模式使用場景不少,須要在實
//際開發中嘗試1應用
*/
 
/**
 * 單例模式
 * 單例模式涉及一個單一的類,該類負責建立本身的對象,同時確保只有單個對象被建立
 * 單例模式主要解決一個全局使用的類被頻繁建立與銷燬的問題
 * 因爲只建立了一個類的實例,所以減小了內存的開銷,節省了系統資源
 * php中,單例模式常常被用在數據庫應用中.
 */
//代碼示例:
/*
class Student{
    //私有的靜態屬性, 做用是爲了存儲對象的.
    private static $_instance=null;
    //私有的構造方法,保證不容許在類外 new
    private function __construct(){}
    //私有的克隆方法, 保證不容許在類外 經過 clone 來建立新對象
    private function __clone(){}
    //公有的靜態方法, 做用,就是用來實例化對象
    public static function getIntance(){
        //將建立的新對象存儲到靜態屬性中
        //判斷靜態屬性中是否爲空
        if(is_null(self::$_instance)){
            //若是爲空,則建立新對象,並將新存儲賦給靜態屬性$instance
            self::$_instance = new self;
        }
        //若是$instance不爲空,則直接將對象返回
        return self::$_instance;
    }
}
//調用靜態方法來建立對象
$obj = Student::getIntance();
$obj2 = Student::getIntance();//此行再也不建立新對象
//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:
/**
 * 場景描述:
 * 哈票以購票爲核心業務(此模式不限於該業務),但圍繞購票會產生不一樣的其餘邏輯,如:
 * 一、購票後記錄文本日誌
 * 二、購票後記錄數據庫日誌
 * 三、購票後發送短信
 * 四、購票送抵扣卷、兌換卷、積分
 * 五、其餘各種活動等
 *
 * 傳統解決方案:
 * 在購票邏輯等類內部增長相關代碼,完成各類邏輯。
 *
 * 存在問題:
 * 一、一旦某個業務邏輯發生改變,如購票業務中增長其餘業務邏輯,須要修改購票核心文件、甚至購票流程。
 * 二、日積月累後,文件冗長,致使後續維護困難。
 *
 * 存在問題緣由主要是程序的"緊密耦合",使用觀察者模式將目前的業務邏輯優化成"鬆耦合",達到易維護、易修改的目的,
 * 同時也符合面向接口編程的思想。
 *
 * 觀察者模式典型實現方式:
 * 一、定義2個接口:觀察者(通知)接口、被觀察者(主題)接口
 * 二、定義2個類,觀察者對象實現觀察者接口、主題類實現被觀者接口
 * 三、主題類註冊本身須要通知的觀察者
 * 四、主題類某個業務邏輯發生時通知觀察者對象,每一個觀察者執行本身的業務邏輯。
 */
 
#===================定義觀察者、被觀察者接口============
/*
//觀察者接口(通知接口)
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.onblur=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;
}
*/
 
 
 
?>
相關文章
相關標籤/搜索