PHP學習筆記

php語法

  • php數組之foreach循環訪問索引數組裏的值        
foreach($var as$k=>$v){echo '<br>第 '.$.'值是:'.$v;}
  •    php之map初始化    
$fruit=array(
     'apple'=>"蘋果",
     'banana'=>"香蕉",
     'pineapple'=>"菠蘿"
     );
  • php之對象
class Car {
    private function __construct() {
        echo 'object create';
    }

    private static $_object = null;
    public static function getInstance() {
        if (empty(self::$_object)) {
            self::$_object = new Car(); //內部方法可以調用私有方法,因此這裏可以創建對象
        }
        return self::$_object;
    }
}
//$car = new Car(); //這裏不允許直接實例化對象
$car = Car::getInstance(); //通過靜態方法來獲得一個實例
  • php類和對象之重載 

PHP中的重載指的是動態的創建屬性與方法,是通過魔術方法來實現的。屬性的重載通過__set,__get,__isset,__unset來分別實現對不存在屬性的賦值、讀取、判斷屬性是否設置、銷燬屬性。

class Car {
    private $ary = array();
    
    public function __set($key, $val) {
        $this->ary[$key] = $val;
    }
    
    public function __get($key) {
        if (isset($this->ary[$key])) {
            return $this->ary[$key];
        }
        return null;
    }
    
    public function __isset($key) {
        if (isset($this->ary[$key])) {
            return true;
        }
        return false;
    }
    
    public function __unset($key) {
        unset($this->ary[$key]);
    }
}
$car = new Car();
$car->name = '汽車';  //name屬性動態創建並賦值
echo $car->name;
  • php正則表達式
正則表達式中具有特殊含義的字符稱之爲元字符,常用的元字符有:

\ 一般用於轉義字符
^ 斷言目標的開始位置(或在多行模式下是行首)
$ 斷言目標的結束位置(或在多行模式下是行尾)
. 匹配除換行符外的任何字符(默認)
[ 開始字符類定義
] 結束字符類定義
| 開始一個可選分支
( 子組的開始標記
) 子組的結束標記
? 作爲量詞,表示 0 次或 1 次匹配。位於量詞後面用於改變量詞的貪婪特性。 (查閱量詞)
* 量詞,0 次或多次匹配
+ 量詞,1 次或多次匹配
{ 自定義量詞開始標記
} 自定義量詞結束標記

//下面的\w匹配字母或數字或下劃線。
$p = '/[\w\.\-]+@[a-z0-9\-]+\.(com|cn)/';
$str = "我的郵箱是[email protected]";
preg_match($p, $str, $match);
echo $match[0];


//下面的\d表示匹配數字
$p = '/\d+\-\d+/';
$str = "我的電話是010-12345678";
preg_match($p, $str, $match);
echo $match[0]; //結果爲:010-12345678

$p = '/\d?\-\d?/';
$str = "我的電話是010-12345678";
preg_match($p, $str, $match);
echo $match[0];  //結果爲:0-1

$p = '/\d{3}\-\d{8}/';
$str = "我的電話是010-12345678";
preg_match($p, $str, $match);
echo $match[0]; //結果爲:010-12345678

/*preg_match用來執行一個匹配,可以簡單的用來判斷模式是否匹配成功,或者取得一個匹配結果,他的返回值是匹配成功的次數0或者1,在匹配到1次以後就會停止搜索。*/

$subject = "abcdef";
$pattern = '/def/';
preg_match($pattern, $subject, $matches);
print_r($matches); //結果爲:Array ( [0] => def )

/*上面的代碼簡單的執行了一個匹配,簡單的判斷def是否能匹配成功,但是正則表達式的強大的地方是進行模式匹配,因此更多的時候,會使用模式:*/

$subject = "abcdef";
$pattern = '/a(.*?)d/';
preg_match($pattern, $subject, $matches);
print_r($matches); //結果爲:Array ( [0] => abcd [1] => bc )


