基本的 PHP 語法
PHP 中的每個代碼行都必須以分號結束。分號是一種分隔符,用於把指令集區分開來。
通過 PHP,有兩種在瀏覽器輸出文本的基礎指令:echo 和 print。
-
<!DOCTYPE html>
-
<html>
-
<body>
-
-
<h1>My first PHP page</h1>
-
-
<?php
-
echo "Hello World!";
-
?>
-
-
</body>
-
</html>
PHP 變量
變量是用於存儲數據的容器。
-
<?php
-
$x=5;
-
$y=6;
-
$z=$x+$y;
-
echo $z;
-
?>
創建(聲明)PHP 變量
PHP 沒有聲明變量的命令。
變量在您第一次賦值給它的時候被創建:
-
<?php
-
$txt="Hello world!";
-
$x=5;
-
$y=10.5;
-
echo $txt;
-
?>
PHP 變量作用域
變量的作用域是腳本中變量可被引用/使用的部分。
PHP 有四種不同的變量作用域:
- local
- global
- static
- parameter
局部和全局作用域
在所有函數外部定義的變量,擁有全局作用域。除了函數外,全局變量可以被腳本中的任何部分訪問,要在一個函數中訪問一個全局變量,需要使用 global 關鍵字。
在 PHP 函數內部聲明的變量是局部變量,僅能在函數內部訪問:
-
<?php
-
$x=5;
-
-
function myTest()
-
{
-
$y=10;
-
echo "<p>測試函數內變量:<p>";
-
echo "變量 x 爲: $x";
-
echo "<br>";
-
echo "變量 y 爲: $y";
-
}
-
-
myTest();
-
-
echo "<p>測試函數外變量:<p>";
-
echo "變量 x 爲: $x";
-
echo "<br>";
-
echo "變量 y 爲: $y";
-
?>
在以上實例中 myTest() 函數定義了 $x 和 $y 變量。$x 變量在函數外聲明,所以它是全局變量, $y 變量在函數內聲明所以它是局部變量。
當我們調用myTest()函數並輸出兩個變量的值,函數將會輸出局部變量 $y 的值,但是不能輸出 $x 的值,因爲 $x 變量在函數外定義,無法在函數內使用,如果要在一個函數中訪問一個全局變量,需要使用 global 關鍵字。
然後我們在myTest()函數外輸出兩個變量的值,函數將會輸出全局部變量 $x 的值,但是不能輸出 $y 的值,因爲 $y 變量在函數中定義,屬於局部變量。
你可以在不同函數中使用相同的變量名稱,因爲這些函數內定義的變量名是局部變量,只作用於該函數內。
PHP global 關鍵字
global 關鍵字用於函數內訪問全局變量。
在函數內調用函數外定義的全局變量,我們需要在函數中的變量前加上 global 關鍵字:
-
<?php
-
$x=5;
-
$y=10;
-
-
function myTest()
-
{
-
global $x,$y;
-
$y=$x+$y;
-
}
-
-
myTest();
-
echo $y;
-
?>
PHP 將所有全局變量存儲在一個名爲 $GLOBALS[index] 的數組中。 index 保存變量的名稱。這個數組可以在函數內部訪問,也可以直接用來更新全局變量。
上面的實例可以寫成這樣:
-
<?php
-
$x=5;
-
$y=10;
-
-
function myTest()
-
{
-
$GLOBALS['y']=$GLOBALS['x']+$GLOBALS['y'];
-
}
-
-
myTest();
-
echo $y;
-
?>
-
<?php
-
$x=5;
-
$y=10;
-
-
function myTest()
-
{
-
global $x,$y;
-
echo $y+$x;
-
}
-
myTest();
-
?>
Static 作用域
當一個函數完成時,它的所有變量通常都會被刪除。然而,有時候您希望某個局部變量不要被刪除。
要做到這一點,請在您第一次聲明變量時使用 static 關鍵字:
-
<?php
-
-
function myTest()
-
{
-
static $x=0;
-
echo $x;
-
$x++;
-
}
-
-
myTest();
-
myTest();
-
myTest();
-
-
?>
然後,每次調用該函數時,該變量將會保留着函數前一次被調用時的值。
註釋:該變量仍然是函數的局部變量。
參數作用域
參數是通過調用代碼將值傳遞給函數的局部變量。
參數是在參數列表中聲明的,作爲函數聲明的一部分:
-
<?php
-
-
function myTest($x)
-
{
-
echo $x;
-
}
-
-
myTest(5);
-
-
?>
PHP 5 echo 和 print 語句
在 PHP 中有兩個基本的輸出方式: echo 和 print。
本章節中我們會詳細討論兩個語句的用法,並在實例中演示如何使用 echo 和 print。
PHP echo 和 print 語句
echo 和 print 區別:
- echo - 可以輸出一個或多個字符串
- print - 只允許輸出一個字符串,返回值總爲 1
提示:echo 輸出的速度比 print 快, echo 沒有返回值,print有返回值1。
PHP echo 語句
echo 是一個語言結構,使用的時候可以不用加括號,也可以加上括號:echo 或 echo()。
-
<?php
-
echo "<h2>PHP is fun!</h2>";
-
echo "Hello world!<br>";
-
echo "I'm about to learn PHP!<br>";
-
echo "This", " string", " was", " made", " with multiple parameters.";
-
?>
顯示變量
-
<?php
-
$txt1="Learn PHP";
-
$txt2="w3cschool.cc";
-
$cars=array("Volvo","BMW","Toyota");
-
-
echo $txt1;
-
echo "<br>";
-
echo "Study PHP at $txt2";
-
echo "My car is a {$cars[0]}";
-
?>
PHP print 語句
print 同樣是一個語言結構,可以使用括號,也可以不使用括號:print 或 print()。
顯示字符串
-
<?php
-
print "<h2>PHP is fun!</h2>";
-
print "Hello world!<br>";
-
print "I'm about to learn PHP!";
-
?>
顯示變量
-
<?php
-
$txt1="Learn PHP";
-
$txt2="w3cschool.cc";
-
$cars=array("Volvo","BMW","Toyota");
-
-
print $txt1;
-
print "<br>";
-
print "Study PHP at $txt2";
-
print "My car is a {$cars[0]}";
-
?>
PHP 5 數據類型
String(字符串), Integer(整型), Float(浮點型), Boolean(布爾型), Array(數組), Object(對象), NULL(空值)。
PHP 字符串
一個字符串是一串字符的序列,就像 "Hello world!"。
你可以將任何文本放在單引號和雙引號中:
-
<?php
-
$x = "Hello world!";
-
echo $x;
-
echo "<br>";
-
$x = 'Hello world!';
-
echo $x;
-
?>
PHP 整型
整數是一個沒有小數的數字。
整數規則:
- 整數必須至少有一個數字 (0-9)
- 整數不能包含逗號或空格
- 整數是沒有小數點的
- 整數可以是正數或負數
- 整型可以用三種格式來指定:十進制, 十六進制( 以 0x 爲前綴)或八進制(前綴爲 0)。
在以下實例中我們將測試不同的數字。 PHP var_dump() 函數返回變量的數據類型和值:
-
<?php
-
$x = 5985;
-
var_dump($x);
-
echo "<br>";
-
$x = -345;
-
var_dump($x);
-
echo "<br>";
-
$x = 0x8C;
-
var_dump($x);
-
echo "<br>";
-
$x = 047;
-
var_dump($x);
-
?>
-
結果
-
int(5985)
-
int(-345)
-
int(140)
-
int(39)
PHP 浮點型
浮點數是帶小數部分的數字,或是指數形式。
在以下實例中我們將測試不同的數字。 PHP var_dump() 函數返回變量的數據類型和值:
-
<?php
-
$x = 10.365;
-
var_dump($x);
-
echo "<br>";
-
$x = 2.4e3;
-
var_dump($x);
-
echo "<br>";
-
$x = 8E-5;
-
var_dump($x);
-
?>
-
結果
-
float(10.365)
-
float(2400)
-
float(8.0E-5)
PHP 布爾型
布爾型可以是 TRUE 或 FALSE。
布爾型通常用於條件判斷。在接下來的章節中你會學到更多關於條件控制的教程。
PHP 數組
數組可以在一個變量中存儲多個值。
在以下實例中創建了一個數組,然後使用 PHP var_dump() 函數返回數組的數據類型和值:
-
<?php
-
$cars=array("Volvo","BMW","Toyota");
-
var_dump($cars);
-
?>
-
結果
-
array(3) {[0]=>string(5) "Volvo"[1]=>string(3) "BMW"[2]=>string(6) "Toyota"}
PHP 對象
對象數據類型也可以用於存儲數據。
在 PHP 中,對象必須聲明。
首先,你必須使用class關鍵字聲明類對象。類是可以包含屬性和方法的結構。
然後我們在類中定義數據類型,然後在實例化的類中使用數據類型:
-
<?php
-
class Car
-
{
-
var $color;
-
function Car($color="green") {
-
$this->color = $color;
-
}
-
function what_color() {
-
return $this->color;
-
}
-
}
-
-
function print_vars($obj) {
-
foreach (get_object_vars($obj) as $prop => $val) {
-
echo "\t$prop = $val\n";
-
}
-
}
-
-
-
$herbie = new Car("white");
-
-
-
echo "\herbie: Properties\n";
-
print_vars($herbie);
-
-
?>
PHP關鍵字this就是指向當前對象實例的指針,不指向任何其他對象或類。
PHP NULL 值
NULL 值表示變量沒有值。NULL 是數據類型爲 NULL 的值。
NULL 值指明一個變量是否爲空值。同樣可用於數據空值和NULL值的區別。
可以通過設置變量值爲 NULL 來清空變量數據:
-
<?php
-
$x="Hello world!";
-
$x=null;
-
var_dump($x);
-
?>
PHP 5 常量
常量值被定義後,在腳本的其他任何地方都不能被改變。
常量是一個簡單值的標識符。該值在腳本中不能改變。
一個常量由英文字母、下劃線、和數字組成,但數字不能作爲首字母出現。 (常量名不需要加 $ 修飾符)。
注意: 常量在整個腳本中都可以使用。
設置 PHP 常量
設置常量,使用 define() 函數,函數語法如下:
-
bool define ( string $name , mixed $value [, bool $case_insensitive = false ] )
該函數有三個參數:
- name:必選參數,常量名稱,即標誌符。
- value:必選參數,常量的值。
- case_insensitive :可選參數,如果設置爲 TRUE,該常量則大小寫不敏感。默認是大小寫敏感的。
-
<pre class="prettyprint prettyprinted" style=""><span class="pun"><?</span><span class="pln">php
-
</span><span class="com">
-
define</span><span class="pun">(</span><span class="str">"GREETING"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"歡迎訪問 11.com"</span><span class="pun">);</span><span class="pln">
-
echo GREETING</span><span class="pun">;</span><span class="pln"> </span><span class="com">
-
echo </span><span class="str">'<br>'</span><span class="pun">;</span><span class="pln">
-
echo greeting</span><span class="pun">;</span><span class="pln"> </span><span class="com">
-
</span><span class="pun">?></span>
不區分大小寫的常量
-
<?php
-
-
define("GREETING", "歡迎訪問 11.com",true);
-
echo GREETING;
-
echo '<br>';
-
echo greeting;
-
?>
常量是全局的
常量在定義後,默認是全局變量,可以在整個運行的腳本的任何地方使用。
以下實例演示了在函數內使用常量,即便常量定義在函數外也可以正常使用常量。
-
<?php
-
define("GREETING", "歡迎訪問 11.com");
-
-
function myTest() {
-
echo GREETING;
-
}
-
-
myTest();
-
?>
PHP 字符串變量
PHP 中的字符串變量
字符串變量用於包含有字符的值。
在創建字符串之後,我們就可以對它進行操作了。
-
<?php
-
$txt="Hello world!";
-
echo $txt;
-
?>
PHP 並置運算符
在 PHP 中,只有一個字符串運算符。
並置運算符 (.) 用於把兩個字符串值連接起來。
-
<?php
-
$txt1="Hello world!";
-
$txt2="What a nice day!";
-
echo $txt1 . " " . $txt2;
-
?>
-
輸出Hello world! What a nice day!
PHP strlen() 函數
有時知道字符串值的長度是很有用的。
strlen() 函數返回字符串的長度(字符數)。
-
<?php
-
echo strlen("Hello world!");
-
?>
PHP strpos() 函數
strpos() 函數用於在字符串內查找一個字符或一段指定的文本。
如果在字符串中找到匹配,該函數會返回第一個匹配的字符位置。如果未找到匹配,則返回 FALSE。
-
<?php
-
echo strpos("Hello world!","world");
-
?>
PHP 運算符
在 PHP 中,賦值運算符 = 用於給變量賦值。
在 PHP 中,算術運算符 + 用於把值加在一起。
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 % 210 % 810 % 2 |
120 |
- x |
取反 |
x 取反 |
- 2 |
|
a . b |
並置 |
連接兩個字符串 |
"Hi" . "Ha" |
HiHa |
-
<?php
-
$x=10;
-
$y=6;
-
echo ($x + $y);
-
echo ($x - $y);
-
echo ($x * $y);
-
echo ($x / $y);
-
echo ($x % $y);
-
?>
PHP7+ 版本新增整除運算符 intdiv()
-
<?php
-
var_dump(intdiv(10, 3));
-
?>
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 |
連接兩個字符串 |
-
<?php
-
$x=10;
-
echo $x;
-
-
$y=20;
-
$y += 100;
-
echo $y;
-
-
$z=50;
-
$z -= 25;
-
echo $z;
-
-
$i=5;
-
$i *= 6;
-
echo $i;
-
-
$j=10;
-
$j /= 5;
-
echo $j;
-
-
$k=15;
-
$k %= 4;
-
echo $k;
-
?>
-
<?php
-
$a = "Hello";
-
$b = $a . " world!";
-
echo $b;
-
-
$x="Hello";
-
$x .= " world!";
-
echo $x;
-
?>
PHP 遞增/遞減運算符
運算符 |
名稱 |
描述 |
++ x |
預遞增 |
x 加 1,然後返回 x |
x ++ |
後遞增 |
返回 x,然後 x 加 1 |
-- x |
預遞減 |
x 減 1,然後返回 x |
x -- |
後遞減 |
返回 x,然後 x 減 1 |
-
<?php
-
$x=10;
-
echo ++$x;
-
-
$y=10;
-
echo $y++;
-
-
$z=5;
-
echo --$z;
-
-
$i=5;
-
echo $i--;
-
?>
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 |
-
<?php
-
$x=100;
-
$y="100";
-
-
var_dump($x == $y);
-
echo "<br>";
-
var_dump($x === $y);
-
echo "<br>";
-
var_dump($x != $y);
-
echo "<br>";
-
var_dump($x !== $y);
-
echo "<br>";
-
-
$a=50;
-
$b=90;
-
-
var_dump($a > $b);
-
echo "<br>";
-
var_dump($a < $b);
-
?>
-
輸出
-
bool(true)
-
bool(false)
-
bool(false)
-
bool(true)
-
bool(false)
-
bool(true)
PHP 邏輯運算符
運算符 |
名稱 |
描述 |
實例 |
x and y |
與 |
如果 x 和 y 都爲 true,則返回 true |
x=6y=3(x < 10 and y > 1) 返回 true |
x or y |
或 |
如果 x 和 y 至少有一個爲 true,則返回 true |
x=6y=3(x==6 or y==5) 返回 true |
x xor y |
異或 |
如果 x 和 y 有且僅有一個爲 true,則返回 true |
x=6y=3(x==6 xor y==3) 返回 false |
x && y |
與 |
如果 x 和 y 都爲 true,則返回 true |
x=6y=3(x < 10 && y > 1) 返回 true |
x || y |
或 |
如果 x 和 y 至少有一個爲 true,則返回 true |
x=6y=3(x==5 || y==5) 返回 false |
! x |
非 |
如果 x 不爲 true,則返回 true |
x=6y=3!(x==y) 返回 true |
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 |
-
<?php
-
$x = array("a" => "red", "b" => "green");
-
$y = array("c" => "blue", "d" => "yellow");
-
$z = $x + $y;
-
var_dump($z);
-
var_dump($x == $y);
-
var_dump($x === $y);
-
var_dump($x != $y);
-
var_dump($x <> $y);
-
var_dump($x !== $y);
-
?>
三元運算符
另一個條件運算符是"?:"(或三元)運算符 。
語法
-
(expr1) ? (expr2) : (expr3)
對 expr1 求值爲 TRUE 時的值爲 expr2,在 expr1 求值爲 FALSE 時的值爲 expr3。
自 PHP 5.3 起,可以省略三元運算符中間那部分。表達式 expr1 ?: expr3 在 expr1 求值爲 TRUE 時返回 expr1,否則返回 expr3。
判斷 $_GET 請求中含有 user 值,如果有返回 $_GET['user'],否則返回 nobody:
-
<?php
-
$test = '菜鳥教程';
-
-
$username = isset($test) ? $test : 'nobody';
-
echo $username, PHP_EOL;
-
-
-
$username = $test ?: 'nobody';
-
echo $username, PHP_EOL;
-
?>
-
<?php
-
-
$username = $_GET['user'] ?? 'nobody';
-
-
$username = isset($_GET['user']) ? $_GET['user'] : 'nobody';
-
?>
組合比較符(PHP7+)
PHP7+ 支持組合比較符
<?php
// 整型
echo 1 <=> 1; // 0
echo 1 <=> 2; // -1
echo 2 <=> 1; // 1
// 浮點型
echo 1.5 <=> 1.5; // 0
echo 1.5 <=> 2.5; // -1
echo 2.5 <=> 1.5; // 1
// 字符串
echo "a" <=> "a"; // 0
echo "a" <=> "b"; // -1
echo "b" <=> "a"; // 1
?>
PHP If...Else 語句
-
<?php
-
$t=date("H");
-
if ($t<"20")
-
{
-
echo "Have a good day!";
-
}
-
else
-
{
-
echo "Have a good night!";
-
}
-
?>
-
<?php
-
$t=date("H");
-
if ($t<"10")
-
{
-
echo "Have a good morning!";
-
}
-
else if ($t<"20")
-
{
-
echo "Have a good day!";
-
}
-
else
-
{
-
echo "Have a good night!";
-
}
-
?>
PHP Switch 語句
-
<?php
-
$favcolor="red";
-
switch ($favcolor)
-
{
-
case "red":
-
echo "你喜歡的顏色是紅色!";
-
break;
-
case "blue":
-
echo "你喜歡的顏色是藍色!";
-
break;
-
case "green":
-
echo "你喜歡的顏色是綠色!";
-
break;
-
default:
-
echo "你喜歡的顏色不是 紅, 藍, 或綠色!";
-
}
-
?>
PHP 數組
-
<?php
-
$cars=array("Volvo","BMW","Toyota");
-
echo "I like " . $cars[0] . ", " . $cars[1] . " and " . $cars[2] . ".";
-
?>
在 PHP 中,有三種類型的數組:
- 數值數組 - 帶有數字 ID 鍵的數組
- 關聯數組 - 帶有指定的鍵的數組,每個鍵關聯一個值
- 多維數組 - 包含一個或多個數組的數組
PHP 數值數組
-
$cars=array("Volvo","BMW","Toyota");
獲取數組的長度 - count() 函數
count() 函數用於返回數組的長度(元素的數量):
-
<?php
-
$cars=array("Volvo","BMW","Toyota");
-
echo count($cars);
-
?>
遍歷數值數組
遍歷並打印數值數組中的所有值
-
<?php
-
$cars=array("Volvo","BMW","Toyota");
-
$arrlength=count($cars);
-
-
for($x=0;$x<$arrlength;$x++)
-
{
-
echo $cars[$x];
-
echo "<br>";
-
}
-
?>
PHP 關聯數組
關聯數組是使用您分配給數組的指定的鍵的數組。
這裏有兩種創建關聯數組的方法:
-
$age=array("Peter"=>"35","Ben"=>"37","Joe"=>"43");
or:
-
$age['Peter']="35";
-
$age['Ben']="37";
-
$age['Joe']="43";
-
<?php
-
$age=array("Peter"=>"35","Ben"=>"37","Joe"=>"43");
-
echo "Peter is " . $age['Peter'] . " years old.";
-
?>
遍歷關聯數組
遍歷並打印關聯數組中的所有值,您可以使用 foreach 循環
-
<?php
-
$age=array("Peter"=>"35","Ben"=>"37","Joe"=>"43");
-
-
foreach($age as $x=>$x_value)
-
{
-
echo "Key=" . $x . ", Value=" . $x_value;
-
echo "<br>";
-
}
-
?>
PHP 數組排序
PHP - 數組排序函數
在本章中,我們將一一介紹下列 PHP 數組排序函數:
- sort() - 對數組進行升序排列
- rsort() - 對數組進行降序排列
- asort() - 根據關聯數組的值,對數組進行升序排列
- ksort() - 根據關聯數組的鍵,對數組進行升序排列
- arsort() - 根據關聯數組的值,對數組進行降序排列
- krsort() - 根據關聯數組的鍵,對數組進行降序排列
sort() - 對數組進行升序排列
-
<?php
-
$cars=array("Volvo","BMW","Toyota");
-
sort($cars);
-
print_r($cars);
-
?>
-
<?php
-
$numbers=array(4,6,2,22,11);
-
sort($numbers);
-
print_r($numbers);
-
?>
rsort() - 對數組進行降序排列
-
<?php
-
$cars=array("Volvo","BMW","Toyota");
-
rsort($cars);
-
print_r($cars);
-
?>
-
<?php
-
$numbers=array(4,6,2,22,11);
-
rsort($numbers);
-
print_r($numbers);
-
?>
asort() - 根據數組的值,對數組進行升序排列
-
<?php
-
$age=array("Peter"=>"35","Ben"=>"37","Joe"=>"43");
-
asort($age);
-
print_r($age);
-
?>
ksort() - 根據數組的鍵,對數組進行升序排
-
<?php
-
$age=array("Peter"=>"35","Ben"=>"37","Joe"=>"43");
-
ksort($age);
-
print_r($age);
-
?>
arsort() - 根據數組的值,對數組進行降序排列
-
<?php
-
$age=array("Peter"=>"35","Ben"=>"37","Joe"=>"43");
-
arsort($age);
-
print_r($age);
-
?>
krsort() - 根據數組的鍵,對數組進行降序排
-
<?php
-
$age=array("Peter"=>"35","Ben"=>"37","Joe"=>"43");
-
krsort($age);
-
print_r($age);
-
?>
PHP 超級全局變量
PHP 超級全局變量
PHP中預定義了幾個超級全局變量(superglobals) ,這意味着它們在一個腳本的全部作用域中都可用。你不需要特別說明,就可以在函數及類中使用。
PHP 超級全局變量列表:
- $GLOBALS
- $_SERVER
- $_REQUEST
- $_POST
- $_GET
- $_FILES
- $_ENV
- $_COOKIE
- $_SESSION
PHP $GLOBALS
$GLOBALS 是PHP的一個超級全局變量組,在一個PHP腳本的全部作用域中都可以訪問。
$GLOBALS 是一個包含了全部變量的全局組合數組。變量的名字就是數組的鍵。
-
<?php
-
$x = 75;
-
$y = 25;
-
-
function addition()
-
{
-
$GLOBALS['z'] = $GLOBALS['x'] + $GLOBALS['y'];
-
}
-
-
addition();
-
echo $z;
-
?>
PHP $_SERVER
$_SERVER 是一個包含了諸如頭信息(header)、路徑(path)、以及腳本位置(script locations)等等信息的數組。這個數組中的項目由 Web 服務器創建。不能保證每個服務器都提供全部項目;服務器可能會忽略一些,或者提供一些沒有在這裏列舉出來的項目。
-
<?php
-
echo $_SERVER['PHP_SELF'];
-
echo "<br>";
-
echo $_SERVER['SERVER_NAME'];
-
echo "<br>";
-
echo $_SERVER['HTTP_HOST'];
-
echo "<br>";
-
echo $_SERVER['HTTP_REFERER'];
-
echo "<br>";
-
echo $_SERVER['HTTP_USER_AGENT'];
-
echo "<br>";
-
echo $_SERVER['SCRIPT_NAME'];
-
?>
下表列出了所有 $_SERVER 變量中的重要元素:
元素/代碼 |
描述 |
$_SERVER['PHP_SELF'] |
當前執行腳本的文件名,與 document root 有關。例如,在地址爲 http://example.com/test.php/foo.bar 的腳本中使用 $_SERVER['PHP_SELF'] 將得到 /test.php/foo.bar。__FILE__ 常量包含當前(例如包含)文件的完整路徑和文件名。 從 PHP 4.3.0 版本開始,如果 PHP 以命令行模式運行,這個變量將包含腳本名。之前的版本該變量不可用。 |
$_SERVER['GATEWAY_INTERFACE'] |
服務器使用的 CGI 規範的版本;例如,"CGI/1.1"。 |
$_SERVER['SERVER_ADDR'] |
當前運行腳本所在的服務器的 IP 地址。 |
$_SERVER['SERVER_NAME'] |
當前運行腳本所在的服務器的主機名。如果腳本運行於虛擬主機中,該名稱是由那個虛擬主機所設置的值決定。(如: www.runoob.com) |
$_SERVER['SERVER_SOFTWARE'] |
服務器標識字符串,在響應請求時的頭信息中給出。 (如:Apache/2.2.24) |
$_SERVER['SERVER_PROTOCOL'] |
請求頁面時通信協議的名稱和版本。例如,"HTTP/1.0"。 |
$_SERVER['REQUEST_METHOD'] |
訪問頁面使用的請求方法;例如,"GET", "HEAD","POST","PUT"。 |
$_SERVER['REQUEST_TIME'] |
請求開始時的時間戳。從 PHP 5.1.0 起可用。 (如:1377687496) |
$_SERVER['QUERY_STRING'] |
query string(查詢字符串),如果有的話,通過它進行頁面訪問。 |
$_SERVER['HTTP_ACCEPT'] |
當前請求頭中 Accept: 項的內容,如果存在的話。 |
$_SERVER['HTTP_ACCEPT_CHARSET'] |
當前請求頭中 Accept-Charset: 項的內容,如果存在的話。例如:"iso-8859-1,*,utf-8"。 |
$_SERVER['HTTP_HOST'] |
當前請求頭中 Host: 項的內容,如果存在的話。 |
$_SERVER['HTTP_REFERER'] |
引導用戶代理到當前頁的前一頁的地址(如果存在)。由 user agent 設置決定。並不是所有的用戶代理都會設置該項,有的還提供了修改 HTTP_REFERER 的功能。簡言之,該值並不可信。) |
$_SERVER['HTTPS'] |
如果腳本是通過 HTTPS 協議被訪問,則被設爲一個非空的值。 |
$_SERVER['REMOTE_ADDR'] |
瀏覽當前頁面的用戶的 IP 地址。 |
$_SERVER['REMOTE_HOST'] |
瀏覽當前頁面的用戶的主機名。DNS 反向解析不依賴於用戶的 REMOTE_ADDR。 |
$_SERVER['REMOTE_PORT'] |
用戶機器上連接到 Web 服務器所使用的端口號。 |
$_SERVER['SCRIPT_FILENAME'] |
當前執行腳本的絕對路徑。 |
$_SERVER['SERVER_ADMIN'] |
該值指明瞭 Apache 服務器配置文件中的 SERVER_ADMIN 參數。如果腳本運行在一個虛擬主機上,則該值是那個虛擬主機的值。(如:[email protected]) |
$_SERVER['SERVER_PORT'] |
Web 服務器使用的端口。默認值爲 "80"。如果使用 SSL 安全連接,則這個值爲用戶設置的 HTTP 端口。 |
$_SERVER['SERVER_SIGNATURE'] |
包含了服務器版本和虛擬主機名的字符串。 |
$_SERVER['PATH_TRANSLATED'] |
當前腳本所在文件系統(非文檔根目錄)的基本路徑。這是在服務器進行虛擬到真實路徑的映像後的結果。 |
$_SERVER['SCRIPT_NAME'] |
包含當前腳本的路徑。這在頁面需要指向自己時非常有用。__FILE__ 常量包含當前腳本(例如包含文件)的完整路徑和文件名。 |
$_SERVER['SCRIPT_URI'] |
URI 用來指定要訪問的頁面。例如 "/index.html"。 |
PHP $_REQUEST
PHP $_REQUEST 用於收集HTML表單提交的數據。
以下實例顯示了一個輸入字段(input)及提交按鈕(submit)的表單(form)。當用戶通過點擊 "Submit" 按鈕提交表單數據時, 表單數據將發送至<form>標籤中 action 屬性中指定的腳本文件。在這個實例中,我們指定文件來處理表單數據。如果你希望其他的PHP文件來處理該數據,你可以修改該指定的腳本文件名。然後,我們可以使用超級全局變量 $_REQUEST 來收集表單中的 input 字段數據:
-
<!DOCTYPE html>
-
<html>
-
<body>
-
-
<form method="post" action="<?php echo $_SERVER['PHP_SELF'];?>">
-
Name: <input type="text" name="fname">
-
<input type="submit">
-
</form>
-
-
<?php
-
$name = $_REQUEST['fname'];
-
echo $name;
-
?>
-
-
</body>
-
</html>
PHP $_POST
PHP $_POST 被廣泛應用於收集表單數據,在HTML form標籤的指定該屬性:"method="post"。
以下實例顯示了一個輸入字段(input)及提交按鈕(submit)的表單(form)。當用戶通過點擊 "Submit" 按鈕提交表單數據時, 表單數據將發送至<form>標籤中 action 屬性中指定的腳本文件。在這個實例中,我們指定文件來處理表單數據。如果你希望其他的PHP文件來處理該數據,你可以修改該指定的腳本文件名。然後,我們可以使用超級全局變量 $_POST 來收集表單中的 input 字段數據:
-
<!DOCTYPE html>
-
<html>
-
<body>
-
-
<form method="post" action="<?php echo $_SERVER['PHP_SELF'];?>">
-
Name: <input type="text" name="fname">
-
<input type="submit">
-
</form>
-
-
<?php
-
$name = $_POST['fname'];
-
echo $name;
-
?>
-
-
</body>
-
</html>
PHP $_GET
PHP $_GET 同樣被廣泛應用於收集表單數據,在HTML form標籤的指定該屬性:"method="get"。
$_GET 也可以收集URL中發送的數據。
假定我們有一個包含參數的超鏈接HTML頁面:
<html>
<body>
<a href="test_get.php?subject=PHP&web=runoob.com">Test $GET</a>
</body>
</html>
當用戶點擊鏈接 "Test $GET", 參數 "subject" 和 "web" 將發送至"test_get.php",你可以在 "test_get.php" 文件中使用 $_GET 變量來獲取這些數據。
-
<!DOCTYPE html>
-
<html>
-
<body>
-
-
<a href="test_get.php?subject=PHP&web=111.com">測試 $_GET</a>
-
-
</body>
-
</html>
PHP 循環 - While 循環
-
<?php
-
$i=1;
-
while($i<=5)
-
{
-
echo "The number is " . $i . "<br>";
-
$i++;
-
}
-
?>
-
<p>輸出:</p><div class="code notranslate"><div>The number is 1
-
The number is 2
-
The number is 3
-
The number is 4
-
The number is 5</div></div>
do...while 語句
-
<?php
-
$i=1;
-
do
-
{
-
$i++;
-
echo "The number is " . $i . "<br>";
-
}
-
while ($i<=5);
-
?>
-
<p>輸出:</p><div class="code notranslate"><div>The number is 2
-
The number is 3
-
The number is 4
-
The number is 5
-
The number is 6</div></div>
PHP 循環 - For 循環
-
<?php
-
for ($i=1; $i<=5; $i++)
-
{
-
echo "The number is " . $i . "<br>";
-
}
-
?>
-
<p>輸出:</p><div class="code notranslate"><div>The number is 1
-
The number is 2
-
The number is 3
-
The number is 4
-
The number is 5</div></div>
foreach 循環
foreach 循環用於遍歷數組。
-
<?php
-
$x=array("one","two","three");
-
foreach ($x as $value)
-
{
-
echo $value . "<br>";
-
}
-
?>
PHP 函數
-
<?php
-
function writeName()
-
{
-
echo "Kai Jim Refsnes";
-
}
-
-
echo "My name is ?<br>";
-
writeName();
-
?>
-
輸出
-
<span style="font-family:Simsun;font-size:14px;color:#000000;font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 1; word-spacing: 0px; -webkit-text-stroke-width: 0px; display: inline !important; float: none;">My name is ?</span><br style="color: rgb(0, 0, 0); font-family: Simsun;font-size:14px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 1; word-spacing: 0px; -webkit-text-stroke-width: 0px;" /><span style="font-family:Simsun;font-size:14px;color:#000000;font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 1; word-spacing: 0px; -webkit-text-stroke-width: 0px; display: inline !important; float: none;">Kai Jim Refsnes</span>
-
<?php
-
function writeName($fname)
-
{
-
echo $fname . " Refsnes.<br>";
-
}
-
-
echo "My name is ";
-
writeName("Kai Jim");
-
echo "My sister's name is ";
-
writeName("Hege");
-
echo "My brother's name is ";
-
writeName("Stale");
-
?>
-
<p>輸出:</p><div class="code notranslate"><div>My name is Kai Jim Refsnes.
-
My sister's name is Hege Refsnes.
-
My brother's name is Stale Refsnes.</div></div>
-
<?php
-
function writeName($fname,$punctuation)
-
{
-
echo $fname . " Refsnes" . $punctuation . "<br>";
-
}
-
-
echo "My name is ";
-
writeName("Kai Jim",".");
-
echo "My sister's name is ";
-
writeName("Hege","!");
-
echo "My brother's name is ";
-
writeName("Ståle","?");
-
?>
-
<p>輸出:</p><div class="code notranslate"><div>My name is Kai Jim Refsnes.
-
My sister's name is Hege Refsnes!
-
My brother's name is Ståle Refsnes?</div></div>
PHP 函數 - 返回值
-
<?php
-
function add($x,$y)
-
{
-
$total=$x+$y;
-
return $total;
-
}
-
-
echo "1 + 16 = " . add(1,16);
-
?>
-
<p>輸出:</p><div class="code notranslate"><div>1 + 16 = 17</div></div>
PHP 魔術變量
PHP 向它運行的任何腳本提供了大量的預定義常量。
不過很多常量都是由不同的擴展庫定義的,只有在加載了這些擴展庫時纔會出現,或者動態加載後,或者在編譯時已經包括進去了。
有八個魔術常量它們的值隨着它們在代碼中的位置改變而改變。
__LINE__
文件中的當前行號。
-
<?php
-
echo '這是第 “ ' . __LINE__ . ' ” 行';
-
?>
-
__FILE__
文件的完整路徑和文件名。如果用在被包含文件中,則返回被包含的文件名。
自 PHP 4.0.2 起,__FILE__ 總是包含一個絕對路徑(如果是符號連接,則是解析後的絕對路徑),而在此之前的版本有時會包含一個相對路徑。
-
<?php
-
echo '該文件位於 “ ' . __FILE__ . ' ” ';
-
?>
-
__DIR__
文件所在的目錄。如果用在被包括文件中,則返回被包括的文件所在的目錄。
它等價於 dirname(__FILE__)。除非是根目錄,否則目錄中名不包括末尾的斜槓。(PHP 5.3.0中新增)
-
<?php
-
echo '該文件位於 “ ' . __DIR__ . ' ” ';
-
?>
-
_FUNCTION__
函數名稱(PHP 4.3.0 新加)。自 PHP 5 起本常量返回該函數被定義時的名字(區分大小寫)。在 PHP 4 中該值總是小寫字母的。
-
<?php
-
function test() {
-
echo '函數名爲:' . __FUNCTION__ ;
-
}
-
test();
-
?>
-
__CLASS__
類的名稱(PHP 4.3.0 新加)。自 PHP 5 起本常量返回該類被定義時的名字(區分大小寫)。
在 PHP 4 中該值總是小寫字母的。類名包括其被聲明的作用區域(例如 Foo\Bar)。注意自 PHP 5.4 起 __CLASS__ 對 trait 也起作用。當用在 trait 方法中時,__CLASS__ 是調用 trait 方法的類的名字。
-
<?php
-
<?php
-
class test {
-
function _print() {
-
echo '類名爲:' . __CLASS__ . "<br>";
-
echo '函數名爲:' . __FUNCTION__ ;
-
}
-
}
-
$t = new test();
-
$t->_print();
-
?>
-
-
</span><pre class="prettyprint prettyprinted" style=""><span class="pun">
__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();
-
?>
-
__METHOD__
類的方法名(PHP 5.0.0 新加)。返回該方法被定義時的名字(區分大小寫)。
-
<?php
-
function test() {
-
echo '函數名爲:' . __METHOD__ ;
-
}
-
test();
-
?>
-
__NAMESPACE__
當前命名空間的名稱(區分大小寫)。此常量是在編譯時定義的(PHP 5.3.0 新增)。
-
<?php
-
namespace MyProject;
-
-
echo '命名空間爲:"', __NAMESPACE__, '"';
-
?>
-
PHP 面向對象
-
<?php
-
class Site {
-
-
var $url;
-
var $title;
-
-
-
function setUrl($par){
-
$this->url = $par;
-
}
-
-
function getUrl(){
-
echo $this->url . PHP_EOL;
-
}
-
-
function setTitle($par){
-
$this->title = $par;
-
}
-
-
function getTitle(){
-
echo $this->title . PHP_EOL;
-
}
-
}
-
-
$runoob = new Site;
-
$taobao = new Site;
-
$google = new Site;
-
-
-
$runoob->setTitle( "菜鳥教程" );
-
$taobao->setTitle( "淘寶" );
-
$google->setTitle( "Google 搜索" );
-
-
$runoob->setUrl( 'www.runoob.com' );
-
$taobao->setUrl( 'www.taobao.com' );
-
$google->setUrl( 'www.google.com' );
-
-
-
$runoob->getTitle();
-
$taobao->getTitle();
-
$google->getTitle();
-
-
$runoob->getUrl();
-
$taobao->getUrl();
-
$google->getUrl();
-
?>
PHP 表單
PHP 表單和用戶輸入
PHP 中的 $_GET 和 $_POST 變量用於檢索表單中的信息,比如用戶輸入。
PHP 表單處理
有一點很重要的事情值得注意,當處理 HTML 表單時,PHP 能把來自 HTML 頁面中的表單元素自動變成可供 PHP 腳本使用。
form.html
-
<html>
-
<head>
-
<meta charset="utf-8">
-
<title>hjp(runoob.com)</title>
-
</head>
-
<body>
-
-
<form action="welcome.php" method="post">
-
名字: <input type="text" name="fname">
-
年齡: <input type="text" name="age">
-
<input type="submit" value="提交">
-
</form>
-
-
</body>
-
</html>
welcome.php 文件
-
歡迎 <?php echo $_POST["fname"]; ?>!<br>
-
你的年齡是 <?php echo $_POST["age"]; ?> 歲。
PHP 表單驗證
名字 |
必須。 +只能包含字母和空格 |
E-mail |
必須。 + 必須是一個有效的電子郵件地址(包含'@'和'.') |
網址 |
必須。如果存在,它必須包含一個有效的URL |
備註 |
必須。 多行輸入字段(文本域) |
性別 |
必須。 必須選擇一個 |
PHP 完整表單實例
PHP $_GET 變量
-
<html>
-
<head>
-
<meta charset="utf-8">
-
<title>hjp(runoob.com)</title>
-
</head>
-
<body>
-
-
<form action="welcome.php" method="get">
-
名字: <input type="text" name="fname">
-
年齡: <input type="text" name="age">
-
<input type="submit" value="提交">
-
</form>
-
-
</body>
-
</html>
-
歡迎 <?php echo $_GET["fname"]; ?>!<br>
-
你的年齡是 <?php echo $_GET["age"]; ?> 歲。
PHP $_POST 變量
-
<html>
-
<head>
-
<meta charset="utf-8">
-
<title>hjp(runoob.com)</title>
-
</head>
-
<body>
-
-
<form action="welcome.php" method="post">
-
名字: <input type="text" name="fname">
-
年齡: <input type="text" name="age">
-
<input type="submit" value="提交">
-
</form>
-
-
</body>
-
</html>
-
歡迎 <?php echo $_POST["fname"]; ?>!<br>
-
你的年齡是 <?php echo $_POST["age"]; ?> 歲。
PHP 多維數組
-
<?php
-
-
$cars = array
-
(
-
array("Volvo",100,96),
-
array("BMW",60,59),
-
array("Toyota",110,100)
-
);
-
print_r($cars);
-
?>
格式化輸出數組
-
<?php
-
$sites = array
-
(
-
"runoob"=>array
-
(
-
"菜鳥教程",
-
"http://www.runoob.com"
-
),
-
"google"=>array
-
(
-
"Google 搜索",
-
"http://www.google.com"
-
),
-
"taobao"=>array
-
(
-
"淘寶",
-
"http://www.taobao.com"
-
)
-
);
-
print("<pre>");
-
print_r($sites);
-
print("</pre>");
-
?>
PHP date() 函數
PHP date() 函數用於格式化時間/日期。
PHP date() 函數
PHP date() 函數可把時間戳格式化爲可讀性更好的日期和時間。
時間戳是一個字符序列,表示一定的事件發生的日期/時間。
語法
string date ( string $format [, int $timestamp ] )
參數 |
描述 |
format |
必需。規定時間戳的格式。 |
timestamp |
可選。規定時間戳。默認是當前的日期和時間。 |
PHP Date() - 格式化日期
date() 函數的第一個必需參數 format 規定了如何格式化日期/時間。
這裏列出了一些可用的字符:
- d - 代表月中的天 (01 - 31)
- m - 代表月 (01 - 12)
- Y - 代表年 (四位數)
如需瞭解 format 參數中可用的所有字符列表,請查閱我們的 PHP Date 參考手冊,
可以在字母之間插入其他字符,比如 "/"、"." 或者 "-",這樣就可以增加附加格式了:
-
<?php
-
echo date("Y/m/d") . "<br>";
-
echo date("Y.m.d") . "<br>";
-
echo date("Y-m-d");
-
?>
輸出2016/10/21
2016.10.21
2016-10-21
|
返回值例子 |
日 |
--- |
--- |
d |
月份中的第幾天,有前導零的 2 位數字 |
01 到 31 |
D |
星期中的第幾天,文本表示,3 個字母 |
Mon 到 Sun |
j |
月份中的第幾天,沒有前導零 |
1 到 31 |
l("L"的小寫字母) |
星期幾,完整的文本格式 |
Sunday 到 Saturday |
N |
ISO-8601 格式數字表示的星期中的第幾天(PHP 5.1.0 新加) |
1(表示星期一)到 7(表示星期天) |
S |
每月天數後面的英文後綴,2 個字符 |
st,nd,rd 或者 th。可以和 j 一起用 |
w |
星期中的第幾天,數字表示 |
0(表示星期天)到 6(表示星期六) |
z |
年份中的第幾天 |
0 到 365 |
星期 |
--- |
--- |
W |
ISO-8601 格式年份中的第幾周,每週從星期一開始(PHP 4.1.0 新加的) |
例如:42(當年的第 42 周) |
月 |
--- |
--- |
F |
月份,完整的文本格式,例如 January 或者 March |
January 到 December |
m |
數字表示的月份,有前導零 |
01 到 12 |
M |
三個字母縮寫表示的月份 |
Jan 到 Dec |
n |
數字表示的月份,沒有前導零 |
1 到 12 |
t |
給定月份所應有的天數 |
28 到 31 |
年 |
--- |
--- |
L |
是否爲閏年 |
如果是閏年爲 1,否則爲 0 |
o |
ISO-8601 格式年份數字。這和 Y 的值相同,只除了如果 ISO 的星期數(W)屬於前一年或下一年,則用那一年。(PHP 5.1.0 新加) |
Examples: 1999 or 2003 |
Y |
4 位數字完整表示的年份 |
例如:1999 或 2003 |
y |
2 位數字表示的年份 |
例如:99 或 03 |
時間 |
--- |
--- |
a |
小寫的上午和下午值 |
am 或 pm |
A |
大寫的上午和下午值 |
AM 或 PM |
B |
Swatch Internet 標準時 |
000 到 999 |
g |
小時,12 小時格式,沒有前導零 |
1 到 12 |
G |
小時,24 小時格式,沒有前導零 |
0 到 23 |
h |
小時,12 小時格式,有前導零 |
01 到 12 |
H |
小時,24 小時格式,有前導零 |
00 到 23 |
i |
有前導零的分鐘數 |
00 到 59> |
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 |
P |
與格林威治時間(GMT)的差別,小時和分鐘之間有冒號分隔(PHP 5.1.3 新加) |
例如:+02:00 |
T |
本機所在的時區 |
例如:EST,MDT(【譯者注】在 Windows 下爲完整文本格式,例如"Eastern Standard Time",中文版會顯示"中國標準時間")。 |
Z |
時差偏移量的秒數。UTC 西邊的時區偏移量總是負的,UTC 東邊的時區偏移量總是正的。 |
-43200 到 43200 |
完整的日期/時間 |
--- |
--- |
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 包含文件
PHP include 和 require 語句
在 PHP 中,您可以在服務器執行 PHP 文件之前在該文件中插入一個文件的內容。
include 和 require 語句用於在執行流中插入寫在其他文件中的有用的代碼。
include 和 require 除了處理錯誤的方式不同之外,在其他方面都是相同的:
- require 生成一個致命錯誤(E_COMPILE_ERROR),在錯誤發生後腳本會停止執行。
- include 生成一個警告(E_WARNING),在錯誤發生後腳本會繼續執行。
因此,如果您希望繼續執行,並向用戶輸出結果,即使包含文件已丟失,那麼請使用 include。否則,在框架、CMS 或者複雜的 PHP 應用程序編程中,請始終使用 require 向執行流引用關鍵文件。這有助於提高應用程序的安全性和完整性,在某個關鍵文件意外丟失的情況下。
包含文件省去了大量的工作。這意味着您可以爲所有網頁創建標準頁頭、頁腳或者菜單文件。然後,在頁頭需要更新時,您只需更新這個頁頭包含文件即可。
語法
include 'filename';
或者
require 'filename';
PHP include 和 require 語句
假設您有一個標準的頁頭文件,名爲 "header.php"。如需在頁面中引用這個頁頭文件,請使用 include/require:
<html>
<head>
<meta charset="utf-8">
<title>hjp(runoob.com)</title>
</head>
<body>
<?php include 'header.php'; ?>
<h1>歡迎來到我的主頁!</h1>
<p>一些文本。</p>
</body>
</html>
假設我們有一個在所有頁面中使用的標準菜單文件。
"menu.php":
echo '<a href="/">主頁</a>
<a href="/html">HTML 教程</a>
<a href="/php">PHP 教程</a>';
網站中的所有頁面均應引用該菜單文件。以下是具體的做法:
<html>
<head>
<meta charset="utf-8">
<title>hjp(runoob.com)</title>
</head>
<body>
<div class="leftmenu">
<?php include 'menu.php'; ?>
</div>
<h1>歡迎來到我的主頁!</h1>
<p>一些文本。</p>
</body>
</html>
假設我們有一個定義變量的包含文件("vars.php"):
<?php
$color='red';
$car='BMW';
?>
這些變量可用在調用文件中:
<html>
<head>
<meta charset="utf-8">
<title>hjp(runoob.com)</title>
</head>
<body>
<h1>歡迎來到我的主頁!</h1>
<?php
include 'vars.php';
echo "I have a $color $car"; // I have a red BMW
?>
</body>
</html>
PHP 文件處理
fopen() 函數用於在 PHP 中打開文件。
打開文件
fopen() 函數用於在 PHP 中打開文件。
此函數的第一個參數含有要打開的文件的名稱,第二個參數規定了使用哪種模式來打開文件:
-
<html>
-
<body>
-
-
<?php
-
$file=fopen("welcome.txt","r");
-
?>
-
-
</body>
-
</html>
文件可能通過下列模式來打開:
模式 |
描述 |
r |
只讀。在文件的開頭開始。 |
r+ |
讀/寫。在文件的開頭開始。 |
w |
只寫。打開並清空文件的內容;如果文件不存在,則創建新文件。 |
w+ |
讀/寫。打開並清空文件的內容;如果文件不存在,則創建新文件。 |
a |
追加。打開並向文件末尾進行寫操作,如果文件不存在,則創建新文件。 |
a+ |
讀/追加。通過向文件末尾寫內容,來保持文件內容。 |
x |
只寫。創建新文件。如果文件已存在,則返回 FALSE 和一個錯誤。 |
x+ |
讀/寫。創建新文件。如果文件已存在,則返回 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 文件上傳
通過 PHP,可以把文件上傳到服務器。
本章節實例在 test 項目下完成,目錄結構爲:
test
|-----upload # 文件上傳的目錄
|-----form.html # 表單文件
|-----upload_file.php # php 上傳代碼
創建一個文件上傳表單
允許用戶從表單上傳文件是非常有用的。
請看下面這個供上傳文件的 HTML 表單:
<html>
<head>
<meta charset="utf-8">
<title>hjp(runoob.com)</title>
</head>
<body>
<form action="upload_file.php" method="post" enctype="multipart/form-data">
<label for="file">文件名:</label>
<input type="file" name="file" id="file"><br>
<input type="submit" name="submit" value="提交">
</form>
</body>
</html>
將以上代碼保存到 form.html 文件中。
有關上面的 HTML 表單的一些注意項列舉如下:
- <form> 標籤的 enctype 屬性規定了在提交表單時要使用哪種內容類型。在表單需要二進制數據時,比如文件內容,請使用 "multipart/form-data"。
- <input> 標籤的 type="file" 屬性規定了應該把輸入作爲文件來處理。舉例來說,當在瀏覽器中預覽時,會看到輸入框旁邊有一個瀏覽按鈕。
創建上傳腳本
"upload_file.php" 文件含有供上傳文件的代碼:
<?php
if ($_FILES["file"]["error"] > 0)
{
echo "錯誤:" . $_FILES["file"]["error"] . "<br>";
}
else
{
echo "上傳文件名: " . $_FILES["file"]["name"] . "<br>";
echo "文件類型: " . $_FILES["file"]["type"] . "<br>";
echo "文件大小: " . ($_FILES["file"]["size"] / 1024) . " kB<br>";
echo "文件臨時存儲的位置: " . $_FILES["file"]["tmp_name"];
}
?>
通過使用 PHP 的全局數組 $_FILES,你可以從客戶計算機向遠程服務器上傳文件。
第一個參數是表單的 input name,第二個下標可以是 "name"、"type"、"size"、"tmp_name" 或 "error"。如下所示:
- $_FILES["file"]["name"] - 上傳文件的名稱
- $_FILES["file"]["type"] - 上傳文件的類型
- $_FILES["file"]["size"] - 上傳文件的大小,以字節計
- $_FILES["file"]["tmp_name"] - 存儲在服務器的文件的臨時副本的名稱
- $_FILES["file"]["error"] - 由文件上傳導致的錯誤代碼
這是一種非常簡單文件上傳方式。基於安全方面的考慮,您應當增加有關允許哪些用戶上傳文件的限制。
上傳限制
在這個腳本中,我們增加了對文件上傳的限制。用戶只能上傳 .gif、.jpeg、.jpg、.png 文件,文件大小必須小於 200 kB:
<?php
// 允許上傳的圖片後綴
$allowedExts = array("gif", "jpeg", "jpg", "png");
$temp = explode(".", $_FILES["file"]["name"]);
$extension = end($temp); // 獲取文件後綴名
if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/jpg")
|| ($_FILES["file"]["type"] == "image/pjpeg")
|| ($_FILES["file"]["type"] == "image/x-png")
|| ($_FILES["file"]["type"] == "image/png"))
&& ($_FILES["file"]["size"] < 204800) // 小於 200 kb
&& in_array($extension, $allowedExts))
{
if ($_FILES["file"]["error"] > 0)
{
echo "錯誤:: " . $_FILES["file"]["error"] . "<br>";
}
else
{
echo "上傳文件名: " . $_FILES["file"]["name"] . "<br>";
echo "文件類型: " . $_FILES["file"]["type"] . "<br>";
echo "文件大小: " . ($_FILES["file"]["size"] / 1024) . " kB<br>";
echo "文件臨時存儲的位置: " . $_FILES["file"]["tmp_name"];
}
}
else
{
echo "非法的文件格式";
}
?>
保存被上傳的文件
上面的實例在服務器的 PHP 臨時文件夾中創建了一個被上傳文件的臨時副本。
這個臨時的副本文件會在腳本結束時消失。要保存被上傳的文件,我們需要把它拷貝到另外的位置:
<?php
// 允許上傳的圖片後綴
$allowedExts = array("gif", "jpeg", "jpg", "png");
$temp = explode(".", $_FILES["file"]["name"]);
echo $_FILES["file"]["size"];
$extension = end($temp); // 獲取文件後綴名
if ((($_FILES["file"]["type"] == "image/gif")
|| ($_FILES["file"]["type"] == "image/jpeg")
|| ($_FILES["file"]["type"] == "image/jpg")
|| ($_FILES["file"]["type"] == "image/pjpeg")
|| ($_FILES["file"]["type"] == "image/x-png")
|| ($_FILES["file"]["type"] == "image/png"))
&& ($_FILES["file"]["size"] < 204800) // 小於 200 kb
&& in_array($extension, $allowedExts))
{
if ($_FILES["file"]["error"] > 0)
{
echo "錯誤:: " . $_FILES["file"]["error"] . "<br>";
}
else
{
echo "上傳文件名: " . $_FILES["file"]["name"] . "<br>";
echo "文件類型: " . $_FILES["file"]["type"] . "<br>";
echo "文件大小: " . ($_FILES["file"]["size"] / 1024) . " kB<br>";
echo "文件臨時存儲的位置: " . $_FILES["file"]["tmp_name"] . "<br>";
// 判斷當期目錄下的 upload 目錄是否存在該文件
// 如果沒有 upload 目錄,你需要創建它,upload 目錄權限爲 777
if (file_exists("upload/" . $_FILES["file"]["name"]))
{
echo $_FILES["file"]["name"] . " 文件已經存在。 ";
}
else
{
// 如果 upload 目錄不存在該文件則將文件上傳到 upload 目錄下
move_uploaded_file($_FILES["file"]["tmp_name"], "upload/" . $_FILES["file"]["name"]);
echo "文件存儲在: " . "upload/" . $_FILES["file"]["name"];
}
}
}
else
{
echo "非法的文件格式";
}
?>
上面的腳本檢測了文件是否已存在,如果不存在,則把文件拷貝到名爲 "upload" 的目錄下。
PHP Cookie
cookie 常用於識別用戶。
Cookie 是什麼?
cookie 常用於識別用戶。cookie 是一種服務器留在用戶計算機上的小文件。每當同一臺計算機通過瀏覽器請求頁面時,這臺計算機將會發送 cookie。通過 PHP,您能夠創建並取回 cookie 的值。
如何創建 Cookie?
setcookie() 函數用於設置 cookie。
註釋:setcookie() 函數必須位於 <html> 標籤之前。
語法
setcookie(name, value, expire, path, domain);
在下面的例子中,我們將創建名爲 "user" 的 cookie,併爲它賦值 "runoob"。我們也規定了此 cookie 在一小時後過期:
<?php
setcookie("user", "runoob", time()+3600);
?>
<html>
.....
註釋:在發送 cookie 時,cookie 的值會自動進行 URL 編碼,在取回時進行自動解碼。(爲防止 URL 編碼,請使用 setrawcookie() 取而代之。)
您還可以通過另一種方式設置 cookie 的過期時間。這也許比使用秒錶示的方式簡單。
<?php
$expire=time()+60*60*24*30;
setcookie("user", "runoob", $expire);
?>
<html>
.....
在上面的實例中,過期時間被設置爲一個月(60 秒 * 60 分 * 24 小時 * 30 天)。
如何取回 Cookie 的值?
PHP 的 $_COOKIE 變量用於取回 cookie 的值。
在下面的實例中,我們取回了名爲 "user" 的 cookie 的值,並把它顯示在了頁面上:
<?php
// 輸出 cookie 值
echo $_COOKIE["user"];
// 查看所有 cookie
print_r($_COOKIE);
?>
在下面的實例中,我們使用 isset() 函數來確認是否已設置了 cookie:
<html>
<head>
<meta charset="utf-8">
<title>hjp(runoob.com)</title>
</head>
<body>
<?php
if (isset($_COOKIE["user"]))
echo "歡迎 " . $_COOKIE["user"] . "!<br>";
else
echo "普通訪客!<br>";
?>
</body>
</html>
如何刪除 Cookie?
當刪除 cookie 時,您應當使過期日期變更爲過去的時間點。
刪除的實例:
<?php
// 設置 cookie 過期時間爲過去 1 小時
setcookie("user", "", time()-3600);
?>
如果瀏覽器不支持 Cookie 該怎麼辦?
如果您的應用程序需要與不支持 cookie 的瀏覽器打交道,那麼您不得不使用其他的辦法在您的應用程序中的頁面之間傳遞信息。一種方式是通過表單傳遞數據(有關表單和用戶輸入的內容,在本教程的前面章節中我們已經介紹過了)。
下面的表單在用戶單點擊 "Submit" 按鈕時,向 "welcome.php" 提交了用戶輸入:
<html>
<head>
<meta charset="utf-8">
<title>dd(runoob.com)</title>
</head>
<body>
<form action="welcome.php" method="post">
名字: <input type="text" name="name">
年齡: <input type="text" name="age">
<input type="submit">
</form>
</body>
</html>
取回 "welcome.php" 文件中的值,如下所示:
<html>
<head>
<meta charset="utf-8">
<title>dd(runoob.com)</title>
</head>
<body>
歡迎 <?php echo $_POST["name"]; ?>.<br>
你 <?php echo $_POST["age"]; ?> 歲了。
</body>
</html>
PHP Session
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> 標籤之前:
<?php session_start(); ?>
<html>
<body>
</body>
</html>
上面的代碼會向服務器註冊用戶的會話,以便您可以開始保存用戶信息,同時會爲用戶會話分配一個 UID。
存儲 Session 變量
存儲和取回 session 變量的正確方法是使用 PHP $_SESSION 變量:
<?php
session_start();
// 存儲 session 數據
$_SESSION['views']=1;
?>
<html>
<head>
<meta charset="utf-8">
<title>fff(runoob.com)</title>
</head>
<body>
<?php
// 檢索 session 數據
echo "瀏覽量:". $_SESSION['views'];
?>
</body>
</html>
輸出:
瀏覽量:1
在下面的實例中,我們創建了一個簡單的 page-view 計數器。isset() 函數檢測是否已設置 "views" 變量。如果已設置 "views" 變量,我們累加計數器。如果 "views" 不存在,則創建 "views" 變量,並把它設置爲 1:
<?php
session_start();
if(isset($_SESSION['views']))
{
$_SESSION['views']=$_SESSION['views']+1;
}
else
{
$_SESSION['views']=1;
}
echo "瀏覽量:". $_SESSION['views'];
?>
銷燬 Session
如果您希望刪除某些 session 數據,可以使用 unset() 或 session_destroy() 函數。
unset() 函數用於釋放指定的 session 變量:
<?php
session_start();
if(isset($_SESSION['views']))
{
unset($_SESSION['views']);
}
?>
您也可以通過調用 session_destroy() 函數徹底銷燬 session:
<?php
session_destroy();
?>
註釋:session_destroy() 將重置 session,您將失去所有已存儲的 session 數據。
PHP 發送電子郵件
PHP 允許您從腳本直接發送電子郵件。
PHP mail() 函數
PHP mail() 函數用於從腳本中發送電子郵件。
語法
mail(to,subject,message,headers,parameters)
參數 |
描述 |
to |
必需。規定 email 接收者。 |
subject |
必需。規定 email 的主題。註釋:該參數不能包含任何新行字符。 |
message |
必需。定義要發送的消息。應使用 LF (\n) 來分隔各行。每行應該限制在 70 個字符內。 |
headers |
可選。規定附加的標題,比如 From、Cc 和 Bcc。應當使用 CRLF (\r\n) 分隔附加的標題。 |
parameters |
可選。對郵件發送程序規定額外的參數。 |
PHP 簡易 E-Mail
通過 PHP 發送電子郵件的最簡單的方式是發送一封文本 email。
在下面的實例中,我們首先聲明變量($to, $subject, $message, $from, $headers),然後我們在 mail() 函數中使用這些變量來發送了一封 E-mail:
<?php
$to = "[email protected]"; // 郵件接收者
$subject = "參數郵件"; // 郵件標題
$message = "Hello! 這是郵件的內容。"; // 郵件正文
$from = "[email protected]"; // 郵件發送者
$headers = "From:" . $from; // 頭部信息設置
mail($to,$subject,$message,$headers);
echo "郵件已發送";
?>
PHP Mail 表單
通過 PHP,您能夠在自己的站點製作一個反饋表單。下面的實例向指定的 e-mail 地址發送了一條文本消息:
<html>
<head>
<meta charset="utf-8">
<title>hjp(runoob.com)</title>
</head>
<body>
<?php
if (isset($_REQUEST['email'])) { // 如果接收到郵箱參數則發送郵件
// 發送郵件
$email = $_REQUEST['email'] ;
$subject = $_REQUEST['subject'] ;
$message = $_REQUEST['message'] ;
mail("[email protected]", $subject,
$message, "From:" . $email);
echo "郵件發送成功";
} else { // 如果沒有郵箱參數則顯示錶單
echo "<form method='post' action='mailform.php'>
Email: <input name='email' type='text'><br>
Subject: <input name='subject' type='text'><br>
Message:<br>
<textarea name='message' rows='15' cols='40'>
</textarea><br>
<input type='submit'>
</form>";
}
?>
</body>
</html>
實例解釋:
- 首先,檢查是否填寫了郵件輸入框
- 如果未填寫(比如在頁面被首次訪問時),輸出 HTML 表單
- 如果已填寫(在表單被填寫後),從表單發送電子郵件
- 當填寫完表單點擊提交按鈕後,頁面重新載入,可以看到郵件輸入被重置,同時顯示郵件發送成功的消息
註釋:這個簡易發送 e-mail 不安全,在本教程的下一章中,您將閱讀到更多關於電子郵件腳本中的安全隱患,我們將爲您講解如何驗證用戶輸入使它更安全。
PHP Secure E-mails
在上一節中的 PHP e-mail 腳本中,存在着一個漏洞。
PHP E-mail 注入
首先,請看上一章中的 PHP 代碼:
<html>
<head>
<meta charset="utf-8">
<title>hjp(runoob.com)</title>
</head>
<body>
<?php
if (isset($_REQUEST['email'])) { // 如果接收到郵箱參數則發送郵件
// 發送郵件
$email = $_REQUEST['email'] ;
$subject = $_REQUEST['subject'] ;
$message = $_REQUEST['message'] ;
mail("[email protected]", $subject,
$message, "From:" . $email);
echo "郵件發送成功";
} else { // 如果沒有郵箱參數則顯示錶單
echo "<form method='post' action='mailform.php'>
Email: <input name='email' type='text'><br>
Subject: <input name='subject' type='text'><br>
Message:<br>
<textarea name='message' rows='15' cols='40'>
</textarea><br>
<input type='submit'>
</form>";
}
?>
</body>
</html>
以上代碼存在的問題是,未經授權的用戶可通過輸入表單在郵件頭部插入數據。
假如用戶在表單中的輸入框內加入如下文本到電子郵件中,會出現什麼情況呢?
someone@example.com%0ACc:person2@example.com
%0ABcc:person3@example.com,person3@example.com,
anotherperson4@example.com,person5@example.com
%0ABTo:person6@example.com
與往常一樣,mail() 函數把上面的文本放入郵件頭部,那麼現在頭部有了額外的 Cc:、Bcc: 和 To: 字段。當用戶點擊提交按鈕時,這封 e-mail 會被髮送到上面所有的地址!
PHP 防止 E-mail 注入
防止 e-mail 注入的最好方法是對輸入進行驗證。
下面的代碼與上一章中的類似,不過這裏我們已經增加了檢測表單中 email 字段的輸入驗證程序:
<html>
<head>
<meta charset="utf-8">
<title>hjp(runoob.com)</title>
</head>
<body>
<?php
function spamcheck($field)
{
// filter_var() 過濾 e-mail
// 使用 FILTER_SANITIZE_EMAIL
$field=filter_var($field, FILTER_SANITIZE_EMAIL);
//filter_var() 過濾 e-mail
// 使用 FILTER_VALIDATE_EMAIL
if(filter_var($field, FILTER_VALIDATE_EMAIL))
{
return TRUE;
}
else
{
return FALSE;
}
}
if (isset($_REQUEST['email']))
{
// 如果接收到郵箱參數則發送郵件
// 判斷郵箱是否合法
$mailcheck = spamcheck($_REQUEST['email']);
if ($mailcheck==FALSE)
{
echo "非法輸入";
}
else
{
// 發送郵件
$email = $_REQUEST['email'] ;
$subject = $_REQUEST['subject'] ;
$message = $_REQUEST['message'] ;
mail("[email protected]", "Subject: $subject",
$message, "From: $email" );
echo "Thank you for using our mail form";
}
}
else
{
// 如果沒有郵箱參數則顯示錶單
echo "<form method='post' action='mailform.php'>
Email: <input name='email' type='text'><br>
Subject: <input name='subject' type='text'><br>
Message:<br>
<textarea name='message' rows='15' cols='40'>
</textarea><br>
<input type='submit'>
</form>";
}
?>
</body>
</html>
在上面的代碼中,我們使用了 PHP 過濾器來對輸入進行驗證:
PHP 錯誤處理
在 PHP 中,默認的錯誤處理很簡單。一條錯誤消息會被髮送到瀏覽器,這條消息帶有文件名、行號以及描述錯誤的消息。
PHP 錯誤處理
在創建腳本和 Web 應用程序時,錯誤處理是一個重要的部分。如果您的代碼缺少錯誤檢測編碼,那麼程序看上去很不專業,也爲安全風險敞開了大門。
本教程介紹了 PHP 中一些最爲重要的錯誤檢測方法。
我們將爲您講解不同的錯誤處理方法:
- 簡單的 "die()" 語句
- 自定義錯誤和錯誤觸發器
- 錯誤報告
基本的錯誤處理:使用 die() 函數
第一個實例展示了一個打開文本文件的簡單腳本:
第一個實例展示了一個打開文本文件的簡單腳本:
<?php
$file=fopen("welcome.txt","r");
?>
如果文件不存在,您會得到類似這樣的錯誤:
Warning: fopen(welcome.txt) [function.fopen]: failed to open stream:
No such file or directory in /www/runoob/test/test.php on line 2
爲了避免用戶得到類似上面的錯誤消息,我們在訪問文件之前檢測該文件是否存在:
<?php
if(!file_exists("welcome.txt"))
{
die("文件不存在");
}
else
{
$file=fopen("welcome.txt","r");
}
?>
現在,如果文件不存在,您會得到類似這樣的錯誤消息:
文件不存在
相比之前的代碼,上面的代碼更有效,這是由於它採用了一個簡單的錯誤處理機制在錯誤之後終止了腳本。
然而,簡單地終止腳本並不總是恰當的方式。讓我們研究一下用於處理錯誤的備選的 PHP 函數。
創建自定義錯誤處理器
創建一個自定義的錯誤處理器非常簡單。我們很簡單地創建了一個專用函數,可以在 PHP 中發生錯誤時調用該函數。
該函數必須有能力處理至少兩個參數 (error level 和 error message),但是可以接受最多五個參數(可選的:file, line-number 和 error context):
語法
error_function(error_level,error_message,
error_file,error_line,error_context)
參數 |
描述 |
error_level |
必需。爲用戶定義的錯誤規定錯誤報告級別。必須是一個數字。參見下面的表格:錯誤報告級別。 |
error_message |
必需。爲用戶定義的錯誤規定錯誤消息。 |
error_file |
可選。規定錯誤發生的文件名。 |
error_line |
可選。規定錯誤發生的行號。 |
error_context |
可選。規定一個數組,包含了當錯誤發生時在用的每個變量以及它們的值。 |
錯誤報告級別
這些錯誤報告級別是用戶自定義的錯誤處理程序處理的不同類型的錯誤:
值 |
常量 |
描述 |
2 |
E_WARNING |
非致命的 run-time 錯誤。不暫停腳本執行。 |
8 |
E_NOTICE |
run-time 通知。在腳本發現可能有錯誤時發生,但也可能在腳本正常運行時發生。 |
256 |
E_USER_ERROR |
致命的用戶生成的錯誤。這類似於程序員使用 PHP 函數 trigger_error() 設置的 E_ERROR。 |
512 |
E_USER_WARNING |
非致命的用戶生成的警告。這類似於程序員使用 PHP 函數 trigger_error() 設置的 E_WARNING。 |
1024 |
E_USER_NOTICE |
用戶生成的通知。這類似於程序員使用 PHP 函數 trigger_error() 設置的 E_NOTICE。 |
4096 |
E_RECOVERABLE_ERROR |
可捕獲的致命錯誤。類似 E_ERROR,但可被用戶定義的處理程序捕獲。(參見 set_error_handler()) |
8191 |
E_ALL |
所有錯誤和警告。(在 PHP 5.4 中,E_STRICT 成爲 E_ALL 的一部分) |
現在,讓我們創建一個處理錯誤的函數:
-
function customError($errno, $errstr)
-
{
-
echo "<b>Error:</b> [$errno] $errstr<br>";
-
echo "腳本結束";
-
die();
-
}
代碼是一個簡單的錯誤處理函數。當它被觸發時,它會取得錯誤級別和錯誤消息。然後它會輸出錯誤級別和消息,並終止腳本。
現在,我們已經創建了一個錯誤處理函數,我們需要確定在何時觸發該函數。
設置錯誤處理程序
PHP 的默認錯誤處理程序是內建的錯誤處理程序。我們打算把上面的函數改造爲腳本運行期間的默認錯誤處理程序。
可以修改錯誤處理程序,使其僅應用到某些錯誤,這樣腳本就能以不同的方式來處理不同的錯誤。然而,在本例中,我們打算針對所有錯誤來使用我們自定義的錯誤處理程序:
set_error_handler("customError");
由於我們希望我們的自定義函數能處理所有錯誤,set_error_handler() 僅需要一個參數,可以添加第二個參數來規定錯誤級別。
通過嘗試輸出不存在的變量,來測試這個錯誤處理程序:
<?php
// 錯誤處理函數
function customError($errno, $errstr)
{
echo "<b>Error:</b> [$errno] $errstr";
}
// 設置錯誤處理函數
set_error_handler("customError");
// 觸發錯誤
echo($test);
?>
以上代碼的輸出如下所示:
Error: [8] Undefined variable: test
觸發錯誤
在腳本中用戶輸入數據的位置,當用戶的輸入無效時觸發錯誤是很有用的。在 PHP 中,這個任務由 trigger_error() 函數完成。
實例
在本例中,如果 "test" 變量大於 "1",就會發生錯誤:
<?php
$test=2;
if ($test>1)
{
trigger_error("變量值必須小於等於 1");
}
?>
以上代碼的輸出如下所示:
Notice: 變量值必須小於等於 1
in /www/test/runoob.php on line 5
您可以在腳本中任何位置觸發錯誤,通過添加的第二個參數,您能夠規定所觸發的錯誤級別。
可能的錯誤類型:
- E_USER_ERROR - 致命的用戶生成的 run-time 錯誤。錯誤無法恢復。腳本執行被中斷。
- E_USER_WARNING - 非致命的用戶生成的 run-time 警告。腳本執行不被中斷。
- E_USER_NOTICE - 默認。用戶生成的 run-time 通知。在腳本發現可能有錯誤時發生,但也可能在腳本正常運行時發生。
實例
在本例中,如果 "test" 變量大於 "1",則發生 E_USER_WARNING 錯誤。如果發生了 E_USER_WARNING,我們將使用我們自定義的錯誤處理程序並結束腳本:
<?php
// 錯誤處理函數
function customError($errno, $errstr)
{
echo "<b>Error:</b> [$errno] $errstr<br>";
echo "腳本結束";
die();
}
// 設置錯誤處理函數
set_error_handler("customError",E_USER_WARNING);
// 觸發錯誤
$test=2;
if ($test>1)
{
trigger_error("變量值必須小於等於 1",E_USER_WARNING);
}
?>
以上代碼的輸出如下所示:
Error: [512] 變量值必須小於等於 1
腳本結束
現在,我們已經學習瞭如何創建自己的 error,以及如何觸發它們,接下來我們研究一下錯誤記錄。
錯誤記錄
在默認的情況下,根據在 php.ini 中的 error_log 配置,PHP 向服務器的記錄系統或文件發送錯誤記錄。通過使用 error_log() 函數,您可以向指定的文件或遠程目的地發送錯誤記錄。
通過電子郵件向您自己發送錯誤消息,是一種獲得指定錯誤的通知的好辦法。
通過 E-Mail 發送錯誤消息
在下面的例子中,如果特定的錯誤發生,我們將發送帶有錯誤消息的電子郵件,並結束腳本:
<?php
// 錯誤處理函數
function customError($errno, $errstr)
{
echo "<b>Error:</b> [$errno] $errstr<br>";
echo "已通知網站管理員";
error_log("Error: [$errno] $errstr",1,
"[email protected]","From: [email protected]");
}
// 設置錯誤處理函數
set_error_handler("customError",E_USER_WARNING);
// 觸發錯誤
$test=2;
if ($test>1)
{
trigger_error("變量值必須小於等於 1",E_USER_WARNING);
}
?>
以上代碼的輸出如下所示:
Error: [512] 變量值必須小於等於 1
已通知網站管理員
接收自以上代碼的郵件如下所示:
Error: [512] 變量值必須小於等於 1
這個方法不適合所有的錯誤。常規錯誤應當通過使用默認的 PHP 記錄系統在服務器上進行記錄。
PHP 異常處理
異常用於在指定的錯誤發生時改變腳本的正常流程。
異常是什麼
PHP 5 提供了一種新的面向對象的錯誤處理方法。
異常處理用於在指定的錯誤(異常)情況發生時改變腳本的正常流程。這種情況稱爲異常。
當異常被觸發時,通常會發生:
- 當前代碼狀態被保存
- 代碼執行被切換到預定義(自定義)的異常處理器函數
- 根據情況,處理器也許會從保存的代碼狀態重新開始執行代碼,終止腳本執行,或從代碼中另外的位置繼續執行腳本
我們將展示不同的錯誤處理方法:
- 異常的基本使用
- 創建自定義的異常處理器
- 多個異常
- 重新拋出異常
- 設置頂層異常處理器
註釋:異常應該僅僅在錯誤情況下使用,而不應該用於在一個指定的點跳轉到代碼的另一個位置。
異常的基本使用
當異常被拋出時,其後的代碼不會繼續執行,PHP 會嘗試查找匹配的 "catch" 代碼塊。
如果異常沒有被捕獲,而且又沒用使用 set_exception_handler() 作相應的處理的話,那麼將發生一個嚴重的錯誤(致命錯誤),並且輸出 "Uncaught Exception" (未捕獲異常)的錯誤消息。
讓我們嘗試拋出一個異常,同時不去捕獲它:
-
<?php
-
-
function checkNum($number)
-
{
-
if($number>1)
-
{
-
throw new Exception("Value must be 1 or below");
-
}
-
return true;
-
}
-
-
-
checkNum(2);
-
?>
上面的代碼會得到類似這樣的一個錯誤:
Fatal error: Uncaught exception 'Exception' with message 'Value must be 1 or below' in /www/runoob/test/test.php:7 Stack trace:
#0 /www/runoob/test/test.php(13): checkNum(2) #1 {main} thrown in /www/runoob/test/test.php on line 7
==========待細深入==========
PHP 過濾器
PHP 過濾器用於驗證和過濾來自非安全來源的數據,比如用戶的輸入。
什麼是 PHP 過濾器?
PHP 過濾器用於驗證和過濾來自非安全來源的數據。
測試、驗證和過濾用戶輸入或自定義數據是任何 Web 應用程序的重要組成部分。
PHP 的過濾器擴展的設計目的是使數據過濾更輕鬆快捷。
爲什麼使用過濾器?
幾乎所有的 Web 應用程序都依賴外部的輸入。這些數據通常來自用戶或其他應用程序(比如 web 服務)。通過使用過濾器,您能夠確保應用程序獲得正確的輸入類型。
您應該始終對外部數據進行過濾!
輸入過濾是最重要的應用程序安全課題之一。
什麼是外部數據?
- 來自表單的輸入數據
- Cookies
- Web services data
- 服務器變量
- 數據庫查詢結果
函數和過濾器
如需過濾變量,請使用下面的過濾器函數之一:
- filter_var() - 通過一個指定的過濾器來過濾單一的變量
- filter_var_array() - 通過相同的或不同的過濾器來過濾多個變量
- filter_input - 獲取一個輸入變量,並對它進行過濾
- filter_input_array - 獲取多個輸入變量,並通過相同的或不同的過濾器對它們進行過濾
在下面的實例中,我們用 filter_var() 函數驗證了一個整數:
<?php
$int = 123;
if(!filter_var($int, FILTER_VALIDATE_INT))
{
echo("不是一個合法的整數");
}
else
{
echo("是個合法的整數");
}
?>
==========待細深入==========
PHP 高級過濾器
檢測一個數字是否在一個範圍內
以下實例使用了 filter_var() 函數來檢測一個 INT 型的變量是否在 1 到 200 內:
-
<?php
-
$int = 122;
-
$min = 1;
-
$max = 200;
-
-
if (filter_var($int, FILTER_VALIDATE_INT, array("options" => array("min_range"=>$min, "max_range"=>$max))) === false) {
-
echo("變量值不在合法範圍內");
-
} else {
-
echo("變量值在合法範圍內");
-
}
-
?>
檢測 IPv6 地址
以下實例使用了 filter_var() 函數來檢測一個 $ip 變量是否是IPv6 地址:
-
<?php
-
$ip = "2001:0db8:85a3:08d3:1319:8a2e:0370:7334";
-
-
if (!filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6) === false) {
-
echo("$ip 是一個 IPv6 地址");
-
} else {
-
echo("$ip 不是一個 IPv6 地址");
-
}
-
?>
檢測 URL - 必須包含QUERY_STRING(查詢字符串)
以下實例使用了 filter_var() 函數來檢測 $url 是否包含查詢字符串:
-
<?php
-
-
$url = "http://www.runoob.com";
-
-
if (!filter_var($url, FILTER_VALIDATE_URL, FILTER_FLAG_QUERY_REQUIRED) === false) {
-
echo("$url 是一個合法的 URL");
-
} else {
-
echo("$url 不是一個合法的 URL");
-
}
-
?>
移除 ASCII 值大於 127 的字符
以下實例使用了 filter_var() 函數來移除字符串中 ASCII 值大於 127 的字符,同樣它也能移除 HTML 標籤:
-
<?php
-
$str = "<h1>Hello WorldÆØÅ!</h1>";
-
-
$newstr = filter_var($str, FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_HIGH);
-
echo $newstr;
-
?>
PHP JSON
本章節我們將爲大家介紹如何使用 PHP 語言來編碼和解碼 JSON 對象。
環境配置
在 php5.2.0 及以上版本已經內置 JSON 擴展。
JSON 函數
函數 |
描述 |
json_encode |
對變量進行 JSON 編碼 |
json_decode |
對 JSON 格式的字符串進行解碼,轉換爲 PHP 變量 |
json_last_error |
返回最後發生的錯誤 |
json_encode
PHP json_encode() 用於對變量進行 JSON 編碼,該函數如果執行成功返回 JSON 數據,否則返回 FALSE 。
語法
string json_encode ( $value [, $options = 0 ] )
參數
- value: 要編碼的值。該函數只對 UTF-8 編碼的數據有效。
- options:由以下常量組成的二進制掩碼:JSON_HEX_QUOT, JSON_HEX_TAG, JSON_HEX_AMP, JSON_HEX_APOS, JSON_NUMERIC_CHECK,JSON_PRETTY_PRINT, JSON_UNESCAPED_SLASHES, JSON_FORCE_OBJECT
實例
以下實例演示瞭如何將 PHP 數組轉換爲 JSON 格式數據:
<?php
$arr = array('a' => 1, 'b' => 2, 'c' => 3, 'd' => 4, 'e' => 5);
echo json_encode($arr);
?>
以上代碼執行結果爲:
{"a":1,"b":2,"c":3,"d":4,"e":5}
以下實例演示瞭如何將 PHP 對象轉換爲 JSON 格式數據:
<?php
class Emp {
public $name = "";
public $hobbies = "";
public $birthdate = "";
}
$e = new Emp();
$e->name = "sachin";
$e->hobbies = "sports";
$e->birthdate = date('m/d/Y h:i:s a', "8/5/1974 12:20:03 p");
$e->birthdate = date('m/d/Y h:i:s a', strtotime("8/5/1974 12:20:03"));
echo json_encode($e);
?>
以上代碼執行結果爲:
{"name":"sachin","hobbies":"sports","birthdate":"08\/05\/1974 12:20:03 pm"}
json_decode
PHP json_decode() 函數用於對 JSON 格式的字符串進行解碼,並轉換爲 PHP 變量。
語法
mixed json_decode ($json [,$assoc = false [, $depth = 512 [, $options = 0 ]]])
參數
-
json_string: 待解碼的 JSON 字符串,必須是 UTF-8 編碼數據
-
assoc: 當該參數爲 TRUE 時,將返回數組,FALSE 時返回對象。
-
depth: 整數類型的參數,它指定遞歸深度
-
options: 二進制掩碼,目前只支持 JSON_BIGINT_AS_STRING 。
實例
以下實例演示瞭如何解碼 JSON 數據:
<?php
$json = '{"a":1,"b":2,"c":3,"d":4,"e":5}';
var_dump(json_decode($json));
var_dump(json_decode($json, true));
?>
以上代碼執行結果爲:
object(stdClass)#1 (5) {
["a"] => int(1)
["b"] => int(2)
["c"] => int(3)
["d"] => int(4)
["e"] => int(5)
}
array(5) {
["a"] => int(1)
["b"] => int(2)
["c"] => int(3)
["d"] => int(4)
["e"] => int(5)
}