天天看點

PHP技術基礎

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,如需轉載請自行聯系原作者