\*常用正則表達式*\
<?php
$user = array(
    'name' => 'spark1985',
    'email' => '[email protected]',
    'mobile' => '13312345678'
);
//進行一般性驗證
if (empty($user)) {
    die('用戶信息不能爲空');
}
if (strlen($user['name']) < 6) {
    die('用戶名長度最少爲6位');
}
//用戶名必須爲字母、數字與下劃線
if (!preg_match('/^\w+$/i', $user['name'])) {
    die('用戶名不合法');
}
//驗證郵箱格式是否正確
if (!preg_match('/^[\w\.]+@\w+\.\w+$/i', $user['email'])) {
    die('郵箱不合法');
}
//手機號必須爲11位數字,且爲1開頭
if (!preg_match('/^1\d{10}$/i', $user['mobile'])) {
    die('手機號不合法');
}
echo '用戶信息驗證成功';
  • 會話控制(session和cookie)           

PHP通過setcookie函數進行Cookie的設置,任何從瀏覽器發回的Cookie,PHP都會自動的將他存儲在$_COOKIE的全局變量之中,因此我們可以通過$_COOKIE['key']的形式來讀取某個Cookie值。

PHP中的Cookie具有非常廣泛的使用,經常用來存儲用戶的登錄信息,購物車等,且在使用會話Session時通常使用Cookie來存儲會話id來識別用戶,Cookie具備有效期,當有效期結束之後,Cookie會自動的從客戶端刪除。同時爲了進行安全控制,Cookie還可以設置域跟路徑。

cookie相對不是太安全,容易被盜用導致cookie欺騙單個cookie的值最大隻能存儲4k每次請求都要進行網絡傳輸.佔用帶寬

session是將用戶的會話數據存儲在服務端,沒有大小限制,通過一個session_id進行用戶識別,PHP默認情況下session id是通過cookie來保存的,因此從某種程度上來說,seesion依賴於cookie。但這不是絕對的,session id也可以通過參數來實現,只要能將session id傳遞到服務端進行識別的機制都可以使用session。

默認情況下,session是以文件形式存儲在服務器上的,因此當一個頁面開啓了session之後,會獨佔這個session文件,這樣會導致當前用戶的其他併發訪問無法執行而等待。可以採用緩存或者數據庫的形式存儲來解決這個問題。

/* PHP設置Cookie最常用的方法就是使用setcookie函數,setcookie具有7個可選參數,我們常用到的爲前5個:name( Cookie名)可以通過$_COOKIE['name'] 進行訪問;value(Cookie的值);expire(過期時間)Unix時間戳格式,默認爲0,表示瀏覽器關閉即失效;path(有效路徑)如果路徑設置爲'/',則整個網站都有效
domain(有效域)默認整個域名都有效,如果設置了'www.imooc.com',則只在www子域中有效*/

$value = 'test';
setcookie("TestCookie", $value);
setcookie("TestCookie", $value, time()+3600);  //有效期一小時
setcookie("TestCookie", $value, time()+3600, "/path/", "imooc.com"); //設置路徑與域

/*瞭解原理以後,我們也可以直接通過header來刪除cookie。*/
header("Set-Cookie:test=1393832059; expires=".gmdate('D, d M Y H:i:s \G\M\T', time()-1));


/*在PHP中使用session非常簡單,先執行session_start方法開啓session,然後通過全局變量$_SESSION進行session的讀寫。
session_start();
$_SESSION['test']=time();
var_dump($_SESSION);

/*session會自動的對要求設置的值進行encode與decode,因此session可以支持任意數據類型,包括數據與對象等*/
session_start();
$_SESSION['ary']=array('name'=>'jobs');
$_SESSION['obj']=new stdClass();
var_dump($_SESSION);

/*如果要刪除所有的session,可以使用session_destroy函數銷燬當前的session,session_destroy()函數銷燬當前的session,session_destroy會刪除所有數據,但是session_id仍然存在。*/
session_start();
$_SESSION['name'] = 'jobs';
$_SESSION['time'] = time();
session_destroy();

