1.php4種标簽風格及3種注釋風格
i.标簽風格
a.XML風格
<?php
echo "hello world!";
?>
b.ASP風格
<%
%>
c.腳本風格
<script language="php">
</script>
d.極簡風格
<?echo "hello world!";?>
注意:當使用極簡風格和ASP風格時需要在php.ini檔案中配置short_open_tag和asp_tags設定為on
ii.注釋風格
a.c++風格的單行注釋 //
b.c++風格的多行注釋 /**/
c.shell風格的注釋 #
2.php腳本執行的3種參數傳遞與解析
a.$argc和$argv 傳遞參數
<?php
echo "接收到{$argc}個參數";
print_r($argv);
執行結果: php.exe .\hello.php hello world -a 123
paras count : 5Array
(
[0] => .\hello.php
[1] => hello
[2] => world
[3] => -a
[4] => 123
)
b.getopt()函數解析參數
$param_arr = getopt('a:b:c:');
print_r($param_arr);
執行結果:php test.php -a 345 -b 12q3
Array
[a] => 345
[b] => 12q3
c.提示使用者輸入
fwrite(STDOUT,'請輸入您的部落格名:');
echo '您輸入的資訊是:'.fgets(STDIN);
3.php資料類型
php的變量使用$開頭,屬于動态資料類型,資料類型包括:
boolean string integer float array object resource null值
資料類型的定義:
a.string 單引号和雙引号字元串的差別
同shell中的單雙引号的差別相同,雙引号的字元串需要先執行遞歸的變量替代
$a='hello world';
echo "hi,$a";
b1.string的界定符輸出
目的:增強可讀性
$string=<<<std
hi,
hello world
std; //結束
b2.格式化字元串
$formatted = sprintf ("hello,%s", "world");
printf($formatted);
c.array3種定義
$array=array("v1","v2");//數值自動鍵,從0開始
$array[key]="vkey";//字元指定鍵
$array=array(key1=>v1,key2=>v2) //字元鍵和數字鍵可以混用
d.null值
通常會用于變量申明
$str=null;
is_null($str) //true
$str="str"
is_null($str) //false
unset($str)
e.資料類型之間的強制轉換
$str="123"
$num=(integer)$str
$bl=(boolean)$str
f.資料類型檢測函數
is_bool(),is_string,is_float(),is_double(),is_integer(),is_int(),is_null(),is_array(),is_object(),is_numeric()
g.常量定義函數
define(string 常量名,值,true/false大小寫敏感)
bool defined(string 常量名) //判斷該常量是否已經定義
define("ms",123)
echo ms+24;
h.php預定義常量
__FILE__ PHP程式檔案名
__LINE__ PHP目前檔案行數
PHP_VERSION
PHP_OS 執行PHP的OS
...
i.string的+運算和。運算
string + :表示将字元串轉換成數字再執行+ (隻轉換字元串首部的數字,首部為字母則結果為0)
string . :表示将字元串拼接
$n="3.14r";
$m=1;
echo $n.$m , $n+$m //3.14r1 4.14
4.變量
a.變量的引用定義&
$i="hello"
$j=&$i
$i="$i,world"
echo $i // hello,world
echo $j // hello,world
b.變量的3種作用域
i.局部變量
函數中定義的變量,作用域為整個函數
ii.全局變量
函數以外的變量,作用域為目前PHP檔案,但函數内部不可用,除非在函數中申明global才可作用于函數中
iii.靜态變量
定義于函數中,函數結束時不會被釋放
$msg="hello";//全局變量
function hello(){
static $msg1="hello";//靜态變量
global $msg;//函數中使用全局變量
$msg1="hello"//局部變量
}
c.變量的遞歸性(可變變量)
$a="hello,world";
$b="a"
echo $$b //将輸出hello,world
d.php預定義變量
$_SERVER['SERVER_ADDR']//目前運作腳本所在的伺服器IP
$_SERVER['SERVER_NAME']//...伺服器名
$_SERVER['REQUEST_METHOD']//請求方法
$_SERVER['REMOTE_ADDR']//
$_SERVER['REMOTE_HOST']//
$_SERVER['REMOTE_PORT']//
$_SERVER['SCRIPT_FILENAME']//目前腳本的絕對路徑
$_SERVER['SERVER_PORT']//
$_SERVER['DOCUMENT_ROOT']//目前腳本的文檔根目錄
$_COOKIE//通過HTTPCookie傳遞到腳本的資訊(數組)
$_SESSION//包含與所有回話有關的資訊(數組)
$_POST//包含通過POST方法傳遞的相關資訊(數組)
$_GET//包含通過GET方法傳遞的相關資訊(數組)
$_GLOBALS//是以已定義的全局變量組成的數組,變量名是該數組的索引(數組)
6.運算符
c語言中的所有運算符适用于PHP,并有其他運算符:
@:錯誤屏蔽運算符,可以屏蔽表達式産生的錯誤
$err=@(5/0) ;//防止系統報錯,使得程式可以繼續運作
7.函數
a.函數定義與調用
function fun_name($arg1,&$arg2,$arg3=value,...){
function exap($num){
return $num+10;
echo exap(10);
特點:入參的傳遞有2種值傳遞和引用傳遞,參數可以有預設值
b.函數作為變量值時的調用(變量函數)
$fun="exap";
$fun(10);
c.函數傳回值得引用<=>函數的引用
$a=&exap(10)
echo $a."<p>";
unset($a) //解引用或解變量
8.流控制語句
a.if,switch,while,do...while,for與C語言相同
b.foreach 用于數組和對象
foreach(array_expression as $value) 或者 foreach(array_expression as $key => $value)
8.字元串處理
a.trim(string str[,string charlist]),ltrim,rtrim
預設删除字元串左右兩邊所有的空格,\0,\t,\n,\x0B,\r
b.字元串轉義
"\",addcslashes(),stripcslashes()
例子:$m1="select * from t where book='m'";
$m="select * from t where book=\'m\'";
$m=addcslashes($m1)
也可以去轉義
stripcslashes($m)
c.子字元串
string substr(string str,int start[,int len])
d.比較字元串
int strcmp(string str1,string str2)
int strnatcmp(string str1,string str2) 不區分大小寫
int strncmp(string str1,string str2,int len)
e.字元串查找
string strstr(string str,string findstr) 傳回findstr第一次出現的位置到str末尾的子字元串
int substr_count(string str,string findstr) 查找子字元串出現的次數
f.字元串替代
string str_ireplace(string new_substr,string old_substr,string str[,int count替代次數])
string substr_replace(string str,string repl,int star[,int len])
g.分割字元串
array explode(string sep,string str[,int limit限制傳回值最多包含的元素])
h.合成字元串
string implode(string glue,array)
9.正規表達式
a.bool ereg/eregi(string pattern,string str[,returnarray]) 在字元串str中比對pattern模式, 将比對的字元放在傳回數組中;如果比對成功傳回true,否則傳回false。
b.string ereg_replace/eregi_replace(string pattern,string rep,string str) 使用rep替代 str中所有比對pattern的子串,傳回最後替代的結果
c.array split/spliti(string pattern,string str[,int limit]) 使用pattern分割str,傳回 分割後的數組,最後傳回limit個元素
d. array preg_grep(string pattern ,array input) 使用pattern比對數組array中的所有元素, 傳回完全比對的元素(而不是部分比對);pattern必須使用"/.../"包圍
e.preg_match/preg_match_all(string pattern,string str [,array matches]) 使用pattern 比對str中所有的子串并傳回,傳回比對的次數
f. string preg_quote(string str[,string delimiter]) 将str中的所有特殊字元自動轉義, delimiter字元串指定的所有字元也将被轉義(即加上一個‘\’)
g.mixed preg_replace(mixed pattern, mixed replacement,mixed str[,int limit]) 使用pattern在str中比對,将比對的子串替代為replacement,最多替代limit次
h.mixed preg_replace(mixed pattern, callback ck,mixed str[,int limit]) 與上述函數相同,但是是使用ck函數的傳回值來替代,ck的入參是一個數組,該數組是每一個比對傳回的所有分組
i.array preg_split(string pattern,string str[,int limit]) 使用pattern模式分割str。
10.數組
print_r(mixed)可以列印數組
each()和list()
explode()字元串拆分成數組
implode()數組組合成字元串
int count(array[,int mode]) 統計數組元素個數(mode==1遞歸統計)
mixed array_search(key,array) 在array中查找鍵值,如果找到傳回鍵值;否則傳回FALSE
mixed array_pop(array) 擷取并删除數組中的最後一個元素,如果數組為空則傳回null
int array_push(array,mixed v1[,v2,...]) 向數組尾部插入元素,并傳回數組中的元素總數
array array_unique(array) 删除數組中重複的元素
11.php與web表單互動資料
a.表單用于浏覽器發送資料到伺服器,并使用action指明使用哪個url進行表單資料的處理。浏覽器的資料隻能通過表單來傳送。表單的元素較多:checkbox,submit,reset,button,textarea...
b.GET和POST送出表單的差別:使用GET送出的表單将會将表單資料作為參數附加到url中進行送出;而POST方法不會。
c.關于全局變量$_POST,$_GET,$_SESSION
$_POST:數組格式,POST方法傳遞表單,使用表單元素的元素名擷取元素值:$_POST['user'] .
$_GET :數組格式,GET方法傳遞表單,使用表單元素的元素名擷取元素值:$_GET['user']
$_SESSION:session傳參擷取變量。使用表單元素的元素名擷取元素值:$_SESSION['user']
根據表單元素的不同,傳回來的'user'鍵對應的值有可能是一個數組
d.在web中嵌入php腳本的方法隻有2種:
使用HTML标記<?php...?>編寫php腳本;對表單元素的value屬性進行指派
include("index.php");//可以引用外部檔案解耦合,多次引用将多次包含,如果隻引用一次可以使用require_once
require_once("index.php"); //require
$hidden="yg0025";
<input type="hidden" name="ID" value="<?php echo $hidden;?>">
$re=require("...")函數及其變種都具有傳回值,傳回調用的php檔案中return函數的值
return "hello";
include 和require的執行過程都是先将代碼原本的拷貝到目前檔案再執行。
return的效果也可以了解成将代碼傳回。return後面的代碼将不會被拷貝。
這種拷貝有一個缺陷就是:同名變量或類有可能産生錯誤。
12.php與JavaScript互動
a.js的一些常識
js是一種由浏覽器運作解析的腳本(也可以由伺服器執行)。可以在不與伺服器互動的條件下實作動态網頁。
事件驅動:js是基于對象的語言。采用了事件驅動,當激發了某些事件時将執行相應的js代碼。
js事件相應模式:<input type="submit" name="submit" value="檢測" onClick="check()">
js的常用事件:onclick,ondblclick,onmousedown,...可以在網上查詢js常用事件
與html解耦合:<script src=url language="JavaScript"></script> 包含外部檔案
在頁面底部(</body>之前)引入js腳本,原因:由于js加載阻塞頁面,而HTML是下載下傳多少渲染多少,是以我們把它至于頁面底部,讓UI線程先執行完再加載js腳本
13.日期與時間
14.cookie與session
cookie:
a.cookie是從一個web頁面到下一個web頁面的資料傳遞方法,存儲在用戶端;session是讓資料在頁面中持續有效的方法,存儲在伺服器端。功能:記錄訪客的資訊;在頁面之間傳遞變量;将所檢視的Internet頁緩存在cookie臨時檔案夾中;
b.php設定cookie
必須寫在檔案開頭
setcookie("tmcookie","www.baidu.com");//生命周期預設為浏覽器會話周期
setcookie("tmcookie","www.baidu.com",time()+60);//有效期60秒
setcookie("tmcookie","www.baidu.com",time+60,"/tm/",".baidu.com",1); //設定有效目錄和域名
setcookie("tmcookie","",time()-1);//删除cookie
浏覽器會定時清流cookie,即使是未過期cookie也可能在cookie容量滿時被清理
session
a.session以随機且唯一的session_id為檔案名儲存在伺服器的檔案中,該session_id則是儲存在cookie中
寫session:
session_start();
$_SESSION["admin"]="hello";//完成寫session
讀session
if(!empty($_SESSION['admin'])) //将判斷cookie中是否存在session_id和‘admin’字段,否則均傳回null
$user=$_SESSION['admin']
删除session
unset($_SESSION['admin']);
$_SESSION=array();//删除所有session
session_destory();//徹底銷毀會話,确定會話結束時,應該這麼做
b.session的過期時間(隻有存在cookie時才能使用)
i.session_set_cookie_params将設定session_id的過期時間
session_set_cookie_params(1*60);
session_start();
$_SESSION["admin"]='hello'
ii.setcookie設定session_id的過期時間
setcookie(session_name(),session_id(),time()+60,'/');
c.session隻能使用目前session,如果想用上一個session,那是不可能的,因為無法得知session id。
d.session_id的4種傳遞方式
i.通過cookie傳遞,預設.需要用戶端浏覽器打開cookie。
ii.設定php.ini中的session.use_trans_sid=1,讓PHP自動跨頁面傳遞session_id
iii.通過GET方法,隐藏表單傳遞session_id
iv.使用檔案或者資料庫存儲session_id,在頁面間傳遞中手動調用
15.php的圖形圖像處理技術
16.php檔案處理
17.php面向對象
a.定義
與c++相似
final class demo{
public function __construct(){ //構造函數
echo __METHOD__.":".__LINE__."\n";
}
public function func($param){//普通函數
$param++;
echo "method func $paramn";
public function __destruct(){ //析構函數
echo __METHOD__.":".__LINE__."\n";
echo $this->sex;
}
//public $name = 123+456; 錯誤:初始化時不能帶有計算
static $a = '$a';
const A = 'A';
public $name = '鳳姐';
protected $sex = '男+女';
private $age = 23;
類的構造及成員的調用:$demo = new demo(); $demo->func(1);
成員的可見性有:public protected private 3種
其它修飾符:static final const
成員的調用方式: $this->property
b.類中的魔術方法(具有一定意義的方法)
i. 魔術方法必須被定義為公共的,所有其他魔術方法都必須如此
ii. 從PHP 5以後的版本,PHP中的類就可以使用魔術方法了。其規定以兩個下劃線(__)開頭的方法都保留為魔術方法,是以建議大家函數名最好不用__開頭,除非是為了重載已有的魔術方法,接下來列出一些魔術方法,如果大家想詳細了解可以針對某一個進行查詢了解,這裡就不大篇幅的介紹了。
b1.__construct() 構造方法
__destruct()析構方法
b2.__autoload() 自動加載魔術方法。有的時候,在檔案衆多的項目中,要一一将所需類的檔案都 include 進來,PHP 提供了 __autoload()方法,它會在試圖使用尚未被定義的類時自動調用。 通過調用此函數,腳本引擎在PHP 出錯失敗前有了最後一個機會加載所需的類。
加入在Person.php中存在Person類,則當在另一個檔案中調用時可以這樣:
function __autoload($class_name)
{
require_once $class_name.'.php';
//目前頁面 Pserson 類不存在則自動調用 __autoload() 方法,傳入參數 Person
$p1 = new Person("張三","20");
$p1 -> say();
b3.__get() 當調用一個未定義的屬性時,此方法會被觸發,傳遞的參數是被通路的屬性名。
__set() 給一個未定義的屬性指派時,此方法會被觸發,傳遞的參數是被設定的屬性名和值。 這裡的沒有聲明包括當使用對象調用時,通路控制為proteced,private的屬性(即沒有權限通路的屬性)。
__isset() 當在一個未定義的屬性上調用isset()函數時調用此方法
__unset() 當在一個未定義的屬性上調用unset()函數時調用此方法
class Person {
private $name;
private $sex;
private $age;
//__set()方法用來設定私有屬性
function __set($property_name, $value) { //在屬性指派時會被調用
echo "在直接設定私有屬性值的時候,自動調用了這個 __set() 方法為私有屬性指派<br />";
$this->$property_name = $value;
}
//__get()方法用來擷取私有屬性
function __get($property_name) {
echo "在直接擷取私有屬性值的時候,自動調用了這個 __get() 方法<br />";
return isset($this->$property_name) ? $this->$property_name : null;
$p1=new Person();
$p1->name = "張三";
echo "我的名字叫:".$p1->name;
運作該例子,輸出:
在直接設定私有屬性值的時候,自動調用了這個 __set() 方法為私有屬性指派
在直接擷取私有屬性值的時候,自動調用了這個 __get() 方法
我的名字叫:張三
b4.__call( $method, $arg_array ) 當調用一個未定義的方法是調用此方法,這裡的未定義的方法包括沒有權限通路的方法;如果方法不存在就去父類中找這個方法,如果父類中也不存在就去調用本類的__call()方法,如果本類中不存在__call()方法就去找父類中的__call()方法。
b5.__clone()如果想複制一個對象則需要使用clone方法
如果想在克隆後改變原對象的内容,需要在類中添加一個特殊的 __clone() 方法來重寫原本的屬性和方法。__clone() 方法隻會在對象被克隆clone的時候自動調用。
function __construct($name, $age) {
$this->name = $name;
$this->age = $age;
function say() {
echo "我的名字叫:".$this->name;
echo " 我的年齡是:".$this->age."<br />";
function __clone() {
$this->name = "我是假的".$this->name;
$this->age = 30;
$p1 = new Person("張三", 20);
$p1->say();
$p2 = clone $p1;
$p2->say();
b6.
__toString()方法在将一個對象轉化成字元串時自動調用,比如使用echo列印對象時
__sleep() 串行化的時候用
__wakeup 反串行化的時候調用
__set_state()當調用var_export()時,這個靜态 方法會被調用(自PHP 5.1.0起有效)
__invoke當嘗試以調用函數的方式調用一個對象時,__invoke 方法會被自動調用。
__callStatic(PHP 5.3.0以上版本有效) 是為了處理靜态方法調用
c.繼承與多态
c1.範圍解析操作符(::)
作用:範圍解析操作符或者更簡單地說是一對冒号,可以用于通路靜态成員,類常量,還可以用于覆寫類中的屬性和方法。self,parent 和 static這三個特殊的關鍵字是用于在類定義的内部對其屬性或 方法進行通路的。範圍解析操作符(::)與類名連用,可以用于通路靜态成員、方法和常量;與parent連用,可以通路被覆寫類中的成員和方法。
class MyClass
protected function myFunc() {
echo "MyClass::myFunc()\n";
class OtherClass extends MyClass
// 覆寫了父類的定義
public function myFunc()
{
// 但還是可以調用父類中被覆寫的方法
parent::myFunc();
echo "OtherClass::myFunc()\n";
$class = new OtherClass();
$class->myFunc();
/**
* 輸出結果 ->
* MyClass::myFunc()
* OtherClass::myFunc()
*/
function mycall(MyClass $a){ //函數的入參可以指明類型也可以不指明
$a->myFunc();
mycall(new OtherClass()); 多态
c2.接口interface與實作implements
class 子類 extends 父類 implemtns 接口1, 接口2, ...
......
interface User{
function getDiscount();
function getUserType();
//VIP使用者 接口實作
class VipUser implements User{
// VIP 使用者折扣系數
private $discount = 0.8;
function getDiscount() {
return $this->discount;
function getUserType() {
return "VIP使用者";
d.對象的序列化與反序列化->存儲
序列化完整過程包括兩個步驟:一個是序列化,就是把對象轉化為二進制的字元串,serialize() 函數用于序列化一個對象;另一個是反序列化,就是把對象被序列轉化的二進制字元串再轉化為對象,unserialize() 函數來反序列化一個被序列化的對象。這樣整個過程下來,對象内的類型結構及資料都是 完整的。
$p1_string = serialize($p1);
//将對象序列化後寫入檔案
$fh = fopen("p1.text", "w");
fwrite($fh, $p1_string);
fclose($fh);
$p2 = unserialize(file_get_contents("p1.text"));
$p2 -> say();
18.php加密技術
19.php操作mysql資料庫
resource mysql_connect("hostname","username","password"); //成功傳回連接配接conn,失敗傳回null
mysql_select_db(string dbname[,resource conn]);//選擇使用的資料庫 mysql_query("dbname"[,conn])
$result=mysql_query(string query[,resource conn]);//适合所有sql語句,語句中不能加";"
$info=mysql_fetch_array($result[,int result_type]); 從數組結果中擷取遞歸一行資訊,傳回數組;如果是select則$info的鍵為字段的名字,如果到底尾部則false
$info=mysql_fetch_object($result[,int result_type]); 擷取一行作為對象,成員為字段名
$info=mysql_fetch_row($result[,int result_type]); 傳回數組,但是是以下标索引的。
int mysql_num_rows()擷取查詢結果中總的記錄數
20.php的PDO
a.支援的資料庫
PDO支援MS SQL SERVER,MYSQL,ODBC,ORACLE,POSTGRE SQL等。
需要的php版本:php5.1以上
b.當資料庫發生變化時隻需要修改PDO的DSN資料源名稱
c.PDO連接配接mysql
$dbh = new PDO('mysql:host=localhost;dbname=test', 'root', 'nsfocus123');
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$sql = "INSERT INTO user VALUES ('5', 'xiaohua');";
$stmt = $dbh->prepare($sql);
$stmt->execute();
echo $dbh->lastinsertid();
$sql = "SELECT * FROM user";
$stmt = $dbh->prepare($sql);
while($row = $stmt->fetch(PDO::FETCH_ASSOC)){ // print_r($stmt->fetchAll() 以列名為索引的數組
print_r($row);
關于fetch的參數取值:
PDO::FETCH_ASSOC 從結果集中擷取以列名為索引的關聯數組。
PDO::FETCH_NUM 從結果集中擷取一個以列在行中的數值偏移量為索引的值數組。
PDO::FETCH_BOTH 這是預設值,包含上面兩種數組。
PDO::FETCH_OBJ 從結果集目前行的記錄中擷取其屬性對應各個列名的一個對象。
PDO::FETCH_BOUND 使fetch()傳回TRUE,并将擷取的列賦給在bindParm()方法中指 定的相應變量。
PDO::FETCH_LAZY 建立關聯數組和索引數組,以及包含列屬性的一個對象,進而可以在這三種接口中任選一種。
21.ThinkPHP架構
22.一些有用的函數
a.trigger_error("輸出資訊", E_USER_ERROR);觸發fatal錯誤,并退出程式執行
b.exit(0); 退出目前程序
c.$pid = pcntl_fork(); 建立子程序,需要pcntl子產品
23.php的子產品安裝方法
a.下載下傳需要安裝的源碼,編譯生成.so或.dll
b.将動态庫複制到php安裝目錄下的ext目錄中
c.修改安裝目錄下的php.ini配置檔案,在[php]字段中添加 extension=***.so
e.php -m |grep *** 檢視子產品是否安裝成功
24. 内建函數和預設常量
unset(變量) 删除某個變量
is_null(變量) 判斷變量是否為null
is_bool(變量)
is_string(變量)
is_float/is_double(變量)
is_integer/is_int(變量)
is_array(變量)
is_object(變量)
is_numeric(變量)
define(變量,value)
defined(變量)
strlen(string) #大量使用了c語言的庫函數
substr()
explode() //字元串拆分
implode() //(數組)合并為字元串
echo
print_t
count() //統計數組元素個數
array_push() //向數組最後添加一個元素
array_pop() //數組元素個數減一,傳回最後一個元素
array_search() //按值搜尋元素,并傳回鍵
array_key_exists(key,array) 鍵是否存在
array_unique() //删除數組中的重複元素
self:: 指代類本身 $this->指代對象本身
預設常量
__FILE__ __LINE__
PHP_VERSION PHP_OS
E_ERROR 常量,指向最近的錯誤處
本文轉自 a_liujin 51CTO部落格,原文連結:http://blog.51cto.com/a1liujin/1929848,如需轉載請自行聯系原作者