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);