/*值得注意的是,session_destroy並不會立即的銷燬全局變量$_SESSION中的值,只有當下次再訪問的時候,$_SESSION才爲空,因此吐過需要立即銷燬$_SESSION,可以使用unset函數。*/

session_start();
$_SESSION['name'] = 'jobs';
$_SESSION['time'] = time();
unset($_SESSION);
session_destroy(); 
var_dump($_SESSION); //此時已爲空


/*使用session來存儲用戶的登錄信息*/
session_start();
//假設用戶登錄成功獲得了以下用戶數據
$userinfo=array(
         'uid'=>10000,
         'name'=>'spark',
         'email'=>'[email protected]',
         'sex'=>'man',
         'age'=>'18');
header("content-type:text/html;charset=utf-8");

//將用戶信息保存到session中
$_SESSION['uid']=$userinfo['uid'];
$_SESSION['name']=$userinfo['name'];
$_SESSION['userinfo']=$userinfo;

//將用戶數據保存到cookie中的一個簡單方法
$secureKey='imooc'
$str=serialize($userinfo);
$str=base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256,md5($secureKey),$str,MCRYPT_MODE_ECB));
setcookie('userinfo',$str);
//當需要使用時進行解密
$str = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, md5($secureKey), base64_decode($str), MCRYPT_MODE_ECB);
$uinfo = unserialize($str);
echo "解密後的用戶信息:<br>";
print_r($uinfo);



  • php文件系統
/*PHP具有豐富的文件操作函數,最簡單的讀取文件的函數爲file_get_contents,可以將整個文件全部讀取到一個字符串中*/
$content=file_get_contents('./test.txt');
$content=file_get_contents('./text.txt',null,null,100,500);

/*php也提供類似於C語言操作文件的方法,使用fopen, fgets, fread等方法,fgets可以從文件指針中讀取一行,freads可以讀取指定長度的字符串。*/
             $fp=fopen('./text.txt','rb');
             while(!feof($fp)){
                  echo fgets($fp);
             }
             fclose($fp);


/* 如果只是判斷文件存在,使用file_exists就行,file_exists不僅可以判斷文件是否存在,同時也可以判斷目錄是否存在,從函數名可以看出,is_file是確切的判斷給定的路徑是否是一個文件。*/
         
                 $filename = './test.txt';
                if (file_exists($filename)) {
                    echo file_get_contents($filename)}
                
                $filename = './test.txt';
                if (is_file($filename)) {
                  echo file_get_contents($filename);}
/*更加精確的可以使用is_readable與is_writeable在文件是否存在的基礎上,判斷文件是否可讀與可寫*/
                $filename = './test.txt';
                if (is_writeable($filename)) {
                    file_put_contents($filename, 'test');}
                if (is_readable($filename)) {
                    echo file_get_contents($filename);
                   }

/*文件you很多元屬性,包括文件的所有者、創建實踐、修改實踐、最後的訪問時間等*/
            $filename='data/webroot/usercode/code/resource/text.txt';
            echo '所有者:'.fileowner($filename).'<br>';
            echo '創建時間:'.filectime($filename).'<br>';
            echo '修改時間:'.filemtime($filename).'<br>';
            echo '最後訪問時間:'.fileatime($filename).'<br>';
            //通過filesize函數可以取得文件的大小,文件大小是以字節數表示的
            $size = filesize($filename);

/*與讀取文件對應,PHP寫文件也具有兩種方式,最簡單的方式是採用file_put_contents.*/
         $fp = fopen('./test.txt', 'w');
         fwrite($fp, 'hello');
         fwrite($fp, 'world');
         $filename = './test.txt';
         $data = 'test';
         file_put_contents($filename, $data);

