PHP筆記

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 *** 查看模塊是否安裝成功

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