基本的 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 参数。如果脚本运行在一个虚拟主机上,则该值是那个虚拟主机的值。(如:someone@runoob.com) |
$_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>");
- ?>
![](https://img-blog.csdn.net/20161024235602248?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
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 = "someone@example.com"; // 邮件接收者
$subject = "参数邮件"; // 邮件标题
$message = "Hello! 这是邮件的内容。"; // 邮件正文
$from = "someonelse@example.com"; // 邮件发送者
$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("someone@example.com", $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("someone@example.com", $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("someone@example.com", "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,
"someone@example.com","From: webmaster@example.com");
}
// 设置错误处理函数
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)
}