1.php4種標籤風格及3種註釋風格
i.標籤風格
a.XML風格
<?php
echo "hello world!";
?>
b.ASP風格
<%
echo "hello world!";
%>
c.腳本風格
<script language="php">
echo "hello world!";
</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()函數解析參數
<?php
$param_arr = getopt('a:b:c:');
print_r($param_arr);
?>
執行結果:php test.php -a 345 -b 12q3
Array
(
[a] => 345
[b] => 12q3
)
c.提示用戶輸入
<?php
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)
is_null($str) //true
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.靜態變量
定義於函數中,函數結束時不會被釋放
<?php
$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 //所以已定義的全局變量組成的數組,變量名是該數組的索引(數組)
5.運算符
c語言中的所有運算符適用於PHP,並有其他運算符:
@:錯誤屏蔽運算符,可以屏蔽表達式產生的錯誤
$err=@(5/0) ;//防止系統報錯,使得程序可以繼續運行
6.函數
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) //解引用或解變量
7.流控制語句
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屬性進行賦值
<?php
include("index.php");//可以引用外部文件解耦合,多次引用將多次包含,如果只引用一次可以使用require_once
require_once("index.php"); //require
?>
<?php
$hidden="yg0025";
?>
<input type="hidden" name="ID" value="<?php echo $hidden;?>">
$re=require("...")函數及其變種都具有返回值,返回調用的php文件中return函數的值
<?php
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
必須寫在文件開頭
<?php
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:
<?php
session_start();
$_SESSION["admin"]="hello";//完成寫session
?>
讀session
<?php
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的過期時間
<?php
session_set_cookie_params(1*60);
session_start();
$_SESSION["admin"]='hello'
?>
ii.setcookie設置session_id的過期時間
<?php
session_start();
setcookie(session_name(),session_id(),time()+60,'/');
$_SESSION["admin"]='hello'
?>
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類,則當在另一個文件中調用時可以這樣:
<?php
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()函數時調用此方法
<?php
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的時候自動調用。
<?php
class Person {
private $name;
private $age;
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連用,可以訪問被覆蓋類中的成員和方法。
<?php
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() 函數來反序列化一個被序列化的對象。這樣整個過程下來,對象內的類型結構及數據都是 完整的。
<?php
$p1 = new Person("張三", 20);
$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);
$stmt->execute();
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 *** 查看模塊是否安裝成功