/*跟unix系統命令類似,PHP使用unlink函數進行文件刪除,刪除文件夾使用rmdir函數,文件夾必須爲空,如果不爲空或者沒有權限則會提示失敗。如果文件夾中存在文件,可以先循環刪除目錄中的所有文件,然後再刪除目錄,循環刪除可以使用glob函數遍歷所有文件。*/
            rmdir($dir);
            foreach (glob("*") as $filename) {
              unlink($filename);
             }




     
  • PHP異常處理

       從PHP5開始,PHP支持異常處理,異常處理是面向對象一個重要特性。PHP代碼中的異常通過throw拋出,異常拋出之後,後面的代碼將不會再被執行。既然拋出異常會中斷程序,那麼爲什麼還需要使用異常處理?異常拋出被用於再遇到未知錯誤,或者不符合預先設定的條件時,通知客戶程序,以便進行其他相關處理,不至於使程序直接報錯中斷。

       PHP具有很多異常處理類,其中Exception是所有異常處理的基類,Expection具有幾個基本屬性和方法,其中包括了:message 異常消息內容 code 異常代碼 file 拋出異常的文件名 line 拋出異常再該文件的行數,其中常用的方法: getTrace 獲取異常追蹤異常信息 getTraceAsString獲取異常追蹤信息的字符串 getMessage 獲取出錯信息。

try{
    throw new Exception('wrong');
   }catch(Exception $ex){
         echo 'Error:'.$ex->getMessage().'<br>';
         echo $ex->getTraceAsString().'<br>';
         }

try {
    throw new Exception('wrong');
} catch(Exception $ex) {
    $msg = 'Error:'.$ex->getMessage()."\n";
    $msg.= $ex->getTraceAsString()."\n";
    $msg.= '異常行號:'.$ex->getLine()."\n";
    $msg.= '所在文件:'.$ex->getFile()."\n";
    //將異常信息記錄到日誌中
 PHP異常處理之   file_put_contents('error.log', $msg);
}
  •  PHP數據庫處理
/*mysql擴展進行數據庫連接的方法*/
    $link=mysql_connect('mysql_host','mysql_user','mysql_password');

/*選擇數據庫*/.
    mysql_select_db('code1')

/*通常我們會先設置以下當前鏈接使用的字符編碼*/
    mysql_query("set names 'utf8'")

/*在數據庫建立鏈接以後就可以進行查詢,採用mysql_query加sql語句的形式向數據庫發送查詢指令*/
        $res=mysql_query('select * from user limit 1')

/*對於查詢類的語句會返回一個資源句柄,可以通過該資源獲取查詢結果集中的數據*/
      $row=mysql_fetch_array($res);
      var_dump($row)

/*默認的,PHP使用最近的數據庫連接執行查詢,但如果存在多個連接的情況,則可以通過參數指令從那個連接中進行查詢*/
         $link1 = mysql_connect('127.0.0.1', 'code1', '');
         $link2 = mysql_connect('127.0.0.1', 'code1', '', true); //開啓一個新的連接
         $res = mysql_query('select * from user limit 1', $link1); //從第一個連接中查詢數據

/*在實際應用中,我們並不希望一次性獲取數據表中的所有數據,那樣性能會非常的低,因此會使用翻頁功能,每頁僅顯示10條或者20條數據。通過mysql的limit可以很容易的實現分頁,limit m,n表示從m行後取n行數據,在PHP中我們需要構造m與n來實現獲取某一頁的所有數據。*/
                $page = 2;
                $n = 2;
                $m = ($page - 1) * $n;
                $sql = "select * from user limit $m, $n";
                $result = mysql_query($sql);
                //循環獲取當前頁的數據
                $data = array();
                while ($row = mysql_fetch_assoc($result)) {
                    $data[] = $row;
                }
/*對於刪除與更新操作,可以通過mysql_affected_rows函數來獲取更新過的數據行數,如果數據沒有變化,則結果爲0。*/
               $sql = "update user set name = '曹操' where id=2 limit 1";
               if (mysql_query($sql)) {
                    echo mysql_affected_rows();
               }
 

/*雖然PHP會自動關閉數據庫連接,一般情況下已經滿足需求,但是在對性能要求比較高的情況下,可以在進行完數據庫操作之後儘快關閉數據庫連接,以節省資源,提高性能。*/
             $link = mysql_connect($host, $user, $pass);
             mysql_close($link);

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章