PHP
1丶PHP不是純粹的面向對象,只是基於對象的面向過程語言,純粹的面向對象必須是支持封裝、繼承,多態(集中包含重載)的類實現,
而PHP是不支持重載的。
2丶PHP 變量規則:
變量以 $ 符號開始,後面跟着變量的名稱
變量名必須以字母或者下劃線字符開始
變量名只能包含字母數字字符以及下劃線(A-z、0-9 和 _ )
變量名不能包含空格
變量名是區分大小寫的($y 和 $Y 是兩個不一樣的變量)
3丶PHP 變量做用域
變量的做用域是腳本中變量可被引用/使用的部分。
PHP 有四種不一樣的變量做用域:
local 局部,僅在函數內部做用
global global 關鍵字用於函數內訪問全局變量。在函數內調用函數外定義的全局變量,咱們須要在函數中的變量前加上 global 關鍵字:
static 當一個函數完成時,它的全部變量一般都會被刪除。然而,有時候您但願某個局部變量不要被刪除。要作到這一點,請在您第一次聲明變量時使用 static 關鍵字:
parameter 參數做用域
局部和全局做用域
在全部函數外部定義的變量,擁有全局做用域。除了函數外,全局變量能夠被腳本中的任何部分訪問,要在一個函數中訪問一個全局變量,
須要使用 global 關鍵字。
在 PHP 函數內部聲明的變量是局部變量,僅能在函數內部訪問:
參數做用域
參數是經過調用代碼將值傳遞給函數的局部變量。
參數是在參數列表中聲明的,做爲函數聲明的一部分
4丶echo後面輸出字符的話要用單引號鏈接' '
php接收html文本框裏的類容用echo $_POST["name"] //name爲input中name的屬性的值
5丶PHP echo 和 print 語句
echo 和 print 區別:
echo - 能夠輸出一個或多個字符串
print - 只容許輸出一個字符串,返回值總爲 1
提示:echo 輸出的速度比 print 快, echo 沒有返回值,print有返回值1。
6丶一維數組
$Hero=array("亞索","李青","劫");//定義一個一維數組
print("我玩的最好的英雄是{$Hero[0]}");//{$Hero[0]}取數值裏的第一個元素
7丶PHP的數據類型轉換屬於強制轉換,容許轉換的PHP數據類型有:
(int)、(integer):轉換成整形
(float)、(double)、(real):轉換成浮點型
(string):轉換成字符串
(bool)、(boolean):轉換成布爾類型
(array):轉換成數組
(object):轉換成對象
PHP數據類型有三種轉換方式:
在要轉換的變量以前加上用括號括起來的目標類型
使用3個具體類型的轉換函數,intval()、floatval()、strval()
使用通用類型轉換函數settype(mixed var,string type)
8丶PHP數據類型
String(字符串), Integer(整型), Float(浮點型), Boolean(布爾型), Array(數組), Object(對象), NULL(空值)。
PHP 字符串
一個字符串是一串字符的序列,就像 "Hello world!"。
你能夠將任何文本放在單引號和雙引號中:
String中 一個字母佔1個長度,一個漢字佔3個長度
PHP 整型
整數是一個沒有小數的數字。
整數規則:
整數必須至少有一個數字 (0-9)
整數不能包含逗號或空格
整數是沒有小數點的
整數能夠是正數或負數
整型能夠用三種格式來指定:十進制, 十六進制( 以 0x 爲前綴)或八進制(前綴爲 0)。
PHP 布爾型
布爾型能夠是 TRUE 或 FALSE。
$x=true;
$y=false;
布爾型一般用於條件判斷
PHP 數組
數組能夠在一個變量中存儲多個值。
在如下實例中建立了一個數組, 而後使用 PHP var_dump() 函數返回數組的數據類型和值:
對象數據類型也能夠用於存儲數據。
PHP對象
在 PHP 中,對象必須聲明。
首先,你必須使用class關鍵字聲明類對象。類是能夠包含屬性和方法的結構。
而後咱們在類中定義數據類型,而後在實例化的類中使用數據類型:
PHP關鍵字this就是指向當前對象實例的指針,不指向任何其餘對象或類。
PHP NULL 值
NULL 值表示變量沒有值。NULL 是數據類型爲 NULL 的值。
NULL 值指明一個變量是否爲空值。 一樣可用於數據空值和NULL值的區別。
能夠經過設置變量值爲 NULL 來清空變量數據:
** var_dump();//打印數據類型和值,而且該函數自帶換行
PHP_EOL //小空格字符
**在PHP中「::」這個叫範圍解析操做符,又名域運算符
「::」符號能夠認爲是與C語言中的「.」類似的,而它更像C++中(Perl)的::類範圍操做符。
php調用類的內部靜態成員,或者是類之間調用就要用::
9丶PHP 常量
常量是一個簡單值的標識符。該值在腳本中不能改變。
一個常量由英文字母、下劃線、和數字組成,但數字不能做爲首字母出現。 (常量名不須要加 $ 修飾符)。
常量值被定義後,在腳本的其餘任何地方都不能被改變。
注意: 常量在整個腳本中均可以使用。
設置 PHP 常量
設置常量,使用 define() 函數,函數語法以下:
bool define ( string $name , mixed $value [, bool $case_insensitive = false ] )
該函數有三個參數:
name:必選參數,常量名稱,即標誌符。
value:必選參數,常量的值。
case_insensitive :可選參數,若是設置爲 TRUE,該常量則大小寫不敏感。默認是大小寫敏感的。
10丶PHP 中的字符串變量
字符串變量用於包含有字符的值。
在建立字符串以後,咱們就能夠對它進行操做了。您能夠直接在函數中使用字符串,或者把它存儲在變量中。
在下面的實例中,咱們建立一個名爲 txt 的字符串變量,並賦值爲 "Hello world!" 。而後咱們輸出 txt 變量的值:
字符串變量用於存儲並處理文本。
PHP 並置運算符
在 PHP 中,只有一個字符串運算符。
並置運算符 (.) 用於把兩個字符串值鏈接起來。
下面的實例演示瞭如何將兩個字符串變量鏈接在一塊兒:
PHP strlen() 函數
有時知道字符串值的長度是頗有用的。
strlen() 函數返回字符串的長度(字符數)。
提示:strlen() 經常用在循環和其餘函數中,由於那時肯定字符串什麼時候結束是很重要的。(例如,在循環中,咱們須要在字符串中的最後一個字符以後結束循環。)
PHP strpos() 函數
strpos() 函數用於在字符串內查找一個字符或一段指定的文本。
若是在字符串中找到匹配,該函數會返回第一個匹配的字符位置。若是未找到匹配,則返回 FALSE。
php substr()函數 語法
做用:截取字符串
語法:substr(string,start,length)
php strtoupper()函數 語法
做用:把全部字符轉換爲大寫
語法:strtoupper(string)
php strtolower()函數 語法
做用:把全部字符轉換爲小寫
語法:strtolower(string)
11丶PHP 算術運算符
運算符 名稱 描述 實例 結果
x + y 加 x 和 y 的和 2 + 2 4
x - y 減 x 和 y 的差 5 - 2 3
x * y 乘 x 和 y 的積 5 * 2 10
x / y 除 x 和 y 的商 15 / 5 3
x % y 模(除法的餘數) x 除以 y 的餘數 5 % 2
- x 取反 x 取反 - 2 -2
a . b 並置 鏈接兩個字符串 "Hi" . "Ha" HiHa
PHP7+ 版本新增整除運算符 intdiv()
12丶PHP 賦值運算符
在 PHP 中,基本的賦值運算符是 "="。它意味着左操做數被設置爲右側表達式的值。也就是說,"$x = 5" 的值是 5。
運算符 等同於 描述
x = y x = y 左操做數被設置爲右側表達式的值
x += y x = x + y 加
x -= y x = x - y 減
x *= y x = x * y 乘
x /= y x = x / y 除
x %= y x = x % y 模(除法的餘數)
a .= b a = a . b 鏈接兩個字符串
13丶PHP 遞增/遞減運算符
運算符 名稱 描述
++ x 預遞增 x 加 1,而後返回 x
x ++ 後遞增 返回 x,而後 x 加 1
-- x 預遞減 x 減 1,而後返回 x
x -- 後遞減 返回 x,而後 x 減 1
14丶PHP 比較運算符
比較操做符可讓您比較兩個值:
運算符 名稱 描述 實例
x == y 等於 若是 x 等於 y,則返回 true 5==8 返回 false
x === y 恆等於 若是 x 等於 y,且它們類型相同,則返回 true 5==="5" 返回 false
x != y 不等於 若是 x 不等於 y,則返回 true 5!=8 返回 true
x <> y 不等於 若是 x 不等於 y,則返回 true 5<>8 返回 true
x !== y 不恆等於 若是 x 不等於 y,或它們類型不相同,則返回 true 5!=="5" 返回 true
x > y 大於 若是 x 大於 y,則返回 true 5>8 返回 false
x < y 小於 若是 x 小於 y,則返回 true 5<8 返回 true
x >= y 大於等於 若是 x 大於或者等於 y,則返回 true 5>=8 返回 false
x <= y 小於等於 若是 x 小於或者等於 y,則返回 true 5<=8 返回 true
15丶PHP 邏輯運算符
運算符 名稱 描述 實例x and y 與 若是 x 和 y 都爲 true,則返回 true x=6 y=3 (x < 10 and y > 1) 返回 truex or y 或 若是 x 和 y 至少有一個爲 true,則返回 true x=6 y=3 (x==6 or y==5) 返回 true
x xor y 異或 若是 x 和 y 有且僅有一個爲 true,則返回 true x=6 y=3 (x==6 xor y==3) 返回 false //*須要注意一下
x && y 與 若是 x 和 y 都爲 true,則返回 true x=6 y=3 (x < 10 && y > 1) 返回 true
x || y 或 若是 x 和 y 至少有一個爲 true,則返回 true x=6 y=3(x==5 || y==5) 返回 false
! x 非 若是 x 不爲 true,則返回 true x=6 y=3 !(x==y) 返回 true
*boolean 型 值爲
true 瀏覽器會輸出1
false 瀏覽器不會輸出
16丶PHP 數組運算符
運算符 名稱 描述
x + y 集合 x 和 y 的集合
x == y 相等 若是 x 和 y 具備相同的鍵/值對,則返回 true
x === y 恆等 若是 x 和 y 具備相同的鍵/值對,且順序相同類型相同,則返回 true
x != y 不相等 若是 x 不等於 y,則返回 true
x <> y 不相等 若是 x 不等於 y,則返回 true
x !== y 不恆等 若是 x 不等於 y,則返回 true
17丶PHP三元運算符
另外一個條件運算符是"?:"(或三元)運算符 。
語法格式
(expr1) ? (expr2) : (expr3)
對 expr1 求值爲 TRUE 時的值爲 expr2,在 expr1 求值爲 FALSE 時的值爲 expr3。
自 PHP 5.3 起,能夠省略三元運算符中間那部分。表達式 expr1 ?: expr3 在 expr1 求值爲 TRUE 時返回 expr1,不然返回 expr3。
18丶在 PHP 中建立數組
在 PHP 中,array() 函數用於建立數組:
array();
在 PHP 中,有三種類型的數組:
數值數組 - 帶有數字 ID 鍵的數組
關聯數組 - 帶有指定的鍵的數組,每一個鍵關聯一個值
多維數組 - 包含一個或多個數組的數組
PHP 數值數組
這裏有兩種建立數值數組的方法:
自動分配 ID 鍵(ID 鍵老是從 0 開始):
$cars=array("Volvo","BMW","Toyota");
人工分配 ID 鍵:
$cars[0]="Volvo";
$cars[1]="BMW";
$cars[2]="Toyota";
獲取數組的長度 - count() 函數
count() 函數用於返回數組的長度(元素的數量):
19丶PHP 關聯數組
關聯數組是使用您分配給數組的指定的鍵的數組。
這裏有兩種建立關聯數組的方法:
$age=array("Peter"=>"35","Ben"=>"37","Joe"=>"43");
or:
$age['Peter']="35";
$age['Ben']="37";
$age['Joe']="43";
隨後能夠在腳本中使用指定的鍵:
遍歷關聯數組
遍歷並打印關聯數組中的全部值,您可使用 foreach 循環,以下所示:
實例
<?php
$age=array("Peter"=>"35","Ben"=>"37","Joe"=>"43");
foreach($age as $x=>$x_value)
{
echo "Key=" . $x . ", Value=" . $x_value;
echo "<br>";
}
?>
20丶PHP - 數組排序函數
在本章中,咱們將一一介紹下列 PHP 數組排序函數:
sort() - 對數組進行升序排列
rsort() - 對數組進行降序排列
asort() - 根據關聯數組的值,對數組進行升序排列
ksort() - 根據關聯數組的鍵,對數組進行升序排列
arsort() - 根據關聯數組的值,對數組進行降序排列
krsort() - 根據關聯數組的鍵,對數組進行降序排列
-------------------------------------------------------
current() 返回數組中的當前元素。
each() 返回數組中當前的鍵/值對。//已通過時了
21丶PHP 超級全局變量
PHP中預約義了幾個超級全局變量(superglobals) ,這意味着它們在一個腳本的所有做用域中均可用。
你不須要特別說明,就能夠在函數及類中使用。
PHP 超級全局變量列表:
$GLOBALS
$_SERVER
$_REQUEST
$_POST
$_GET
$_FILES
$_ENV
$_COOKIE
$_SESSION
22丶foreach 循環用於遍歷數組。
語法
foreach ($array as $value)
{
要執行代碼;
}
每進行一次循環,當前數組元素的值就會被賦值給 $value 變量(數組指針會逐一地移動),
在進行下一次循環時,您將看到數組中的下一個值。
foreach遍歷數組,as前面必須是已經定義並初始化了的數組,as後面是要被賦予值的變量
23丶PHP 函數
在本章中,咱們將爲您講解如何建立本身的函數。
如要在頁面加載時執行腳本,您能夠把它放到函數裏。
函數是經過調用函數來執行的。
你能夠在頁面的任何位置調用函數。
建立 PHP 函數
函數是經過調用函數來執行的。
語法
function functionName()
{
要執行的代碼;
}
PHP 函數準則:
函數的名稱應該提示出它的功能
函數名稱以字母或下劃線開頭(不能以數字開頭)
PHP 函數 - 添加參數
爲了給函數添加更多的功能,咱們能夠添加參數。參數相似變量。
參數就在函數名稱後面有一個括號內指定。
PHP 函數 - 返回值
如需讓函數返回一個值,請使用 return 語句。
24丶PHP 向它運行的任何腳本提供了大量的預約義常量。
不過不少常量都是由不一樣的擴展庫定義的,只有在加載了這些擴展庫時纔會出現,或者動態加載後,或者在編譯時已經包括進去了。
有八個魔術常量它們的值隨着它們在代碼中的位置改變而改變。
例如 __LINE__ 的值就依賴於它在腳本中所處的行來決定。這些特殊的常量不區分大小寫,以下:
__LINE__
文件中的當前行號。
實例:
<?php
echo '這是第 「 ' . __LINE__ . ' 」 行';
?>
以上實例輸出結果爲:
這是第 「 2 」 行
__FILE__
文件的完整路徑和文件名。若是用在被包含文件中,則返回被包含的文件名。
自 PHP 4.0.2 起,__FILE__ 老是包含一個絕對路徑(若是是符號鏈接,則是解析後的絕對路徑),
而在此以前的版本有時會包含一個相對路徑。
實例:
<?php
echo '該文件位於 「 ' . __FILE__ . ' 」 ';
?>
以上實例輸出結果爲:
該文件位於 「 E:\wamp\www\test\index.php 」
__DIR__
文件所在的目錄。若是用在被包括文件中,則返回被包括的文件所在的目錄。
它等價於 dirname(__FILE__)。除非是根目錄,不然目錄中名不包括末尾的斜槓。(PHP 5.3.0中新增)
實例:
<?php
echo '該文件位於 「 ' . __DIR__ . ' 」 ';
?>
以上實例輸出結果爲:
該文件位於 「 E:\wamp\www\test 」
__FUNCTION__
函數名稱(PHP 4.3.0 新加)。自 PHP 5 起本常量返回該函數被定義時的名字(區分大小寫)。在 PHP 4 中該值老是小寫字母的。
實例:
<?php
function test() {
echo '函數名爲:' . __FUNCTION__ ;
}
test();
?>
以上實例輸出結果爲:
函數名爲:test
__CLASS__
類的名稱(PHP 4.3.0 新加)。自 PHP 5 起本常量返回該類被定義時的名字(區分大小寫)。
在 PHP 4 中該值老是小寫字母的。類名包括其被聲明的做用區域(例如 Foo\Bar)。
注意自 PHP 5.4 起 __CLASS__ 對 trait 也起做用。當用在 trait 方法中時,__CLASS__ 是調用 trait 方法的類的名字。
實例:
<?php
class test {
function _print() {
echo '類名爲:' . __CLASS__ . "<br>";
echo '函數名爲:' . __FUNCTION__ ;
}
}
$t = new test();
$t->_print();
?>
以上實例輸出結果爲:
類名爲:test
函數名爲:_print
__TRAIT__
Trait 的名字(PHP 5.4.0 新加)。自 PHP 5.4.0 起,PHP 實現了代碼複用的一個方法,稱爲 traits。
Trait 名包括其被聲明的做用區域(例如 Foo\Bar)。
從基類繼承的成員被插入的 SayWorld Trait 中的 MyHelloWorld 方法所覆蓋。
其行爲 MyHelloWorld 類中定義的方法一致。優先順序是當前類中的方法會覆蓋 trait 方法,而 trait 方法又覆蓋了基類中的方法。
<?php
class Base {
public function sayHello() {
echo 'Hello ';
}
}
trait SayWorld {
public function sayHello() {
parent::sayHello();
echo 'World!';
}
}
class MyHelloWorld extends Base {
use SayWorld;
}
$o = new MyHelloWorld();
$o->sayHello();
?>
以上例程會輸出:
Hello World!
__METHOD__
類的方法名(PHP 5.0.0 新加)。返回該方法被定義時的名字(區分大小寫)。
實例:
<?php
function test() {
echo '函數名爲:' . __METHOD__ ;
}
test();
?>
以上實例輸出結果爲:
函數名爲:test
__NAMESPACE__
當前命名空間的名稱(區分大小寫)。此常量是在編譯時定義的(PHP 5.3.0 新增)。
實例:
<?php
namespace MyProject;
echo '命名空間爲:"', __NAMESPACE__, '"'; // 輸出 "MyProject"
?>
以上實例輸出結果爲:
命名空間爲:"MyProject"
25丶在面向對象的程序設計(英語:Object-oriented programming,縮寫:OOP)中,
對象是一個由信息及對信息進行處理的描述所組成的總體,是對現實世界的抽象。
在現實世界裏咱們所面對的事情都是對象,如計算機、電視機、自行車等。
對象的主要三個特性:
對象的行爲:能夠對 對象施加那些操做,開燈,關燈就是行爲。
對象的形態:當施加那些方法是對象如何響應,顏色,尺寸,外型。
對象的表示:對象的表示就至關於身份證,具體區分在相同的行爲與狀態下有什麼不一樣。
好比 Animal(動物) 是一個抽象類,咱們能夠具體到一隻狗跟一隻羊,而狗跟羊就是具體的對象,
他們有顏色屬性,能夠寫,能夠跑等行爲狀態。
面向對象內容
類 − 定義了一件事物的抽象特色。類的定義包含了數據的形式以及對數據的操做。
對象 − 是類的實例。
成員變量 − 定義在類內部的變量。該變量的值對外是不可見的,可是能夠經過成員函數訪問,在類被實例化爲對象後,
該變量便可稱爲對象的屬性。
成員函數 − 定義在類的內部,可用於訪問對象的數據。
繼承 − 繼承性是子類自動共享父類數據結構和方法的機制,這是類之間的一種關係。
在定義和實現一個類的時候,能夠在一個已經存在的類的基礎之上來進行,把這個已經存在的類所定義的內容做爲本身的內容,
並加入若干新的內容。
父類 − 一個類被其餘類繼承,可將該類稱爲父類,或基類,或超類。
子類 − 一個類繼承其餘類稱爲子類,也可稱爲派生類。
多態 − 多態性是指相同的操做或函數、過程可做用於多種類型的對象上並得到不一樣的結果。
不一樣的對象,收到同一消息能夠產生不一樣的結果,這種現象稱爲多態性。
重載 − 簡單說,就是函數或者方法有一樣的名稱,可是參數列表不相同的情形,這樣的同名不一樣參數的函數或者方法之間,
互相稱之爲重載函數或者方法。
抽象性 − 抽象性是指將具備一致的數據結構(屬性)和行爲(操做)的對象抽象成類。
一個類就是這樣一種抽象,它反映了與應用有關的重要性質,而忽略其餘一些無關內容。
任何類的劃分都是主觀的,但必須與具體的應用有關。
封裝 − 封裝是指將現實世界中存在的某個客體的屬性與行爲綁定在一塊兒,並放置在一個邏輯單元內。
構造函數 − 主要用來在建立對象時初始化對象, 即爲對象成員變量賦初始值,總與new運算符一塊兒使用在建立對象的語句中。
析構函數 − 析構函數(destructor) 與構造函數相反,當對象結束其生命週期時(例如對象所在的函數已調用完畢),
系統自動執行析構函數。析構函數每每用來作"清理善後" 的工做(例如在創建對象時用new開闢了一片內存空間,應在退出前在析構函數中用delete釋放)。
26丶變量 $this 表明自身的對象。
PHP 構造函數
構造函數 ,是一種特殊的方法。主要用來在建立對象時初始化對象, 即爲對象成員變量賦初始值,
總與new運算符一塊兒使用在建立對象的語句中。
PHP 5 允行開發者在一個類中定義一個方法做爲構造函數,語法格式以下:
void __construct ([ mixed $args [, $... ]] )
在上面的例子中咱們就能夠經過構造方法來初始化 $url 和 $title 變量:
function __construct( $par1, $par2 ) {
$this->url = $par1;
$this->title = $par2;
}
析構函數
析構函數(destructor) 與構造函數相反,當對象結束其生命週期時(例如對象所在的函數已調用完畢),系統自動執行析構函數。
PHP 5 引入了析構函數的概念,這相似於其它面向對象的語言,其語法格式以下:
void __destruct ( void )
方法重寫
若是從父類繼承的方法不能知足子類的需求,能夠對其進行改寫,這個過程叫方法的覆蓋(override),也稱爲方法的重寫。
訪問控制
PHP 對屬性或方法的訪問控制,是經過在前面添加關鍵字 public(公有),protected(受保護)或 private(私有)來實現的。
public(公有):公有的類成員能夠在任何地方被訪問。
protected(受保護):受保護的類成員則能夠被其自身以及其子類和父類訪問。
private(私有):私有的類成員則只能被其定義所在的類訪問。
屬性的訪問控制
類屬性必須定義爲公有,受保護,私有之一。若是用 var 定義,則被視爲公有。
接口
使用接口(interface),能夠指定某個類必須實現哪些方法,但不須要定義這些方法的具體內容。
接口是經過 interface 關鍵字來定義的,就像定義一個標準的類同樣,但其中定義全部的方法都是空的。
接口中定義的全部方法都必須是公有,這是接口的特性。
要實現一個接口,使用 implements 操做符。類中必須實現接口中定義的全部方法,不然會報一個致命錯誤。
類能夠實現多個接口,用逗號來分隔多個接口的名稱。
常量
能夠把在類中始終保持不變的值定義爲常量。在定義和使用常量的時候不須要使用 $ 符號。
常量的值必須是一個定值,不能是變量,類屬性,數學運算的結果或函數調用。
自PHP 5.3.0 起,能夠用一個變量來動態調用類。但該變量的值不能爲關鍵字(如 self,parent 或 static)。
抽象類
任何一個類,若是它裏面至少有一個方法是被聲明爲抽象的,那麼這個類就必須被聲明爲抽象的。
定義爲抽象的類不能被實例化。
被定義爲抽象的方法只是聲明瞭其調用方式(參數),不能定義其具體的功能實現。
繼承一個抽象類的時候,子類必須定義父類中的全部抽象方法;另外,這些方法的訪問控制必須和父類中同樣(或者更爲寬鬆)。
例如某個抽象方法被聲明爲受保護的,那麼子類中實現的方法就應該聲明爲受保護的或者公有的,而不能定義爲私有的。
此外方法的調用方式必須匹配,即類型和所需參數數量必須一致。例如,子類定義了一個可選參數,而父類抽象方法的聲明裏沒有,
則二者的聲明並沒有衝突。
Static 關鍵字
聲明類屬性或方法爲 static(靜態),就能夠不實例化類而直接訪問。
靜態屬性不能經過一個類已實例化的對象來訪問(但靜態方法能夠)。
因爲靜態方法不須要經過對象便可調用,因此僞變量 $this 在靜態方法中不可用。
靜態屬性不能夠由對象經過 -> 操做符來訪問。
自 PHP 5.3.0 起,能夠用一個變量來動態調用類。但該變量的值不能爲關鍵字 self,parent 或 static。
Final 關鍵字
PHP 5 新增了一個 final 關鍵字。若是父類中的方法被聲明爲 final,則子類沒法覆蓋該方法。若是一個類被聲明爲 final,則不能被繼承。
調用父類構造方法
PHP 不會在子類的構造方法中自動的調用父類的構造方法。要執行父類的構造方法,須要在子類的構造方法中調用 parent::__construct()
27丶 <select multiple="multiple" name="q[]"> multiple="multiple"設置下拉列表框可多選
表單驗證
咱們應該儘量的對用戶的輸入進行驗證(經過客戶端腳本)。瀏覽器驗證速度更快,而且能夠減輕服務器的壓力。
若是用戶輸入須要插入數據庫,您應該考慮使用服務器驗證。在服務器驗證表單的一種好的方式是,
把表單的數據傳給當前頁面(異步提交的方式更好),而不是跳轉到不一樣的頁面。
這樣用戶就能夠在同一張表單頁面獲得錯誤信息。用戶也就更容易發現錯誤了。
什麼是 htmlspecialchars()方法?
htmlspecialchars() 函數把一些預約義的字符轉換爲 HTML 實體,通常用於GET,htmlspecialchars($_GET[""]) 。
預約義的字符是:
& (和號) 成爲 &
" (雙引號) 成爲 "
' (單引號) 成爲 '
< (小於) 成爲 <
> (大於) 成爲 >
什麼是 $_SERVER["PHP_SELF"] 變量?
$_SERVER["PHP_SELF"]是超級全局變量,返回當前正在執行腳本的文件名,與 document root相關。
因此, $_SERVER["PHP_SELF"] 會發送表單數據到當前頁面,而不是跳轉到不一樣的頁面。
PHP表單中需引發注重的地方?
$_SERVER["PHP_SELF"] 變量有可能會被黑客使用!
當黑客使用跨網站腳本的HTTP連接來攻擊時,$_SERVER["PHP_SELF"]服務器變量也會被植入腳本。
緣由就是跨網站腳本是附在執行文件的路徑後面的,所以$_SERVER["PHP_SELF"]的字符串就會包含HTTP連接後面的JavaScript程序代碼。
Note XSS又叫 CSS (Cross-Site Script) ,跨站腳本攻擊。惡意攻擊者往Web頁面裏插入惡意html代碼,當用戶瀏覽該頁之時,
嵌入其中Web裏面的html代碼會被執行,從而達到惡意用戶的特殊目的。
指定如下表單文件名爲 "test_form.php":
<form method="post" action="<?php echo $_SERVER["PHP_SELF"];?>">
如今,咱們使用URL來指定提交地址 "test_form.php",以上代碼修改成以下所示:
<form method="post" action="test_form.php">
這樣作就很好了。
可是,考慮到用戶會在瀏覽器地址欄中輸入如下地址:
http://www.php.cn/test_form.php/%22%3E%3Cscript%3Ealert('hacked')%3C/script%3E
以上的 URL 中,將被解析爲以下代碼並執行:
<form method="post" action="test_form.php/"><script>alert('hacked')</script>
代碼中添加了 script 標籤,並添加了alert命令。 當頁面載入時會執行該Javascript代碼(用戶會看到彈出框)。
這僅僅只是一個簡單的實例來講明PHP_SELF變量會被黑客利用。
$_SERVER["PHP_SELF"] 能夠經過 htmlspecialchars() 函數來避免被利用。
function test_input($data)
{
$data = trim($data);
$data = stripslashes($data);
$data = htmlspecialchars($data);
return $data;
}
1. 使用 PHP trim() 函數去除用戶輸入數據中沒必要要的字符 (如:空格,tab,換行)。
2. 使用PHP stripslashes()函數去除用戶輸入數據中的反斜槓 (\)
注意咱們在執行以上腳本時,會經過$_SERVER["REQUEST_METHOD"]來檢測表單是否被提交 。
若是 REQUEST_METHOD 是 POST, 表單將被提交 - 數據將被驗證。若是表單未提交將跳過驗證並顯示空白。
在以上實例中使用輸入項都是可選的,即便用戶不輸入任何數據也能夠正常顯示。
$_GET 變量
預約義的 $_GET 變量用於收集來自 method="get" 的表單中的值。
從帶有 GET 方法的表單發送的信息,對任何人都是可見的(會顯示在瀏覽器的地址欄),而且對發送信息的量也有限制。
$_POST 變量
預約義的 $_POST 變量用於收集來自 method="post" 的表單中的值。
從帶有 POST 方法的表單發送的信息,對任何人都是不可見的(不會顯示在瀏覽器的地址欄),而且對發送信息的量也沒有限制。
什麼時候使用 method="post"?
從帶有 POST 方法的表單發送的信息,對任何人都是不可見的,而且對發送信息的量也沒有限制。
然而,因爲變量不顯示在 URL 中,因此沒法把頁面加入書籤。
PHP $_REQUEST 變量
預約義的 $_REQUEST 變量包含了 $_GET、$_POST 和 $_COOKIE 的內容。
$_REQUEST 變量可用來收集經過 GET 和 POST 方法發送的表單數據。
28丶一個數組中的值能夠是另外一個數組,另外一個數組的值也能夠是一個數組。依照這種方式,咱們能夠建立二維或者三維數組:
實例
<?php
// 二維數組:
$cars = array
(
array("Volvo",100,96),
array("BMW",60,59),
array("Toyota",110,100)
);
print_r($cars);
?>
29丶PHP date() 函數用於格式化時間/日期。
PHP date() 函數
PHP date() 函數可把時間戳格式化爲可讀性更好的日期和時間。
Tip時間戳是一個字符序列,表示必定的事件發生的日期/時間。
語法
string date ( string $format [, int $timestamp ] )
參數 描述
format 必需。規定時間戳的格式。
timestamp 可選。規定時間戳。默認是當前的日期和時間。
PHP Date() - 格式化日期
date() 函數的第一個必需參數 format 規定了如何格式化日期/時間。
這裏列出了一些可用的字符:
d - 表明月中的天 (01 - 31)
m - 表明月 (01 - 12)
Y - 表明年 (四位數)
如需瞭解 format 參數中可用的全部字符列表,請查閱咱們的 PHP Date 參考手冊,date() 函數。
能夠在字母之間插入其餘字符,好比 "/"、"." 或者 "-",這樣就能夠增長附加格式了:
<?php
echo date("Y/m/d") . "<br>";
echo date("Y.m.d") . "<br>";
echo date("Y-m-d");
?>
上面代碼的輸出以下所示:
2016/05/11
2016.05.11
2016-05-11
格式字串能夠識別如下 format 參數的字符串format 字符 說明 返回值例子
日 --- ---
d 月份中的第幾天,有前導零的 2 位數字 01 到 31
j 月份中的第幾天,沒有前導零 1 到 31
星期 --- ---
W ISO-8601 格式年份中的第幾周,每週從星期一開始(PHP 4.1.0 新加的) 例如:42(當年的第 42 周)
月 --- ---
m 數字表示的月份,有前導零 01 到 12
M 三個字母縮寫表示的月份 Jan 到 Dec
n 數字表示的月份,沒有前導零 1 到 12
t 給定月份所應有的天數 28 到 31
年 --- ---
Y 4 位數字完整表示的年份 例如:1999 或 2003
y 2 位數字表示的年份 例如:99 或 03
時間 --- ---
a 小寫的上午和下午值 am 或 pm
A 大寫的上午和下午值 AM 或 PM
h 小時,12 小時格式,有前導零 01 到 12
s 秒數,有前導零 00 到 59>
u 毫秒 (PHP 5.2.2 新加)。須要注意的是 date() 函數老是返回 000000 由於它只接受 integer 參數, 而 DateTime::format() 才支持毫秒。 示例: 654321
時區 --- ---
e 時區標識(PHP 5.1.0 新加) 例如:UTC,GMT,Atlantic/Azores
I 是否爲夏令時 若是是夏令時爲 1,不然爲 0
O 與格林威治時間相差的小時數 例如:+0200
完整的日期/時間 --- ---
c ISO 8601 格式的日期(PHP 5 新加) 2004-02-12T15:19:21+00:00
r RFC 822 格式的日期 例如:Thu, 21 Dec 2000 16:01:07 +0200
U 從 Unix 紀元(January 1 1970 00:00:00 GMT)開始至今的秒數 參見 time()
完整的 PHP Date 參考手冊
如需查看全部日期函數的完整參考手冊,請訪問咱們的 完整的 PHP Date 參考手冊。
該參考手冊提供了每一個函數的簡要描述和應用實例!
gettimeofday() 返回當前時間。
mktime(hour,minute,second,month,day,year)//時分秒月天年(Y-m-d h:i:sa)
下面的例子使用 mktime() 函數中的一系列參數來建立日期和時間:
實例
<?php
date_default_timezone_set("Asia/ShangHai");//設置默認位置
echo "如今時間是 " . date("Y.m.d.h:i:sa");//獲取當前時間
$d=mktime(9, 12, 31, 6, 10, 2015);
echo "建立日期是 " . date("Y-m-d h:i:sa", $d);
?>
30丶PHP include 和 require 語句
在 PHP 中,您能夠在服務器執行 PHP 文件以前在該文件中插入一個文件的內容。
include 和 require 語句用於在執行流中插入寫在其餘文件中的有用的代碼。
include 和 require 除了處理錯誤的方式不一樣以外,在其餘方面都是相同的:
require 生成一個致命錯誤(E_COMPILE_ERROR),在錯誤發生後腳本會中止執行。
include 生成一個警告(E_WARNING),在錯誤發生後腳本會繼續執行。
所以,若是您但願繼續執行,並向用戶輸出結果,即便包含文件已丟失,那麼請使用 include。
不然,在框架、CMS 或者複雜的 PHP 應用程序編程中,請始終使用 require 向執行流引用關鍵文件。
這有助於提升應用程序的安全性和完整性,在某個關鍵文件意外丟失的狀況下。
包含文件省去了大量的工做。這意味着您能夠爲全部網頁建立標準頁頭、頁腳或者菜單文件。
而後,在頁頭須要更新時,您只需更新這個頁頭包含文件便可。
語法
include 'filename';
或者
require 'filename';
31丶打開文件
fopen() 函數用於在 PHP 中打開文件。
此函數的第一個參數含有要打開的文件的名稱,第二個參數規定了使用哪一種模式來打開文件:
<html>
<body>
<?php
$file=fopen("welcome.txt","r");
?>
</body>
</html>
文件可能經過下列模式來打開:
模式 描述
r 只讀。在文件的開頭開始。
r+ 讀/寫。在文件的開頭開始。
w 只寫。打開並清空文件的內容;若是文件不存在,則建立新文件。
w+ 讀/寫。打開並清空文件的內容;若是文件不存在,則建立新文件。
a 追加。打開並向文件末尾進行寫操做,若是文件不存在,則建立新文件。
a+ 讀/追加。經過向文件末尾寫內容,來保持文件內容。
x 只寫。建立新文件。若是文件已存在,則返回 FALSE 和一個錯誤。
x+ 讀/寫。建立新文件。若是文件已存在,則返回 FALSE 和一個錯誤。
註釋:若是 fopen() 函數沒法打開指定文件,則返回 0 (false)。
實例
若是 fopen() 函數不能打開指定的文件,下面的實例會生成一段消息:
<html>
<body>
<?php
$file=fopen("welcome.txt","r") or exit("Unable to open file!");
?>
</body>
</html>
關閉文件
fclose() 函數用於關閉打開的文件:
<?php
$file = fopen("test.txt","r");
//執行一些代碼
fclose($file);
?>
檢測文件末尾(EOF)
feof() 函數檢測是否已到達文件末尾(EOF)。
在循環遍歷未知長度的數據時,feof() 函數頗有用。
註釋:在 w 、a 和 x 模式下,您沒法讀取打開的文件!
if (feof($file)) echo "文件結尾";
逐行讀取文件
fgets() 函數用於從文件中逐行讀取文件。
註釋:在調用該函數以後,文件指針會移動到下一行。
實例
下面的實例逐行讀取文件,直到文件末尾爲止:
<?php
$file = fopen("welcome.txt", "r") or exit("沒法打開文件!");
// 讀取文件每一行,直到文件結尾
while(!feof($file))
{
echo fgets($file). "<br>";
}
fclose($file);
?>
逐字符讀取文件
fgetc() 函數用於從文件中逐字符地讀取文件。
註釋:在調用該函數以後,文件指針會移動到下一個字符。
實例
下面的實例逐字符地讀取文件,直到文件末尾爲止:
<?php
$file=fopen("welcome.txt","r") or exit("沒法打開文件!");
while (!feof($file))
{
echo fgetc($file);
}
fclose($file);
?>
PHP Filesystem 參考手冊
如需查看 PHP 文件系統函數的完整參考手冊,請訪問咱們的PHP Filesystem 參考手冊。
注意:windows文件操做支持的是GBK格式,在PHP中對文件進行操做前要將非GBK文件經過iconv()函數進行轉碼操做;
$source = iconv("UTF-8","GBK//IGNORE",'F:\File\qaq.txt');
32丶cookie 經常使用於識別用戶。
Cookie 是什麼?
cookie 經常使用於識別用戶。cookie 是一種服務器留在用戶計算機上的小文件。每當同一臺計算機經過瀏覽器請求頁面時,
這臺計算機將會發送 cookie。經過 PHP,您可以建立並取回 cookie 的值。
如何建立 Cookie?
setcookie() 函數用於設置 cookie。
註釋:setcookie() 函數必須位於 <html> 標籤以前。
語法
setcookie(name, value, expire, path, domain);
實例 1
在下面的例子中,咱們將建立名爲 "user" 的 cookie,併爲它賦值 "php"。咱們也規定了此 cookie 在一小時後過時:
<?php
setcookie("user", "php", time()+3600);
?>
如何取回 Cookie 的值?
PHP 的 $_COOKIE 變量用於取回 cookie 的值。
在下面的實例中,咱們取回了名爲 "user" 的 cookie 的值,並把它顯示在了頁面上:
<?php
// 輸出 cookie 值
echo $_COOKIE["user"];
// 查看全部 cookie
print_r($_COOKIE);
?>
**咱們使用 isset() 函數來確認是否已設置了 cookie
33丶PHP session 變量用於存儲關於用戶會話(session)的信息,或者更改用戶會話(session)的設置。Session 變量存儲單一用戶的信息,
而且對於應用程序中的全部頁面都是可用的。
PHP Session 變量
您在計算機上操做某個應用程序時,您打開它,作些更改,而後關閉它。這很像一次對話(Session)。計算機知道您是誰。
它清楚您在什麼時候打開和關閉應用程序。然而,在因特網上問題出現了:因爲 HTTP 地址沒法保持狀態,
Web 服務器並不知道您是誰以及您作了什麼。
PHP session 解決了這個問題,它經過在服務器上存儲用戶信息以便隨後使用(好比用戶名稱、購買商品等)。
然而,會話信息是臨時的,在用戶離開網站後將被刪除。若是您須要永久存儲信息,能夠把數據存儲在數據庫中。
Session 的工做機制是:爲每一個訪客建立一個惟一的 id (UID),並基於這個 UID 來存儲變量。UID 存儲在 cookie 中,
或者經過 URL 進行傳導。
開始 PHP Session
在您把用戶信息存儲到 PHP session 中以前,首先必須啓動會話。
註釋:session_start() 函數必須位於 <html> 標籤以前
存儲和取回 session 變量的正確方法是使用 PHP $_SESSION 變量
unset() 函數用於釋放指定的 session 變量
註釋:session_destroy() 將重置 session,您將失去全部已存儲的 session 數據
34丶&這是引用符號,引用的意思是:不一樣的名字訪問同一個變量內容。php的引用(就是在變量或者函數、對象等前面加上&符號)。
PHP 的引用容許你用兩個變量來指向同一個內容.
<?
$a="AB";
$b =&$a;
echo $a;//這裏輸出:AB
echo $b;//這裏輸出:AB
$b="EF";
echo $a;//這裏$a的值變爲EF 因此輸出EF
echo $b;//這裏輸出EF
?>
exit(),die()和trigger_error()區別?
首先die()同等於exit(),二者若是執行都會停止PHP程序,並且在死以前均可以留句遺言!
exit()和die()惟一不一樣的是exit()能夠返回0--254狀態值,0表示返回成功。trigger_error()生成一個用戶警告來代替,
使程序更具備靈活性.例如:trigger_error("Cannotfindfile",E_USER_ERROR);
使用trigger_error()函數來替代die(),你的代碼在處理錯誤上會更具優點,對於客戶程序員來講更易於處理錯誤。
35丶PHP 過濾器用於驗證和過濾來自非安全來源的數據,好比用戶的輸入。
什麼是 PHP 過濾器?
PHP 過濾器用於驗證和過濾來自非安全來源的數據。
測試、驗證和過濾用戶輸入或自定義數據是任何 Web 應用程序的重要組成部分。
PHP 的過濾器擴展的設計目的是使數據過濾更輕鬆快捷。
爲何使用過濾器?
幾乎全部的 Web 應用程序都依賴外部的輸入。這些數據一般來自用戶或其餘應用程序(好比 web 服務)。
經過使用過濾器,您可以確保應用程序得到正確的輸入類型。
您應該始終對外部數據進行過濾!
輸入過濾是最重要的應用程序安全課題之一。
什麼是外部數據?
來自表單的輸入數據
Cookies
Web services data
服務器變量
數據庫查詢結果
函數和過濾器
如需過濾變量,請使用下面的過濾器函數之一:
filter_var() - 經過一個指定的過濾器來過濾單一的變量
filter_var_array() - 經過相同的或不一樣的過濾器來過濾多個變量
filter_input - 獲取一個輸入變量,並對它進行過濾
filter_input_array - 獲取多個輸入變量,並經過相同的或不一樣的過濾器對它們進行過濾
使用 Filter Callback
經過使用 FILTER_CALLBACK 過濾器,能夠調用自定義的函數,把它做爲一個過濾器來使用。
這樣,咱們就擁有了數據過濾的徹底控制權。
您能夠建立本身的自定義函數,也可使用已存在的 PHP 函數。
將您準備用到的過濾器的函數,按指定選項的規定方法進行規定。在關聯數組中,帶有名稱 "options"。
在下面的實例中,咱們使用了一個自定義的函數把全部 "_" 轉換爲空格:
<?php
function convertSpace($string)
{
return str_replace("_", ".", $string);
}
$string = "www_php_cn!";
echo filter_var($string, FILTER_CALLBACK,
array("options"=>"convertSpace"));
?>
上面代碼的結果以下所示:
實例解釋
上面的實例把全部 "_" 轉換成 "." :
建立一個把 "_" 替換爲 "." 的函數
調用 filter_var() 函數,它的參數是 FILTER_CALLBACK 過濾器以及包含咱們的函數的數組
36丶php--------對象(object) 與 數組(array) 的轉換
/**
* 數組 轉 對象
*
* @param array $arr 數組
* @return object
*/
function array_to_object($arr) {
if (gettype($arr) != 'array') {
return;
}
foreach ($arr as $k => $v) {
if (gettype($v) == 'array' || getType($v) == 'object') {
$arr[$k] = (object)array_to_object($v);
}
}
return (object)$arr;
}
/**
* 對象 轉 數組
*
* @param object $obj 對象
* @return array
*/
function object_to_array($obj) {
$obj = (array)$obj;
foreach ($obj as $k => $v) {
if (gettype($v) == 'resource') {
return;
}
if (gettype($v) == 'object' || gettype($v) == 'array') {
$obj[$k] = (array)object_to_array($v);
}
}
return $obj;
}
37丶PHP中echo,print(),print_r()的區別是什麼?
echo
能夠一次輸出多個值,多個值之間用逗號分隔。echo是語言結構(language construct),而並非真正的函數,
所以不能做爲表達式的一部分使用。
print()
函數print()打印一個值(它的參數),若是字符串成功顯示則返回true,不然返回false。
print_r()
能夠把字符串和數字簡單地打印出來,而數組則以括起來的鍵和值得列表形式顯示,並以Array開頭。
但print_r()輸出布爾值和NULL的結果沒有意義,由於都是打印"\n"。所以用var_dump()函數更適合調試。
38丶Validating 和 Sanitizing
有兩種過濾器:
Validiting 過濾器:
用於驗證用戶輸入
嚴格的格式規則(好比 URL 或 E-Mail 驗證)
若是成功則返回預期的類型,若是失敗則返回 FALSE
Sanitizing 過濾器:
用於容許或禁止字符串中指定的字符
無數據格式規則
始終返回字符串
選項和標誌
選項和標誌用於向指定的過濾器添加額外的過濾選項。
不一樣的過濾器有不一樣的選項和標誌。
39丶使用 Filter Callback
經過使用 FILTER_CALLBACK 過濾器,能夠調用自定義的函數,把它做爲一個過濾器來使用。
這樣,咱們就擁有了數據過濾的徹底控制權。
您能夠建立本身的自定義函數,也可使用已存在的 PHP 函數。
將您準備用到的過濾器的函數,按指定選項的規定方法進行規定。在關聯數組中,帶有名稱 "options"。
在下面的實例中,咱們使用了一個自定義的函數把全部 "_" 轉換爲空格:
<?php
function convertSpace($string)
{
return str_replace("_", ".", $string);
}
$string = "www_php_cn!";
echo filter_var($string, FILTER_CALLBACK,
array("options"=>"convertSpace"));
?>
上面代碼的結果以下所示:
實例解釋
上面的實例把全部 "_" 轉換成 "." :
建立一個把 "_" 替換爲 "." 的函數
調用 filter_var() 函數,它的參數是 FILTER_CALLBACK 過濾器以及包含咱們的函數的數組
40丶PHP鏈接數據庫有兩種方法
MYSQLi和PDO
我是該用 MySQLi ,仍是 PDO?
若是你須要一個簡短的回答,即 "你習慣哪一個就用哪一個"。
MySQLi 和 PDO 有它們本身的優點:
PDO 應用在 12 種不一樣數據庫中, MySQLi 只針對 MySQL 數據庫。
因此,若是你的項目須要在多種數據庫中切換,建議使用 PDO ,這樣你只須要修改鏈接字符串和部門查詢語句便可。 使用 MySQLi, 若是不一樣數據庫,你須要從新編寫全部代碼,包括查詢。
二者都是面向對象, 但 MySQLi 還提供了 API 接口。
二者都支持預處理語句。 預處理語句能夠防止 SQL 注入,對於 web 項目的安全性是很是重要的。
41丶使用 PDO:
<?php
$servername = "localhost";
$username = "username";
$password = "password";
try {
$conn = new PDO("mysql:host=$servername;dbname=myDB", $username, $password);
// 設置 PDO 錯誤模式爲異常
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$sql = "CREATE DATABASE myDBPDO";
// 使用 exec() ,由於沒有結果返回
$conn->exec($sql);
echo "數據庫建立成功<br>";
}
catch(PDOException $e)
{
echo $sql . "<br>" . $e->getMessage();
}
$conn = null;
?>
提示: 使用 PDO 的最大好處是在數據庫查詢過程出現問題時可使用異常類來 處理問題。
若是 try{ } 代碼塊出現異常,腳本會中止執行並會跳到第一個 catch(){ } 代碼塊執行代碼。
在以上捕獲的代碼塊中咱們輸出了 SQL 語句並生成錯誤信息。
執行多條數據庫操做時要用到事務
$conn->beginTransaction(); // 開始事務
/*要執行的數據操做 */
$conn->commit();//提交事務
$conn->rollback();// 若是執行失敗事務回滾,若是沒有執行開始事務的操做,那麼事務回滾會失敗
42丶PDO 中的預處理語句
如下實例咱們在 PDO 中使用了預處理語句並綁定參數:
使用預編譯更方便多條sql語句的操做
實例 (PDO 使用預處理語句)
$conn = new PDO("mysql:host=$server;dbname=test;charset=utf8", $name, $password);
$conn->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
$smt= $conn->prepare("insert into teacher(name,age) values (:name,:age)");//預處理
$smt->bindParam(":name",$name);//綁定行
$smt->bindParam(":age",$age);
$name="亞索";//給參數賦值
$age=17;
$smt->execute();//執行預編譯的sql語句
$name="雲韻";//給參數賦值
$age=19;
$smt->execute();//執行預編譯的sql語句
$sql="insert into teacher(name,age) value ('劍姬','21')";//增
$sql="delete from student where sno='31'";//刪
$sql="update student set sname='寒冰',sage='18' where sno='32'";//改
$stm=$conn->prepare("select * from student where sage=:sage");/查
$stm->bindParam(":sage",$sage);
$sage=17;
$stm->execute();
都採用預編譯比較好,預處理語句對於防止 MySQL 注入是很是有用的。
43丶XML 是什麼?
XML 用於描述數據,其焦點是數據是什麼。XML 文件描述了數據的結構。
44丶DOM XML 解析器函數是 PHP 核心的組成部分。無需安裝就可使用這些函數。
XML 文件
下面的 XML 文件將應用在咱們的實例中:
<?xml version="1.0" encoding="ISO-8859-1"?>
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
加載和輸出 XML
咱們須要初始化 XML 解析器,加載 XML,並把它輸出:
實例
<?php
$xmlDoc = new DOMDocument();
$xmlDoc->load("note.xml");
print $xmlDoc->saveXML();
?>
以上代碼將輸出:
ToveJaniReminder Don't forget me this weekend!
若是您在瀏覽器窗口中查看源代碼,會看到下面的 HTML:
<?xml version="1.0" encoding="ISO-8859-1"?>
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
上面的實例建立了一個 DOMDocument-Object,並把 "note.xml" 中的 XML 載入這個文檔對象中。
saveXML() 函數把內部 XML 文檔放入一個字符串,這樣咱們就能夠輸出它。
遍歷 XML
咱們要初始化 XML 解析器,加載 XML,並遍歷 <note> 元素的全部元素:
實例
<?php
$xmlDoc = new DOMDocument();
$xmlDoc->load("note.xml");
$x = $xmlDoc->documentElement;
foreach ($x->childNodes AS $item)
{
print $item->nodeName . " = " . $item->nodeValue . "<br>";
}
?>
以上代碼將輸出:
#text =
to = Tove
#text =
from = Jani
#text =
heading = Reminder
#text =
body = Don't forget me this weekend!
#text =
45丶PHP SimpleXML 處理最普通的 XML 任務,其他的任務則交由其它擴展處理。
什麼是 PHP SimpleXML?
SimpleXML 是 PHP 5 中的新特性。
SimpleXML 擴展提供了一種獲取 XML 元素的名稱和文本的簡單方式。
與 DOM 或 Expat 解析器相比,SimpleXML 僅僅用幾行代碼就能夠從 XML 元素中讀取文本數據。
SimpleXML 可把 XML 文檔(或 XML 字符串)轉換爲對象,好比:
元素被轉換爲 SimpleXMLElement 對象的單一屬性。當同一級別上存在多個元素時,它們會被置於數組中。
屬性經過使用關聯數組進行訪問,其中的索引對應屬性名稱。
元素內部的文本被轉換爲字符串。若是一個元素擁有多個文本節點,則按照它們被找到的順序進行排列。
當執行相似下列的基礎任務時,SimpleXML 使用起來很是快捷:
讀取/提取 XML 文件/字符串的數據
編輯文本節點或屬性
然而,在處理高級 XML 時,好比命名空間,最好使用 Expat 解析器或 XML DOM。
安裝
從 PHP 5 開始,SimpleXML 函數是 PHP 核心的組成部分。無需安裝就可使用這些函數。
PHP SimpleXML 實例
假設咱們有以下的 XML 文件,"note.xml":
<?xml version="1.0" encoding="ISO-8859-1"?>
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
如今咱們想要輸出上面的 XML 文件的不一樣信息:
實例 1
輸出 $xml 變量(是 SimpleXMLElement 對象)的鍵和元素:
<?php
$xml=simplexml_load_file("note.xml");
print_r($xml);
?>
以上代碼將輸出:
SimpleXMLElement Object ( [to] => Tove [from] => Jani [heading] => Reminder
[body] => Don't forget me this weekend! )
實例 2
輸出 XML 文件中每一個元素的數據:
<?php
$xml=simplexml_load_file("note.xml");
echo $xml->to . "<br>";
echo $xml->from . "<br>";
echo $xml->heading . "<br>";
echo
$xml->body;
?>
以上代碼將輸出:
Tove
Jani
Reminder
Don't forget me this weekend!
實例 3
輸出每一個子節點的元素名稱和數據:
<?php
$xml=simplexml_load_file("note.xml");
echo $xml->getName() . "<br>";
foreach($xml->children() as $child)
{
echo $child->getName() . ": " . $child . "<br>";
}
?>
以上代碼將輸出:
note
to: Tove
from: Jani
heading: Reminder
body: Don't forget me this weekend!
46丶PHP AJAX
1. XMLHttpRequest 對象的相關方法
1.1 XHR建立對象
var xmlhttp;
if (window.XMLHttpRequest)
{// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
}
else
{// code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
1.2 向服務端發送請求
xmlhttp.open("GET","test1.txt",true); //規定請求的類型、URL 以及是否異步處理請求。
xmlhttp.send(); //將請求發送到服務器。
方法參數解釋以下:
open(method,url,async)
method:請求的類型;GET 或 POST
url:文件在服務器上的位置
async:true(異步)或 false(同步)
send(string)
string:僅用於 POST 請求
若是須要像 HTML 表單那樣 POST 數據,請使用 setRequestHeader() 來添加 HTTP 頭。而後在 send() 方法中規定您但願發送的數據:
xmlhttp.setRequestHeader("content-type","text/xml;charset=utf-8"); //向請求中添加 HTTP 頭
方法參數解釋以下:
setRequestHeader(header,value)
header: 規定頭的名稱
value: 規定頭的值
1.3 服務器響應
如需得到來自服務器的響應,請使用 XMLHttpRequest 對象的 responseText 或 responseXML 屬性。
responseText 得到字符串形式的響應數據。
responseXML 得到 XML 形式的響應數據。
1.4 onreadystatechange 事件
當請求被髮送到服務器時,咱們須要執行一些基於響應的任務。每當 readyState 改變時,就會觸發 onreadystatechange 事件。
readyState:存有 XMLHttpRequest 的狀態。從 0 到 4 發生變化。
status:響應的HTTP狀態碼。
經過以前的Ajax調用公網服務的代碼能夠具體的瞭解XMLHttpRequest對象的使用。
複製代碼
var getXmlHttpRequest = function () {
try{
//主流瀏覽器提供了XMLHttpRequest對象
return new XMLHttpRequest();
}catch(e){
//低版本的IE瀏覽器沒有提供XMLHttpRequest對象,IE6如下
//因此必須使用IE瀏覽器的特定實現ActiveXObject
return new ActiveXObject("Microsoft.XMLHTTP");
}
};
//建立XMLHttpRequest對象
var xhr = getXmlHttpRequest();
//打開鏈接
xhr.open("post","http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx",true);
//設置數據類型
xhr.setRequestHeader("content-type","text/xml;charset=utf-8");
//設置回調函數
xhr.onreadystatechange=function(){
//判斷是否發送成功和判斷服務端是否響應成功
if(4 == xhr.readyState && 200 == xhr.status){
alert(xhr.responseText);
}
}
//組織SOAP協議數據 篇幅緣由,此處信息省略
var soapXML = "<?xml version=\"1.0\" encoding=\"utf-8\"?>····
····";
//發送數據
xhr.send(soapXML);
2. xmlhttp.readyState==4 && xmlhttp.status==200解析
2.1 readyState(狀態值)和status(狀態碼)的區別
readyState,是指運行AJAX所經歷過的幾種狀態,不管訪問是否成功都將響應的步驟,能夠理解成爲AJAX運行步驟,使用「ajax.readyState」得到
status,是指不管AJAX訪問是否成功,由HTTP協議根據所提交的信息,服務器所返回的HTTP頭信息代碼,使用「ajax.status」得到
整體理解:能夠簡單的理解爲state表明一個總體的狀態。而status是這個大的state下面具體的小的狀態。
2.2 什麼是readyState
readyState是XMLHttpRequest對象的一個屬性,用來標識當前XMLHttpRequest對象處於什麼狀態。
readyState總共有5個狀態值,分別爲0~4,每一個值表明了不一樣的含義
0:初始化,XMLHttpRequest對象尚未完成初始化
1:載入,XMLHttpRequest對象開始發送請求
2:載入完成,XMLHttpRequest對象的請求發送完成
3:解析,XMLHttpRequest對象開始讀取服務器的響應
4:完成,XMLHttpRequest對象讀取服務器響應結束
2.3 什麼是status
status是XMLHttpRequest對象的一個屬性,表示響應的HTTP狀態碼
在HTTP1.1協議下,HTTP狀態碼總共可分爲5大類
1xx:信息響應類,表示接收到請求而且繼續處理
2xx:處理成功響應類,表示動做被成功接收、理解和接受
3xx:重定向響應類,爲了完成指定的動做,必須接受進一步處理
4xx:客戶端錯誤,客戶請求包含語法錯誤或者是不能正確執行
5xx:服務端錯誤,服務器不能正確執行一個正確的請求
100——客戶必須繼續發出請求
101——客戶要求服務器根據請求轉換HTTP協議版本
200——交易成功
201——提示知道新文件的URL
202——接受和處理、但處理未完成
203——返回信息不肯定或不完整
204——請求收到,但返回信息爲空
205——服務器完成了請求,用戶代理必須復位當前已經瀏覽過的文件
206——服務器已經完成了部分用戶的GET請求
300——請求的資源可在多處獲得
301——刪除請求數據
302——在其餘地址發現了請求數據
303——建議客戶訪問其餘URL或訪問方式
304——客戶端已經執行了GET,但文件未變化
305——請求的資源必須從服務器指定的地址獲得
306——前一版本HTTP中使用的代碼,現行版本中再也不使用
307——申明請求的資源臨時性刪除
400——錯誤請求,如語法錯誤
401——請求受權失敗
402——保留有效ChargeTo頭響應
403——請求不容許
404——沒有發現文件、查詢或URl
405——用戶在Request-Line字段定義的方法不容許javascript
406——根據用戶發送的Accept拖,請求資源不可訪問
407——相似401,用戶必須首先在代理服務器上獲得受權
408——客戶端沒有在用戶指定的餓時間內完成請求
409——對當前資源狀態,請求不能完成
410——服務器上再也不有此資源且無進一步的參考地址
411——服務器拒絕用戶定義的Content-Length屬性請求
412——一個或多個請求頭字段在當前請求中錯誤
413——請求的資源大於服務器容許的大小
414——請求的資源URL長於服務器容許的長度
415——請求資源不支持請求項目格式
416——請求中包含Range請求頭字段,在當前請求資源範圍內沒有range指示值,請求也不包含If-Range請求頭字段
417——服務器不知足請求Expect頭字段指定的指望值,若是是代理服務器,多是下一級服務器不能知足請求
500——服務器產生內部錯誤
501——服務器不支持請求的函數
502——服務器暫時不可用,有時是爲了防止發生系統過載
503——服務器過載或暫停維修
504——關口過載,服務器使用另外一個關口或服務來響應用戶,等待時間設定值較長
505——服務器不支持或拒絕支請求頭中指定的HTTP版本
2.4 思考問題:爲何onreadystatechange的函數實現要同時判斷readyState和status呢?
第一種思考方式:只使用readyState
var getXmlHttpRequest = function () {
if (window.XMLHttpRequest) {
return new XMLHttpRequest();
}
else if (window.ActiveXObject) {
return new ActiveXObject("Microsoft.XMLHTTP");
}
};
var xhr = getXmlHttpRequest();
xhr.open("get", "1.txt", true);
xhr.send();
xhr.onreadystatechange = function () {
if (xhr.readyState == 4) {
alert(xhr.responseText);
}
};
服務響應出錯了,但仍是返回了信息,這並非咱們想要的結果
若是返回不是200,而是404或者500,因爲只使用readystate作判斷,它不理會放回的結果是200、404仍是500,只要響應成功返回了,就執行接下來的javascript代碼,結果將形成各類不可預料的錯誤。因此只使用readyState判斷是行不通的。
第二種思考方式:只使用status判斷
var getXmlHttpRequest = function () {
try{
return new XMLHttpRequest();
}catch(e){
return new ActiveXObject("Microsoft.XMLHTTP");
}
};
var xhr = getXmlHttpRequest();
xhr.open("get", "1.txt", true);
xhr.send();
xhr.onreadystatechange = function () {
if (xhr.status == 200) {
alert("readyState=" + xhr.readyState + xhr.responseText);
}
};
事實上,結果卻不像預期那樣。響應碼確實是返回了200,可是總共彈出了3次窗口!第一次是「readyState=2」的窗口,
第二次是「readyState=3」的窗口,
第三次是「readyState=4」的窗口。由此,可見onreadystatechange函數的執行不是隻在readyState變爲4的時候觸發的,
而是readyState(二、三、4)的每次變化都會觸發,因此就出現了前面說的那種狀況。可見,單獨使用status判斷也是行不通的。
5. readyState和status的前後判斷順序
由上面的試驗,咱們能夠知道判斷的時候readyState和status缺一不可。那麼readyState和status的前後判斷順序會不會有影響呢?
咱們能夠將status調到前面先判斷,代碼如 xhr.status == 200 && xhr.readyState == 4
事實上,這對於最終的結果是沒有影響的,可是中間的性能就不一樣了。由試驗咱們知道,
readyState的每次變化都會觸發onreadystatechange函數,假如先判斷status,那麼每次都會多判斷一次status的狀態。
雖然性能上影響甚微,不過仍是應該抱着追求極致代碼的想法,把readyState的判斷放在前面。
xhr.readyState == 4 && xhr.status == 200
47丶PHP gettype() 函數
gettype() 函數用於獲取變量的類型。
注意:不要使用 gettype() 來測試某種類型,由於其返回的字符串在將來的版本中可能須要改變。
此外,因爲包含了字符串的比較,它的運行也是較慢的。使用 is_* 函數代替。
版本要求:PHP 4, PHP 5, PHP 7
語法
string gettype ( mixed $var )
參數說明:
$var:變量。
返回值
返回字符串,可能值爲:
boolean
integer
double
string
array
object
resource
NULL
unknown type
實例
實例
<?php
echo gettype(102) . PHP_EOL;
echo gettype(true) . PHP_EOL;
echo gettype(' ') . PHP_EOL;
echo gettype(null) . PHP_EOL;
echo gettype(array()) . PHP_EOL;
echo gettype(new stdclass());
?>
輸出結果爲:
integer
boolean
string
NULL
array
object
48丶Return
若是在一個函數中調用 return 語句,將當即結束此函數的執行並將它的參數做爲函數的值返回。
return 也會終止 eval() 語句或者腳本文件的執行。
若是在全局範圍中調用,則當前腳本文件停止運行。若是當前腳本文件是被 include 的或者 require 的,
則控制交回調用文件。此外,若是當前腳本是被 include 的,
則 return 的值會被看成 include 調用的返回值。若是在主腳本文件中調用 return,則腳本停止運行。
若是當前腳本文件是在 php.ini 中的配置選項 auto_prepend_file 或者 auto_append_file 所指定的,則此腳本文件停止運行。
更多信息見返回值。
Note: 注意既然 return 是語言結構而不是函數,所以其參數沒有必要用括號將其括起來。一般都不用括號,實際上也應該不用,
這樣能夠下降 PHP 的負擔。
Note: 若是沒有提供參數,則必定不能用括號,此時返回 NULL。若是調用 return 時加上了括號卻又沒有參數會致使解析錯誤。
Note: 當用引用返回值時永遠不要使用括號,這樣行不通。只能經過引用返回變量,而不是語句的結果。若是使用 return ($a);
時其實不是返回一個變量,而是表達式 ($a) 的值(固然,此時該值也正是 $a 的值)。
49丶PHP eval() 函數
PHP 雜項函數
定義和用法
eval() 函數把字符串按照 PHP 代碼來計算。
該字符串必須是合法的 PHP 代碼,且必須以分號結尾。
若是沒有在代碼字符串中調用 return 語句,則返回 NULL。若是代碼中存在解析錯誤,則 eval() 函數返回 false。
語法
eval(phpcode)
參數 描述
phpcode 必需。規定要計算的 PHP 代碼。
提示和註釋
註釋:返回語句會當即終止對字符串的計算。
註釋:該函數對於在數據庫文本字段中供往後計算而進行的代碼存儲頗有用。
例子
<?php
$string = "beautiful";
$time = "winter";
$str = 'This is a $string $time morning!';
echo $str. "<br />";
eval("\$str = \"$str\";");
echo $str;
?>
輸出:
This is a $string $time morning!
This is a beautiful winter morning!
50丶語法:get_object_var($object),返回一個數組。獲取$object對象中的屬性,組成一個數組
實例:
<?php
class person{
public $name="王美人";
public $age = 25;
public $birth;
}
$p = new person();
print_r(get_object_vars($p));
?>
輸出結果:
Array ( [name] => 王美人 [age] => 25 [birth] => )
51丶PHP is_array() 函數
PHP 可用的函數PHP 可用的函數
is_array() 函數用於檢測變量是不是一個數組。
PHP 版本要求:PHP 4, PHP 5, PHP 7
語法
bool is_array ( mixed $var )
參數說明:
$var:要檢測的變量。
返回值
若是檢測的變量是數組,則返回 TRUE,不然返回 FALSE。
實例
實例
<?php
$arr_site = array('Google', 'Runoob', 'Facebook');
if(is_array($arr_site)){
echo '變量 $arr_site 是一個數組';
} else {
echo '變量 $arr_site 不是一個數組';
}
?>
輸出結果爲:
變量 $arr_site 是一個數組
52丶 PHP 正則表達式匹配函數 preg_match 與 preg_match_all
preg_match()
preg_match() 函數用於進行正則表達式匹配,成功返回 1 ,不然返回 0 。
語法:
int preg_match( string pattern, string subject [, array matches ] )
參數說明:
參數 說明
pattern 正則表達式
subject 須要匹配檢索的對象
matches 可選,存儲匹配結果的數組, $matches[0] 將包含與整個模式匹配的文本,
$matches[1] 將包含與第一個捕獲的括號中的子模式所匹配的文本,以此類推
例子 1:
<?php
if (preg_match("/php/i", "PHP is the web scripting language of choice.", $matches))
{
print "A match was found:" . $matches[0];
}
else
{
print "A match was not found.";
}
輸出:
A match was found:PHP
在該例子中,因爲使用了 i 修正符,所以會不區分大小寫去文本中匹配 php 。
注意:
preg_match() 第一次匹配成功後就會中止匹配,若是要實現所有結果的匹配,
即搜索到subject結尾處,則需使用 preg_match_all() 函數。
例子 2 ,從一個 URL 中取得主機域名 :
<?php
// 從 URL 中取得主機名
preg_match("/^(http:\/\/)?([^\/]+)/i","http://blog.snsgou.com/index.php", $matches);
$host = $matches[2];
// 從主機名中取得後面兩段
preg_match("/[^\.\/]+\.[^\.\/]+$/", $host, $matches);
echo "域名爲:{$matches[0]}";
輸出:
域名爲:snsgou.com
preg_match_all()
preg_match_all() 函數用於進行正則表達式全局匹配,成功返回整個模式匹配的次數(可能爲零),若是出錯返回 FALSE 。
語法:
int preg_match_all( string pattern, string subject, array matches [, int flags ] )
參數說明:
參數 說明
pattern 正則表達式
subject 須要匹配檢索的對象
matches 存儲匹配結果的數組
flags
可選,指定匹配結果放入 matches 中的順序,可供選擇的標記有:
PREG_PATTERN_ORDER:默認,對結果排序使 $matches[0] 爲所有模式匹配的數組,$matches[1] 爲第一個括號中的子模式所匹配的字符串組成的數組,以此類推
PREG_SET_ORDER:對結果排序使 $matches[0] 爲第一組匹配項的數組,$matches[1] 爲第二組匹配項的數組,以此類推
PREG_OFFSET_CAPTURE:若是設定本標記,對每一個出現的匹配結果也同時返回其附屬的字符串偏移量
下面的例子演示了將文本中全部 <pre></pre> 標籤內的關鍵字(php)顯示爲紅色。
<?php
$str = "<pre>學習php是一件快樂的事。</pre><pre>全部的phper須要共同努力!</pre>";
$kw = "php";
preg_match_all('/<pre>([\s\S]*?)<\/pre>/', $str, $mat);
for ($i = 0; $i < count($mat[0]); $i++)
{
$mat[0][$i] = $mat[1][$i];
$mat[0][$i] = str_replace($kw, '<span style="color:#ff0000">' . $kw . '</span>', $mat[0][$i]);
$str = str_replace($mat[1][$i], $mat[0][$i], $str);
}
echo $str;
?>
53丶PHP filter_has_var() 函數
PHP Filter 參考手冊 完整的 PHP Filter 參考手冊
定義和用法
filter_has_var() 函數檢查是否存在指定輸入類型的變量。
若是成功則返回 TRUE,若是失敗則返回 FALSE。
語法
filter_has_var(type, variable)
參數 描述
type 必需。規定要檢查的類型。
可能的輸入類型:
INPUT_GET
INPUT_POST
INPUT_COOKIE
INPUT_SERVER
INPUT_ENV
variable 必需。規定要檢查的變量。
實例
在本實例中,輸入變量 "name" 被髮送到 PHP 頁面:
<?php
if(!filter_has_var(INPUT_GET, "name"))
{
echo("Input type does not exist");
}
else
{
echo("Input type exists");
}
?>
代碼的輸出以下所示:
Input type exists
53丶AJAX RSS 閱讀器
在下面的實例中,咱們將演示一個 RSS 閱讀器,經過它,來自 RSS 的內容在網頁不進行刷新的狀況下被載入:
RSS-feed 數據列表...
實例解釋 - HTML 頁面
當用戶在上面的下拉列表中選擇某個 RSS-feed 時,會執行名爲 "showRSS()" 的函數。該函數由 "onchange" 事件觸發:
<html>
<head>
<meta charset="utf-8">
<title>php中文網(php.cn)</title>
<script>
function showRSS(str)
{
if (str.length==0)
{
document.getElementById("rssOutput").innerHTML="";
return;
}
if (window.XMLHttpRequest)
{
// IE7+, Firefox, Chrome, Opera, Safari 瀏覽器執行代碼
xmlhttp=new XMLHttpRequest();
}
else
{
// IE6, IE5 瀏覽器執行代碼
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange=function()
{
if (xmlhttp.readyState==4 && xmlhttp.status==200)
{
document.getElementById("rssOutput").innerHTML=xmlhttp.responseText;
}
}
xmlhttp.open("GET","getrss.php?q="+str,true);
xmlhttp.send();
}
</script>
</head>
<body>
<form>
<select onchange="showRSS(this.value)">
<option value="">選擇一個 RSS-feed:</option>
<option value="rss">讀取 RSS 數據</option>
</select>
</form>
<br>
<div id="rssOutput">RSS-feed 數據列表...</div>
</body>
</html>
showRSS() 函數會執行如下步驟:
檢查是否有 RSS-feed 被選擇
建立 XMLHttpRequest 對象
建立在服務器響應就緒時執行的函數
向服務器上的文件發送請求
請注意添加到 URL 末端的參數(q)(包含下拉列表的內容)
PHP 文件
文件 rss_demo.xml。
上面這段經過 JavaScript 調用的服務器頁面是名爲 "getrss.php" 的 PHP 文件:
<?php
// rss 文件php
$xml="rss_demo.xml";
$xmlDoc = new DOMDocument();
$xmlDoc->load($xml);
// 從 "<channel>" 中讀取元素
$channel=$xmlDoc->getElementsByTagName('channel')->item(0);
$channel_title = $channel->getElementsByTagName('title')
->item(0)->childNodes->item(0)->nodeValue;
$channel_link = $channel->getElementsByTagName('link')
->item(0)->childNodes->item(0)->nodeValue;
$channel_desc = $channel->getElementsByTagName('description')
->item(0)->childNodes->item(0)->nodeValue;
// 輸出 "<channel>" 中的元素
echo("<p><a href='" . $channel_link
. "'>" . $channel_title . "</a>");
echo("<br>");
echo($channel_desc . "</p>");
// 輸出 "<item>" 中的元素
$x=$xmlDoc->getElementsByTagName('item');
for ($i=0; $i<=1; $i++) {
$item_title=$x->item($i)->getElementsByTagName('title')
->item(0)->childNodes->item(0)->nodeValue;
$item_link=$x->item($i)->getElementsByTagName('link')
->item(0)->childNodes->item(0)->nodeValue;
$item_desc=$x->item($i)->getElementsByTagName('description')
->item(0)->childNodes->item(0)->nodeValue;
echo ("<p><a href='" . $item_link
. "'>" . $item_title . "</a>");
echo ("<br>");
echo ($item_desc . "</p>");
}
?>
當 RSS feed 的請求從 JavaScript 發送到 PHP 文件時,將發生:
檢查哪一個 RSS feed 被選中
建立一個新的 XML DOM 對象
在 xml 變量中加載 RSS 文檔
從 channel 元素中提取並輸出元素
從 item 元素中提取並輸出元素
54丶1、onchange()
官方解釋都是:在元素值改變時觸發
但是天真的小編真的覺得,只要是輸入框的內容以改變就會觸發onchange事件,最終發現,觸發是有條件的。
條件:一、綁定onchange事件
二、輸入框當前的值與之前的值是不一致
三、輸入框焦點離開時,纔會比較值是否一致(當時我就沒有理解這裏)
2、onkeyup()
onkeyup():按鍵彈起時觸發
onkeydown():按鍵按下的時候發生,文字輸入以前發生
onkeypress():事件會在鍵盤按鍵被按下並釋放一個鍵時發生
按住按鍵不放,此時會不斷的觸發onkeydown,可是onkeyup、onkeypress只在按鍵擡起的時候觸發一次。
整個過程是這樣的:有鍵按下—>產生onkeydown事件—>若是是有ASCII碼的按鍵—>產生onkeypress事件—>
有鍵釋放——>產生onkeyup事件
3、總結
在作項目的時候能夠看一下相關的相似事件,看看哪一個是真正適合的,這樣會避免不少錯誤的出現。
55丶 php中實現頁面跳轉的幾種方式
PHP中實現頁面跳轉有一下幾種方式,看了幾我的寫的不是很條理,本身整理一下
在PHP腳本代碼中實現
<?php header("location:url地址") ?> 例如 <?php header("location:helloworld.php")?>
頁面會當即跳轉,由於header執行了location重定向
延遲跳轉(好比登錄成功後會有幾秒鐘等待時間,而後跳轉到了其餘頁面)
<?php header("Refresh:秒數;url=地址") ?> 例如 <?php header("Refresh:3;url=helloworld.php")?> 會在3秒後執行跳轉
<?php sleep(3); header("location:url地址")?> 調用了sleep()方法,效果也是x秒後執行跳轉
在js腳本代碼中實現
1.window.location.href方法
<script type="text/javascript">
window.location.href="helloworld.php"
</script>
使用js方法實現延遲跳轉
<script type="text/javascript">
setTimeout("window.location.href='helloworld.php'",3000);
</script>
2.window.location.assign方法 延遲跳轉方法同上
<script type="text/javascript">window.location.assign("helloworld.php");
</script>
3.window.location.replace方法 (讓新頁面替換掉當前頁面,不會保存在歷史記錄裏,全部不能使用瀏覽器後退到原頁面了)
<script type="text/javascript">
window.location.replace("helloworld.php");
</script>
4.window.open方法 三個參數,第一個URL地址。第二個打開新頁面方式
(好比新頁面_blank,_new,自身跳轉_self),第三個是新頁面的方式,包括樣式,位置等。
<script type="text/javascript">
window.open("index.php",_blank,width=300px);
</script>
使用HTML腳本代碼完成跳轉
在<head>標籤裏執行代碼
直接插入這句代碼就能夠
<meta http-equiv="refresh" content="3;url='helloworld.php'">
56丶可以使用CSS屬性:
pointer-events: none;設置<a>標籤的disable屬性
57丶PHP設置時間隨時變化
php的幾種獲取當前時間的函數
方法一date函數
echo date(‘y-m-d h:i:s’,time());
//2010-08-29 11:25:26
方法二 time函數
$time = time();
echo date("y-m-d",$time) //2010-08-29
方法三 $_server['server_time']
方法四 strftime
echo strftime ("%hh%m %a %d %b" ,time());
18h24 sunday 21 may
還有一個問題就是時區問題,php環境默認時差與北京時間相差8小時,咱們要想獲取正確的時間就必須設置
在php文件開始處 加上date_default_timezone_set('prc');
或在php.ini裏面 date.timezone=prc;嗾。
記得修改了php.ini要重起apache
58丶PHP 單引號與雙引號的區別(總結)
PHP 單引號與雙引號的區別
原文地址:http://www.jb51.net/article/21035.htm
看好多代碼有時候用單引號或雙引號實現包含字符串的內容,其實簡單個歸納下雙引號中的變量能夠解析,單引號就是絕對的字符串。
一、定義字符串
在PHP中,字符串的定義可使用單引號,也可使用雙引號。可是必須使用同一種單或雙引號來定義字符串,如:‘Hello"和「
Hello'爲非法的字符串定義。
定義字符串時,只有一種引號被視爲定義符,即單引號或雙引號。因而,若是一個字符串由雙引號開始,那麼只有雙引號被分析器解析。
這樣,你就能夠在雙引號串中包含任何其餘字符,甚至單引號。下面的引號串都是合法的:
Php代碼
複製代碼 代碼以下:
$s = "I am a 'single quote string' inside a double quote string";
$s = 'I am a "double quote string" inside a single quote string';
$s = "I am a 'single quote string' inside a double quote string";
$s = 'I am a "double quote string" inside a single quote string';
而串 "Why doesn't "this" work?" 則會被分爲三段。若是在這個串中想要表示出雙引號,則可使用轉義符"\"(反斜線),
變成 "Why doesn't \"this\" work?" 便可。
二、字符串變量中的單、雙引號
PHP容許咱們在雙引號串中直接包含字串變量,咱們能夠發現下面的兩個字串的處理結果是相同的。
複製代碼 代碼以下:
$full_name = $first_name . ' ' . $last_name;
$full_name = "$first_name $last_name";
單引號串和雙引號串在PHP中的處理是不相同的。雙引號串中的內容能夠被解釋並且替換,
而單引號串中的內容總被認爲是普通字符。例如:
Php代碼
複製代碼 代碼以下:
$foo = 2;
echo "foo is $foo"; // 打印結果: foo is 2
echo 'foo is $foo'; // 打印結果: foo is $foo
echo "foo is $foo\n"; // 打印結果: foo is 2 (同時換行)
echo 'foo is $foo\n'; // 打印結果: foo is $foo\n
$foo = 2;
echo "foo is $foo"; // 打印結果: foo is 2
echo 'foo is $foo'; // 打印結果: foo is $foo
echo "foo is $foo\n"; // 打印結果: foo is 2 (同時換行)
echo 'foo is $foo\n'; // 打印結果: foo is $foo\n
正如你所看到的,在單引號串中甚至反斜槓也失去了他的擴展含義(除了插入反斜槓\\和插入單引號\')。因此,當你想在字串中進行變量代換和包 含\n(換行符)等轉義序列時,你應該使用雙引號。單引號串能夠用在其餘任何地方,腳本中使用單引號串處理速度會更快些,由於PHP語法分析器對單引號串 的處理方式比較單純,而雙引號的處理因爲串內部也須要解析,所以更復雜些,因此處理速度略慢。
在字符串中引用複雜的變量組合時,可能會產生一些問題,下面的代碼會正常工做:
Php代碼
複製代碼 代碼以下:
echo "value = $foo";
echo "value = $a[$i]";
echo "value = $foo";
echo "value = $a[$i]";
而下面的代碼卻不能獲得咱們但願的結果:
echo "value = $a[$i][$j]"; //咱們但願打印二維數組$a的某個元素。
爲避免這些字串使用中的潛在問題,咱們一般把複雜的變量從字串中分離開來,就像這樣:echo 'value =
' . $a[$i][$j];//字符串的鏈接用點(.)
還有一種辦法是將複雜變量用花括號括起來,語法分析器就能正確辨認了:
echo "value = {$a[$i][$j]}" //打印二維數組$a的某個元素
三、在SQL語句中
這是會常常遇到的問題,在插入數據庫的SQL語句是採用單引號來定義字符串,若是要將一個含有單引號的字符串插入數據庫,
這個SQL語句就會出錯。
如:$sql="insert into userinfo (username,password) Values('O'Kefee','123456')"
此時,處理的方法之一是在SQL語句中加入轉義符反斜線,
即:……Values('O\'Kefee',……
固然也可使用函數 addslashes(),該函數的功能就是加入轉義符,
即:$s = addslashes("O'Kefee") ……Values('".$s."',……
還有一種方法是設置php.ini中的magic-quotes選項,打開該選項,則經過表單提交的信息中若是有單引號是,將會自動加上如轉義符。所以不用使用其餘函數了。
補充: 這就要從雙引號和單引號的做用講起: 雙引號裏面的字段會通過編譯器解釋而後再看成HTML代碼輸出,可是單引號裏面的不須要解釋,直接輸出。
例如:
複製代碼 代碼以下:
$abc='I love u';
echo $abc //結果是:I love u
echo '$abc' //結果是:$abc
echo "$abc" //結果是:I love u
因此在對數據庫裏面的SQL語句賦值的時候也要用在雙引號裏面SQL="select a,b,c from ..." 可是SQL語句中會有單引號把字段名引出來
例如:select * from table where user='abc';
這裏的SQL語句能夠直接寫成SQL="select * from table where user='abc'"
可是若是象下面:
複製代碼 代碼以下:
$user='abc';
SQL1="select * from table where user=' ".$user." ' ";對比一下
SQL2="select * from table where user=' abc ' "
我把單引號和雙引號之間多加了點空格,但願你能看的清楚一點。
也就是把'abc' 替換爲 '".$user."'都是在一個單引號裏面的。只是把整個SQL字符串分割了。 SQL1能夠分解爲如下3個部分
1:"select * from table where user=' "
2:$user
3:" ' "
字符串之間用 . 來鏈接,這樣能明白了吧。
1、引號定義字符串
在PHP中,一般一個字符串被定義在一對引號中,如:
'I am a string in single quotes'
"I am a string in double quotes"
PHP語法分析器是用成對的引號來判斷一個字符串的。所以,全部字符串必須使用同一種單或者雙
引號來定義開始和結束。例如,下面的字串定義是不合法的:
"I am not a valid string since I have unmatching quote marks'
'Me neither!"
定義字符串時,只有一種引號被視爲定義符,即單引號或雙引號。因而,若是一個字符串由雙引
號開始,那麼只有雙引號被分析器解析。這樣,你就能夠在雙引號串中包含任何其餘字符,甚至單引
號。下面的引號串都是合法的:
$s = "I am a 'single quote string' inside a double quote string";
$s = 'I am a "double quote string" inside a single quote string';
當PHP遇到與串的開頭相對應的引號時,便認爲已經到了字符串尾部,因而:
"Why doesn't "this" work?"
實際上被PHP語法分析器分紅三個部分:
"Why doesn't "——包含一個單引號的雙引號串
this——多餘的字符,分析器沒法處理
" work?" ——普通字符串
上面的這個例子企圖在雙引號串中包含雙引號,而分析器在遇到第二個雙引號時便認爲字符串結
束了。要達到包含引號的目的,必須分析器在遇到串內普通引號的時候忽略它的原意,咱們在引號的
前面加上一個反斜槓來告訴PHP:這個引號是字符串的一部分,正確的表示方法是這樣:
"Why doesn't \"that\" work?"
在英文字符串中一個常見的問題是撇號'的使用,由於它就是一個單引號,而在英文串中十分常見
(英文全部格)。你必須當心處理這些字符:
'You\'d better escape your apostrophes'
能夠看到反斜槓在字符串中有他的特殊含義,當咱們須要在字符串中包含反斜槓自己時,須要在
該符號前面多加一個反斜槓。例如:
$file = "c:\windows\system.ini";
echo $file; // 打印結果爲: c:windowssystem.ini
$file = "c:\\windows\\system.ini";
echo $file; // 打印結果爲: c:\windows\system.ini
另外一種字符串定義方式,可以消除特殊字符的煩惱,並且便於引用較長的文本。該字符串定義方
法以<<<符號緊跟一個自定義字符串開頭,最後一行以該自定義字符串結束,而且必須頂格。
2、字串的鏈接
字串可使用字串鏈接符(.)來鏈接,如:
$first_name = 'Charlie';
$last_name = 'Brown';
$full_name = $first_name . ' ' . $last_name;
常見的用途是創建大塊的HTML字串代碼,賦值號 (=) 鏈接符 (.) 能夠被簡寫合併爲 (.=) 符
號,如:
$html = '<table>';
$html .= '<tr><td>number</td><td>square</td></tr>';
for ( $i=0 ; $i<10 ; $i++) {
$square = $i * $i;
$html .= '<tr><td>' . $i . '</td><td>' . $square . '</td></tr>';
}
$html .= '</table>';
3、在字串中使用變量
這個功能讓你無須使用鏈接符號來粘和大量的簡單字符串。PHP容許咱們在雙引號串中直接包含字
串變量,咱們能夠發現下面的兩個字串的處理結果是相同的。
$full_name = $first_name . ' ' . $last_name;
$full_name = "$first_name $last_name";
單引號串和雙引號串在PHP中的處理是不相同的。雙引號串中的內容能夠被解釋並且替換,而單引
號串中的內容總被認爲是普通字符。例如:
$foo = 2;
echo "foo is $foo"; // 打印結果: foo is 2
echo 'foo is $foo'; // 打印結果: foo is $foo
echo "foo is $foo\n"; // 打印結果: foo is 2 (同時換行)
echo 'foo is $foo\n'; // 打印結果: foo is $foo\n
正如你所看到的,在單引號串中甚至反斜槓也失去了他的擴展含義(除了插入反斜槓\\和插入單
引號\')。因此,當你想在字串中進行變量代換和包含\n(換行符)等轉義序列時,你應該使用雙引
號。單引號串能夠用在其餘任何地方,腳本中使用單引號串處理速度會更快些,由於PHP語法分析器對
單引號串的處理方式比較單純,而雙引號的處理因爲串內部也須要解析,所以更復雜些,因此處理速
度略慢。
在字符串中引用複雜的變量組合時,可能會產生一些問題,下面的代碼會正常工做:
echo "value = $foo";
echo "value = $a[$i]";
而下面的代碼卻不能獲得咱們但願的結果:
echo "value = $a[$i][$j]"; //咱們但願打印二維數組$a的某個元素。
爲避免這些字串使用中的潛在問題,咱們一般把複雜的變量從字串中分離開來,就像這樣:
echo 'value = ' . $a[$i][$j];
還有一種辦法是將複雜變量用花括號括起來,語法分析器就能正確辨認了:
echo "value = {$a[$i][$j]}" //打印二維數組$a的某個元素
這樣,又出現新問題了。當咱們想在字串中引用花括號字符自己時,就要記得使用轉義符了:
$var = 3;
echo "value = {$var}"; // 打印結果 "value = 3"
echo "value = \{$var}"; // 打印結果 "value = \{3}"
因爲轉義字符對{}進行了其餘處理\p{xx},不適用此例,能夠以下代替:
var_dump("value = {".$var."}") ; // 打印結果 "value = {3}"
3、斜槓和SQL語句
生成HTML代碼或SQL查詢語句是編寫PHP程序時常常遇到並且是件有趣的事情。爲何這麼說呢,
由於這涉及到生成另一種類型的代碼,你必須仔細地考慮和遵循這種代碼所要求的編寫語法和規
則。
咱們來看這樣一個例子,假如你想查詢數據庫中名字是「O'Keefe」的用戶,一般SQL語句的形式
是這樣的:
select * from users where last_name = 'O\'Keefe'
請注意SQL語句這個英文全部格(撇號)需使用反斜槓轉義。PHP專門提供了一些函數來處理這樣
的狀況,函數AddSlashes($str)的用途就是自動在字串中對引號字符插入反斜槓轉義符:
$last_name = "O'Keefe";
$sql = "select * from users where last_name = '" . addslashes($last_name) . "'";
在這個例子中,你還要在last_name字串外面括上單引號(SQL語法要求),因爲這裏使用的是雙
引號串,因此對這對單引號就無須使用轉義了。下面的這個語句是使用單引號串的等價形式:
$sql = 'select * from users where last_name = \'' . addslashes($last_name) . '\'';
任什麼時候候你要在數據庫中寫入字串,你都必須確保裏面的引號正確使用了轉義符號,這是不少PHP
初學者常犯的錯誤。
4、雙引號和HTML
與SQL語句不一樣,在標準HTML語言中雙引號常被用來表示字串(如今不少瀏覽器具有較強的容錯功
能,容許在HTML中用單引號甚至不用引號表示字符串),例如:
$html = '<a href="'.$url.'">'.$link.'</a>';
$html = "<a href=\"$url\">$link</a>";
HTML語言不支持反斜槓轉義,這一點在咱們使用表單的hidden inputs來傳輸數據的時候就會有所
體會了。設置hidden inputs的值的最好辦法,是使用htmlspecialchars()函數來編碼。下面的語句可
以正常傳輸一個可能包含雙引號的數據:
<input type=hidden name=var value="<?php echo htmlspecialchars($var) ?>">
1、引號定義字符串。要達到包含引號的目的, 必須分析器在遇到串內普通引號的時候忽略它的原意,
咱們在引號的 前面加上一個反斜槓來告訴PHP:這個引號是字符串的一部分,正確的表示方法是這樣:單引號串能夠用在其餘任何地方,
腳本中使用單引號串處理速度會更快些,由於PHP語法分析器對 單引號串的處理方式比較單純,
而雙引號的處理因爲串內部也須要解析,所以更復雜些,因此處理速 度略慢。
這個...雙引號轉義,單引號不轉義
如:/r/n是換行,可是若是你用單引號寫入文件,不會是換行,而是一個字符,若是用雙引號寫入文件,就是換行.
贊成。
59.Jquery的parent和parents(找到某一特定的祖先元素)用法
parent是指取得一個包含着全部匹配元素的惟一父元素的元素集合。
parents則是取得一個包含着全部匹配元素的祖先元素的元素集合(不包含根元素)。能夠經過一個可選的表達式進行篩選。
parent取得很明確就是當前元素的父元素
parents則是當前元素的祖先元素
60. PHP類中self和$this的區別
1.self表明類,$this表明對象
2.能用$this的地方必定使用self,能用self的地方不必定能用$this
靜態的方法中不能使用$this,靜態方法給類訪問的。
self調用的是類,而$this調用的則是實例化的對象
html