PHP (Hypertext Preprocessor)是一种创建动态交互性站点的强有力的服务器端脚本语言。PHP 是免费的,并且使用非常广泛。同时,对于像微软 ASP 这样的竞争者来说,PHP 无疑是另一种高效率的选项。

1. PHP基本语法

基本格式

PHP脚本以<?php开始,以?>结束。PHP代码通常嵌入在HTML中运行。

PHP 中的每个代码行都必须以分号结束。分号是一种分隔符,用于把指令集区分开来。

通过 PHP,有两种在浏览器输出文本的基础指令:echoprint

1
2
3
4
5
6
7
8
9
10
<!DOCTYPE html>
<html>
<body>

<?php
echo "Hello, World!";
?>

</body>
</html>

在 PHP 中有两个基本的输出方式: echo 和 print

echo 和 print 区别:

  • echo - 可以输出一个或多个字符串
  • print - 只允许输出一个字符串,返回值总为 1

**提示:**echo 输出的速度比 print 快, echo 没有返回值,print有返回值1。

echo 是一个语言结构,使用的时候可以不用加括号,也可以加上括号: echo 或 echo()

显示字符串

下面的实例演示了如何使用 echo 命令输出字符串(字符串可以包含 HTML 标签):

1
2
3
4
5
6
<?php
echo "<h2>PHP 很有趣!</h2>";
echo "Hello world!<br>";
echo "我要学 PHP!<br>";
echo "这是一个", "字符串,", "使用了", "多个", "参数。";
?>
1
2
3
4
5
6
7
8
9
10
11
12
13
//显示变量 下面的实例演示了如何使用 echo 命令输出变量和字符串

<?php
$txt1="学习 PHP";
$txt2="RUNOOB.COM";
$cars=array("Volvo","BMW","Toyota");

echo $txt1;
echo "<br>";
echo "在 $txt2 学习 PHP ";
echo "<br>";
echo "我车的品牌是 {$cars[0]}";
?>

print 同样是一个语言结构,可以使用括号,也可以不使用括号: print 或 print()

1
2
3
4
5
<?php
print "<h2>PHP 很有趣!</h2>";
print "Hello world!<br>";
print "我要学习 PHP!";
?>
1
2
3
4
5
6
7
8
9
10
11
<?php
$txt1="学习 PHP";
$txt2="RUNOOB.COM";
$cars=array("Volvo","BMW","Toyota");

print $txt1;
print "<br>";
print "在 $txt2 学习 PHP ";
print "<br>";
print "我车的品牌是 {$cars[0]}";
?>

echo,print,print_r,var_dump 的区别

1.echo

输出一个或者多个字符串。

2.print

和 echo 最主要的区别: print 仅支持一个参数,并总是返回 1。

3.print_r

打印关于变量的易于理解的信息,如果给出的是 string、integer 或 float,将打印变量值本身。如果给出的是 array,将会按照一定格式显示键和元素。object 与数组类似。 记住,print_r() 将把数组的指针移到最后边。使用 reset() 可让指针回到开始处。

4.var_dump

此函数显示关于一个或多个表达式的结构信息,包括表达式的类型与值。数组将递归展开值,通过缩进显示其结构。

5.var_dump 和 print_r 的区别

var_dump 返回表达式的类型与值而 print_r 仅返回结果,相比调试代码使用 var_dump 更便于阅读。

EOF

PHP EOF(heredoc)是一种在命令行shell(如sh、csh、ksh、bash、PowerShell和zsh)和程序语言(像Perl、PHP、Python和Ruby)里定义一个字符串的方法。

使用概述:

    1. 必须后接分号,否则编译通不过。
    1. EOF 可以用任意其它字符代替,只需保证结束标识与开始标识一致。
  • 3. 结束标识必须顶格独自占一行(即必须从行首开始,前后不能衔接任何空白和字符)。
    1. 开始标识可以不带引号或带单双引号,不带引号与带双引号效果一致,解释内嵌的变量和转义符号,带单引号则不解释内嵌的变量和转义符号。
1
2
3
4
5
6
7
8
9
10
11
12
<?php
$name="runoob";
$a= <<<EOF
"abc"$name
"123"
EOF;
// 结束需要独立一行且前后不能空格
echo $a;
?>

/* 1.PHP 定界符 EOF 的作用就是按照原样,包括换行格式什么的,输出在其内部的东西;
2.在 PHP 定界符 EOF 中的任何特殊字符都不需要转义*/

<<<EOF 开始标记开始,以 EOF 结束标记结束,结束标记必须顶头写,不能有缩进和空格,且在结束标记末尾要有分号 。

变量

变量可以是很短的名称(如 x 和 y)或者更具描述性的名称(如 age、carname、totalvolume)。

PHP 变量规则:

  • 变量以 $ 符号开始,后面跟着变量的名称
  • 变量名必须以字母或者下划线字符开始
  • 变量名只能包含字母、数字以及下划线(A-z、0-9 和 _ )
  • 变量名不能包含空格
  • 变量名是区分大小写的($y 和 $Y 是两个不同的变量)
1
2
3
4
5
6
7
8
9
10
11
<?php
$txt = "Hello, World!";
$x = 5;
$y = 10.5;

echo $txt;
echo "<br>"; //换行符
echo $x;
echo "<br>";
echo $y;
?>

PHP 没有声明变量的命令。

变量在您第一次赋值给它的时候被创建

在所有函数外部定义的变量,拥有全局作用域。除了函数外,全局变量可以被脚本中的任何部分访问,要在一个函数中访问一个全局变量,需要使用 global 关键字。

在 PHP 函数内部声明的变量是局部变量,仅能在函数内部访问

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?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";
?>

PHP 变量作用域

变量的作用域是脚本中变量可被引用/使用的部分。

PHP 有四种不同的变量作用域:

  • local
  • global
  • static
  • parameter

global 关键字用于函数内访问全局变量。

在函数内调用函数外定义的全局变量,我们需要在函数中的变量前加上 global 关键字:

1
2
3
4
5
6
7
<?php $x=5; $y=10;  

function myTest() { global $x,$y; $y=$x+$y; }

myTest();

echo $y; // 输出 15 ?>

PHP 将所有全局变量存储在一个名为 $GLOBALS[index] 的数组中。 index 保存变量的名称。这个数组可以在函数内部访问,也可以直接用来更新全局变量。

1
2
3
4
5
6
7
8
9
10
11
12
<?php
$x=5;
$y=10;

function myTest()
{
$GLOBALS['y']=$GLOBALS['x']+$GLOBALS['y'];
}

myTest();
echo $y;
?>

当一个函数完成时,它的所有变量通常都会被删除。然而,有时候您希望某个局部变量不要被删除。

要做到这一点,请在您第一次声明变量时使用 static 关键字:

1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
function myTest()
{
static $x=0;
echo $x;
$x++;
echo "<br>"; // 换行符
}

myTest();
myTest();
myTest();
?>
1
2
3
0
1
2//运行结果

没有使用static

1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
function myTest()
{
$x=0;
echo $x;
$x++;
echo "<br>"; // 换行符
}

myTest();
myTest();
myTest();
?>
1
2
3
0
0
0// 结果

然后,每次调用该函数时,该变量将会保留着函数前一次被调用时的值。

**注释:**该变量仍然是函数的局部变量。

参数作用域

参数是通过调用代码将值传递给函数的局部变量。

参数是在参数列表中声明的,作为函数声明的一部分

数据类型

PHP 变量存储不同的类型的数据,不同的数据类型可以做不一样的事情。

PHP 支持以下几种数据类型:

  • String(字符串)
  • Integer(整型)整型可以用三种格式来指定:十进制, 十六进制( 以 0x 为前缀)或八进制(前缀为 0)。
  • Float(浮点型)
  • Boolean(布尔型)
  • Array(数组)
  • Object(对象)
  • NULL(空值)
  • Resource(资源类型)
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php 
$x = 5985;
var_dump($x);//var_dump() 函数返回变量的数据类型和值
echo "<br>";
$x = -345; // 负数
var_dump($x);
echo "<br>";
$x = 0x8C; // 十六进制数
var_dump($x);
echo "<br>";
$x = 047; // 八进制数
var_dump($x);
?>
1
2
3
4
5
6
<?php
$str = "Hello, World!"; // 字符串
$int = 123; // 整数
$float = 10.5; // 浮点数
$bool = true; // 布尔值
?>

PHP NULL 值

NULL 值表示变量没有值。NULL 是数据类型为 NULL 的值。

NULL 值指明一个变量是否为空值。 同样可用于数据空值和NULL值的区别。

可以通过设置变量值为 NULL 来清空变量数据

1
2
3
4
5
<?php
$x="Hello world!";
$x=null;
var_dump($x);
?>

PHP 资源类型

PHP 资源 resource 是一种特殊变量,保存了到外部资源的一个引用。

常见资源数据类型有打开文件、数据库连接、图形画布区域等。

由于资源类型变量保存有为打开文件、数据库连接、图形画布区域等的特殊句柄,因此将其它类型的值转换为资源没有意义。

使用 get_resource_type() 函数可以返回资源(resource)类型

1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
$c = mysql_connect();
echo get_resource_type($c)."\n";
// 打印:mysql link

$fp = fopen("foo","w");
echo get_resource_type($fp)."\n";
// 打印:file

$doc = new_xmldoc("1.0");
echo get_resource_type($doc->doc)."\n";
// 打印:domxml document
?>
  • 松散比较:使用两个等号 == 比较,只比较值,不比较类型。
  • 严格比较:用三个等号 === 比较,除了比较值,也比较类型。

PHP 中的常量是指一旦定义后其值不能被改变的标识符。

常量值被定义后,在脚本的其他任何地方都不能被改变。

常量可以用 define() 函数或 const 关键字来定义。

常量的特性


PHP 常量

  1. 不变性: 常量一旦定义,其值不能改变。
  2. 全局作用域: 常量在定义后,可以在整个脚本的任何地方使用,无需使用 global 关键字。
  3. 数据类型: 常量的值可以是标量数据类型(如布尔值、整数、浮点数、字符串)或数组(PHP 7 及以上版本)。
  4. 区分大小写: 常量名称默认是区分大小写的。如果需要定义大小写不敏感的常量,可以在 define() 函数的第三个参数设置为 true

常量是一个简单值的标识符,该值在脚本中不能改变。

一个常量由英文字母、下划线、和数字组成,但数字不能作为首字母出现。 (常量名不需要加 $ 修饰符)。

注意: 常量在整个脚本中都可以使用。


设置 PHP 常量

设置常量,使用 define() 函数,函数语法如下:

1
bool define ( string $name , mixed $value [, bool $case_insensitive = false ] )

该函数有三个参数:

  • **name:**必选参数,常量名称,即标志符。

  • **value:**必选参数,常量的值。

  • case_insensitive :可选参数,如果设置为 TRUE,该常量则大小写不敏感,默认是大小写敏感的。

    **注意:**自 PHP 7.3.0 开始,定义不区分大小写的常量已被弃用。从 PHP 8.0.0 开始,只有 false 是可接受的值,传递 true 将产生一个警告。

使用 const 关键字

1
const CONSTANT_NAME = "value";

用常量时,不能在常量名前添加**$** 符号,不然会将常量转换成新的未定义变量使用,会导致报错。

预定义常量

PHP 提供了一些预定义常量,可以在脚本中直接使用。这些常量通常用于获取 PHP 的配置信息、版本信息等。常见的预定义常量有:

  • PHP_VERSION:当前 PHP 解析器的版本。
  • PHP_OS:服务器的操作系统。
  • PHP_INT_MAX:最大的整数值。
  • E_ERRORE_WARNINGE_PARSE 等:错误报告级别。

PHP 并置运算符

在 PHP 中,只有一个字符串运算符。

并置运算符 (.) 用于把两个字符串值连接起来。

下面的实例演示了如何将两个字符串变量连接在一起:

1
2
3
4
5
<?php
$txt1="Hello world!";
$txt2="What a nice day!";
echo $txt1 . " " . $txt2;
?>

上面的代码将输出:Hello world! What a nice day!

**提示:**在上面的代码中,我们已经使用了两次并置运算符。这是由于我们需要在两个字符串之间插入一个空格。

PHP strlen() 函数

有时知道字符串值的长度是很有用的。

strlen() 函数返回字符串的长度(字节数)。

下面的实例返回字符串 “Hello world!” 的长度:

1
2
3
4
5
<?php
echo strlen("Hello world!");
?>


上面的代码将输出:12

**提示:**strlen() 常常用在循环和其他函数中,因为那时确定字符串何时结束是很重要的。(例如,在循环中,我们需要在字符串中的最后一个字符之后结束循环。)


PHP strpos() 函数

strpos() 函数用于在字符串内查找一个字符或一段指定的文本。

如果在字符串中找到匹配,该函数会返回第一个匹配的字符位置。如果未找到匹配,则返回 FALSE。

下面的实例在字符串 “Hello world!” 中查找文本 “world”:

1
2
3
<?php
echo strpos("Hello world!","world");
?>

上面的代码将输出:6

**提示:**在上面的实例中,字符串 “world” 的位置是 6。之所以是 6 而不是 7 的原因是,字符串中第一个字符的位置是 0,而不是 1

运算符:

PHP 运算符主要分为以下几类:

  1. 算术运算符:用于执行基本的数学运算。

    • + 加法
    • - 减法
    • * 乘法
    • / 除法
    • % 取模(余数)
    • **pow() 幂运算
  2. 赋值运算符:用于给变量分配值。

    • = 简单赋值
    • += 加并赋值
    • -= 减并赋值
    • *=, /=, %=, .=, **= 等等
  3. 比较运算符:用于比较两个值。

    • == 等于(值比较,不考虑类型)
    • === 全等(值和类型都相等)
    • != 不等于(值比较,不考虑类型)
    • !== 不全等(值或类型不相等)
    • < 小于
    • > 大于
    • <= 小于等于
    • >= 大于等于
  4. 逻辑运算符:用于进行逻辑判断。

    • && 逻辑与
    • || 逻辑或
    • ! 逻辑非
    • and, or, xor PHP 也支持这些作为逻辑运算符的同义词
  5. 三元运算符:条件表达式,是 if…else… 的简写形式。

    • 条件 ? 表达式1 : 表达式2
  6. 字符串运算符

    • . 字符串连接
    • .= 字符串连接赋值
  7. 成员访问运算符:用于访问对象的属性和方法。

    • -> 对象中的属性或方法访问
    • :: 静态成员访问,也可用于命名空间中的常量访问
  8. 数组运算符

    • ===== 也可以用于比较数组
    • + 数组合并(但不常用,推荐使用 array_merge()
  9. 空合并运算符 (??):从 PHP 7 开始引入,用于在变量为 NULL 或未设置时提供默认值。

    • expr1 ?? expr2 如果 expr1 存在且不为 NULL,则返回 expr1,否则返回 expr2

了解并熟练运用这些运算符对于编写高效的 PHP 代码至关重要。

数组

数组是一个变量,可以在一个变量名中存储多个值。

1
2
3
4
5
<?php 
$cars=array("Volvo","BMW","Toyota");
var_dump($cars);
?>
/* output: array(3) { [0]=> string(5) "Volvo" [1]=> string(3) "BMW" [2]=> string(6) "Toyota" } */
1
2
3
4
<?php
$cars = array("Volvo", "BMW", "Toyota");
echo "I like " . $cars[0] . ", " . $cars[1] . " and " . $cars[2] . ".";
?>

获取数组的长度 - count() 函数

count() 函数用于返回数组的长度(元素的数量):

1
2
3
4
<?php
$cars=array("Volvo","BMW","Toyota");
echo count($cars);
?>

遍历数值数组

遍历并打印数值数组中的所有值,您可以使用 for 循环,如下所示:

1
2
3
4
5
6
7
8
9
10
<?php
$cars=array("Volvo","BMW","Toyota");
$arrlength=count($cars);

for($x=0;$x<$arrlength;$x++)
{
echo $cars[$x];
echo "<br>";
}
?>

PHP 关联数组

关联数组是使用您分配给数组的指定的键的数组。

这里有两种创建关联数组的方法:

1
2
3
4
5
6
7
8
$age=array("Peter"=>"35","Ben"=>"37","Joe"=>"43");


$age['Peter']="35";
$age['Ben']="37";
$age['Joe']="43";


  • sort() - 对数组进行升序排列
  • rsort() - 对数组进行降序排列
  • asort() - 根据关联数组的值,对数组进行升序排列
  • ksort() - 根据关联数组的键,对数组进行升序排列
  • arsort() - 根据关联数组的值,对数组进行降序排列
  • krsort() - 根据关联数组的键,对数组进行降序排列

3. 控制结构

3.1 条件语句

PHP有if、else if、else和switch语句。

1
2
3
4
5
6
7
8
9
<?php
$t = date("H");

if ($t < "20") {
echo "Have a good day!";
} else {
echo "Have a good night!";
}
?>

3.2 循环

PHP支持多种循环,包括for、while、do…while和foreach。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?php
// for 循环
for ($x = 0; $x <= 10; $x++) {
echo "The number is: $x <br>";
}

// while 循环
$x = 1;
while($x <= 5) {
echo "The number is: $x <br>";
$x++;
}

// do...while 循环
$x = 1;
do {
echo "The number is: $x <br>";
$x++;
} while ($x <= 5);

// foreach 循环
$colors = array("red", "green", "blue", "yellow");
foreach ($colors as $value) {
echo "$value <br>";
}
?>

4. 函数

PHP有许多内置函数,也可以定义自己的函数。

1
2
3
4
5
6
7
<?php
function writeMsg() {
echo "Hello, World!";
}

writeMsg(); // 调用函数
?>

函数可以有参数和返回值。

1
2
3
4
5
6
7
<?php
function addNumbers($a, $b) {
return $a + $b;
}

echo addNumbers(5, 10); // 输出 15
?>

PHP 魔术常量

PHP 向它运行的任何脚本提供了大量的预定义常量。

不过很多常量都是由不同的扩展库定义的,只有在加载了这些扩展库时才会出现,或者动态加载后,或者在编译时已经包括进去了。

有八个魔术常量它们的值随着它们在代码中的位置改变而改变。

例如 LINE 的值就依赖于它在脚本中所处的行来决定。这些特殊的常量不区分大小写,如下:

1
2
3
4
5
<?php
echo '这是第 " ' . __LINE__ . ' " 行';
?>
//这是第 “ 2 ” 行

FILE

文件的完整路径和文件名。如果用在被包含文件中,则返回被包含的文件名。

自 PHP 4.0.2 起,FILE 总是包含一个绝对路径(如果是符号连接,则是解析后的绝对路径),而在此之前的版本有时会包含一个相对路径。

1
2
3
4
5
<?php
echo '该文件位于 " ' . __FILE__ . ' " ';
?>
//该文件位于 “ E:\wamp\www\test\index.php ”

DIR

文件所在的目录。如果用在被包括文件中,则返回被包括的文件所在的目录。

它等价于 dirname(FILE)。除非是根目录,否则目录中名不包括末尾的斜杠。(PHP 5.3.0中新增)

1
2
3
4
<?php
echo '该文件位于 " ' . __DIR__ . ' " ';
?> //该文件位于 “ E:\wamp\www\test ”

FUNCTION

函数名称(PHP 4.3.0 新加)。自 PHP 5 起本常量返回该函数被定义时的名字(区分大小写)。在 PHP 4 中该值总是小写字母的。

以上实例输出结果为:

1
函数名为:test

CLASS

类的名称(PHP 4.3.0 新加)。自 PHP 5 起本常量返回该类被定义时的名字(区分大小写)。

在 PHP 4 中该值总是小写字母的。类名包括其被声明的作用区域(例如 Foo\Bar)。注意自 PHP 5.4 起 CLASS 对 trait 也起作用。当用在 trait 方法中时,CLASS 是调用 trait 方法的类的名字。

"; echo '函数名为:' . __FUNCTION__ ; } } $t = new test(); $t->_print(); ?>

以上实例输出结果为:

1
2
类名为:test
函数名为:_print

TRAIT

Trait 的名字(PHP 5.4.0 新加)。自 PHP 5.4.0 起,PHP 实现了代码复用的一个方法,称为 traits。

Trait 名包括其被声明的作用区域(例如 Foo\Bar)。

从基类继承的成员被插入的 SayWorld Trait 中的 MyHelloWorld 方法所覆盖。其行为 MyHelloWorld 类中定义的方法一致。优先顺序是当前类中的方法会覆盖 trait 方法,而 trait 方法又覆盖了基类中的方法。

sayHello(); ?>

以上例程会输出:

1
Hello World!

METHOD

类的方法名(PHP 5.0.0 新加)。返回该方法被定义时的名字(区分大小写)。

实例:

以上实例输出结果为:

1
函数名为:test

NAMESPACE

当前命名空间的名称(区分大小写)。此常量是在编译时定义的(PHP 5.3.0 新增)。

实例:

以上实例输出结果为:

1
命名空间为:"MyProject"

在PHP中,面向对象编程(Object-Oriented Programming, OOP)是一种重要的编程范式,它通过使用“类”(Class)和“对象”(Object)的概念来组织和结构化代码。下面是对PHP中类和对象的基本概念和用法的简要介绍:

类(Class)

类是创建对象的蓝图,它定义了一组属性(数据成员)和方法(成员函数)的结构。你可以将类想象为一个模板或者原型,用来生成具有相似特性和行为的对象。

定义类

在PHP中,使用class关键字来定义一个类,并在类体内声明属性和方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
<?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;

// 调用成员函数,设置标题和URL
$runoob->setTitle( "菜鸟教程" );
$taobao->setTitle( "淘宝" );
$google->setTitle( "Google 搜索" );

$runoob->setUrl( 'www.runoob.com' );
$taobao->setUrl( 'www.taobao.com' );
$google->setUrl( 'www.google.com' );

// 调用成员函数,获取标题和URL
$runoob->getTitle();
$taobao->getTitle();
$google->getTitle();

$runoob->getUrl();
$taobao->getUrl();
$google->getUrl();
?>

PHP 构造函数

构造函数是一种特殊的方法。主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,在创建对象的语句中与 new 运算符一起使用。

PHP 5 允许开发者在一个类中定义一个方法作为构造函数,语法格式如下:

1
void __construct ([ mixed $args [, $... ]] )

在上面的例子中我们就可以通过构造方法来初始化 $url 和 $title 变量:

1
2
3
4
function __construct( $par1, $par2 ) {
$this->url = $par1;
$this->title = $par2;
}

对象(Object)

对象是类的实例,即根据类的定义创建的具体实体。每个对象都有其自身的属性值,可以执行类中定义的方法。

创建对象

使用new关键字来创建一个类的实例(对象)。

1
$myCar = new Car("Red", "Toyota Camry");

访问属性和方法

创建对象后,可以使用“->”操作符来访问对象的属性和调用方法。

1
2
echo $myCar->color; // 输出: Red
$myCar->drive(); // 输出: The Red Toyota Camry is driving.

总结

  • 类是定义对象特性和行为的模板。
  • 对象是类的实例,是根据类定义创建的具体实体。
  • 使用class关键字定义类,使用publicprivateprotected等访问修饰符来控制属性和方法的可见性。
  • 通过new关键字创建对象实例。
  • 使用“->”操作符访问对象的属性和方法。

面向对象编程允许你以更加模块化的方式编写代码,提高代码的重用性、可维护性和灵活性。

继承

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php 
// 子类扩展站点类别
class Child_Site extends Site {
var $category;

function setCate($par){
$this->category = $par;
}

function getCate(){
echo $this->category . PHP_EOL;
}
}

方法重写

如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写。

实例中重写了 getUrl 与 getTitle 方法:

1
2
3
4
5
6
7
8
9
10
function getUrl() {
echo $this->url . PHP_EOL;
return $this->url;
}

function getTitle(){
echo $this->title . PHP_EOL;
return $this->title;
}

访问控制

PHP 对属性或方法的访问控制,是通过在前面添加关键字 public(公有),protected(受保护)或 private(私有)来实现的。

  • **public(公有):**公有的类成员可以在任何地方被访问。
  • **protected(受保护):**受保护的类成员则可以被其自身以及其子类和父类访问。
  • **private(私有):**私有的类成员则只能被其定义所在的类访问。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
<?php
/**
* Define MyClass
*/
class MyClass
{
// 声明一个公有的构造函数
public function __construct() { }

// 声明一个公有的方法
public function MyPublic() { }

// 声明一个受保护的方法
protected function MyProtected() { }

// 声明一个私有的方法
private function MyPrivate() { }

// 此方法为公有
function Foo()
{
$this->MyPublic();
$this->MyProtected();
$this->MyPrivate();
}
}

$myclass = new MyClass;
$myclass->MyPublic(); // 这行能被正常执行
$myclass->MyProtected(); // 这行会产生一个致命错误
$myclass->MyPrivate(); // 这行会产生一个致命错误
$myclass->Foo(); // 公有,受保护,私有都可以执行


/**
* Define MyClass2
*/
class MyClass2 extends MyClass
{
// 此方法为公有
function Foo2()
{
$this->MyPublic();
$this->MyProtected();
$this->MyPrivate(); // 这行会产生一个致命错误
}
}

$myclass2 = new MyClass2;
$myclass2->MyPublic(); // 这行能被正常执行
$myclass2->Foo2(); // 公有的和受保护的都可执行,但私有的不行

class Bar
{
public function test() {
$this->testPrivate();
$this->testPublic();
}

public function testPublic() {
echo "Bar::testPublic\n";
}

private function testPrivate() {
echo "Bar::testPrivate\n";
}
}

class Foo extends Bar
{
public function testPublic() {
echo "Foo::testPublic\n";
}

private function testPrivate() {
echo "Foo::testPrivate\n";
}
}

$myFoo = new foo();
$myFoo->test(); // Bar::testPrivate
// Foo::testPublic
?>

5. 表单处理

当然,让我们详细探讨一下PHP处理表单的各个方面,包括创建表单、接收与验证数据、错误处理、以及安全性考虑。

1. 创建HTML表单

输入类型

  • 文本输入 (<input type="text">):用于输入短文本,如用户名。
  • 密码输入 (<input type="password">):用于输入密码,显示为星号。
  • 电子邮件输入 (<input type="email">):自动验证电子邮件格式。
  • 文本区域 (<textarea>):用于多行文本输入。
  • 复选框 (<input type="checkbox">) 和 单选按钮 (<input type="radio">):用于多项选择。
  • 下拉列表 (<select>):提供选项供用户选择。
  • 文件上传 (<input type="file">):允许用户选择文件上传。

表单属性

  • action: 指定处理表单数据的服务器端脚本URL。
  • method: 提交方式,GET用于简单查询,参数显示在URL中;POST用于提交大量数据或敏感数据,数据不会显示在URL中。

2. 接收表单数据

在PHP中,使用$_GET$_POST数组(根据表单的method属性)接收数据。例如,如果表单使用POST方法提交:

1
$username = $_POST['username']; // 获取名为username的输入值

3. 数据验证

基础验证

  • 存在性检查:确保字段非空。
  • 格式验证:使用正则表达式或内置函数,如filter_var()进行格式检查。
  • 长度限制:检查输入长度是否符合要求。

使用filter_var

PHP的filter_var函数提供了多种过滤器,用于数据验证和清理。

1
2
3
4
$email = $_POST['email'];
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
echo "无效的电子邮件地址";
}

4. 数据清理与转义

  • htmlspecialchars:防止XSS攻击,将特殊字符转换成HTML实体。
  • trim:去除字符串首尾空白。
  • mysqli_real_escape_stringPDO预处理语句:防止SQL注入。

5. 错误处理与用户反馈

  • 显示明确的错误信息给用户,指出哪些字段需要修正。
  • 可以使用<div>标签或CSS样式高亮显示错误字段。
  • 保持用户输入:在表单重显时,使用PHP变量回填已输入的合法数据。

6. 表单重定向与防止重复提交

  • 使用HTTP重定向(header('Location: ...'))在处理完表单后引导用户到新的页面。
  • 添加令牌(Token)防止表单重复提交。

7. 安全性最佳实践

  • 验证所有输入:不要信任任何用户输入。
  • 使用预处理语句:在数据库操作中避免SQL注入。
  • 启用CSP(内容安全策略):帮助防御XSS攻击。
  • HTTPS:对敏感数据使用SSL/TLS加密传输。

通过遵循上述步骤和最佳实践,可以有效地创建和处理表单,同时确保应用的安全性和用户体验。

PHP非常适合处理HTML表单。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<!DOCTYPE html>
<html>
<body>

<form method="post" action="<?php echo $_SERVER['PHP_SELF'];?>">
Name: <input type="text" name="fname">
<input type="submit">
</form>

<?php
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$name = htmlspecialchars($_POST['fname']);
echo "Hello, " . $name;
}
?>

</body>
</html>

PHP 中的 $_GET 和 $_POST 变量用于检索表单中的信息,比如用户输入。

有一点很重要的事情值得注意,当处理 HTML 表单时,PHP 能把来自 HTML 页面中的表单元素自动变成可供 PHP 脚本使用

PHP处理表单是Web开发中的常见任务,它涉及收集用户输入并通过HTML表单传递给服务器端的PHP脚本进行处理。以下是使用PHP进行表单操作的基本步骤:

1. 创建HTML表单

首先,你需要在HTML中创建表单,定义输入字段、提交按钮等元素,并指定表单提交的目标PHP文件(action属性)及提交方式(method属性,通常是GETPOST)。

1
2
3
4
5
6
7
8
9
<form action="process_form.php" method="POST">
<label for="username">用户名:</label>
<input type="text" id="username" name="username">
<br>
<label for="email">邮箱:</label>
<input type="email" id="email" name="email">
<br>
<input type="submit" value="提交">
</form>

2. 处理表单数据

在指定的PHP文件(如上例中的process_form.php)中,你可以使用$_POST$_GET超全局变量来访问提交的数据,具体取决于表单的提交方式。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
if ($_SERVER["REQUEST_METHOD"] == "POST") {
// 获取表单数据
$username = $_POST['username'];
$email = $_POST['email'];

// 进行数据验证和处理...
// 示例:验证用户名非空
if (empty($username)) {
echo "用户名不能为空";
} else {
// 数据处理逻辑,如存入数据库、发送邮件等
echo "用户名: " . htmlspecialchars($username) . "<br>";
echo "邮箱: " . htmlspecialchars($email);
}
}
?>

3. 验证和清理输入

在实际应用中,接收到的表单数据需要经过验证和清理,以防止SQL注入、跨站脚本(XSS)等安全威胁。可以使用PHP的filter_var()函数或其他安全措施来实现。

1
2
3
4
5
6
$email = filter_var($_POST['email'], FILTER_VALIDATE_EMAIL);
if (!$email) {
echo "邮箱格式不正确";
} else {
// 邮箱有效,继续处理...
}

PHP $_GET 变量


在 PHP 中,预定义的 $_GET 变量用于收集来自 method=“get” 的表单中的值。


$_GET 变量

预定义的 $_GET 变量用于收集来自 method=“get” 的表单中的值。

从带有 GET 方法的表单发送的信息,对任何人都是可见的(会显示在浏览器的地址栏),并且对发送信息的量也有限制。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<html>
<head>
<meta charset="utf-8">
<title>菜鸟教程(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>

///www.hspcode.com/tp/welcome.php?fname=111&age=1111

在 HTML 表单中使用 method=“get” 时,所有的变量名和值都会显示在 URL 中。

**注释:**所以在发送密码或其他敏感信息时,不应该使用这个方法!

然而,正因为变量显示在 URL 中,因此可以在收藏夹中收藏该页面。在某些情况下,这是很有用的。

**注释:**HTTP GET 方法不适合大型的变量值。它的值是不能超过 2000 个字符的。

PHP $_POST 变量


在 PHP 中,预定义的 $_POST 变量用于收集来自 method=“post” 的表单中的值。


$_POST 变量

预定义的 $_POST 变量用于收集来自 method=“post” 的表单中的值。

从带有 POST 方法的表单发送的信息,对任何人都是不可见的(不会显示在浏览器的地址栏),并且对发送信息的量也没有限制。

**注释:**然而,默认情况下,POST 方法的发送信息的量最大值为 8 MB(可通过设置 php.ini 文件中的 post_max_size 进行更改)。

实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<html>
<head>
<meta charset="utf-8">
<title>菜鸟教程(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>
//www.hspcode.com/tp/welcome.php

从带有 POST 方法的表单发送的信息,对任何人都是不可见的,并且对发送信息的量也没有限制。

然而,由于变量不显示在 URL 中,所以无法把页面加入书签。

数据库连接

PHP通常与MySQL数据库一起使用。以下是一个简单的数据库连接示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "myDB";

// 创建连接
$c = new mysqli($servername, $username, $password, $dbname);

// 检测连接
if ($c->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
echo "Connected successfully";
?>

mysqli 是 PHP 中用于与 MySQL 数据库交互的一个扩展库。它是 “MySQL Improved” 的缩写,设计来替代旧的 mysql 扩展,提供了更好的性能和更多的功能,包括对面向对象编程的支持、预处理语句、多语句执行和存储过程等。

使用 mysqli 扩展与 MySQL 数据库交互的基本步骤通常包括:

  1. 创建数据库连接:通过 new mysqli($servername, $username, $password, $dbname) 创建一个连接对象,其中 $servername 是数据库服务器地址,$username$password 分别是数据库的用户名和密码,$dbname 是要连接的数据库名。
  2. 检查连接:使用 if ($connection->connect_error) 来检查连接是否成功。如果不成功,可以通过 $connection->connect_error 获取错误信息。
  3. 执行查询:可以使用 $connection->query($sql) 方法执行SQL查询,其中 $sql 是包含SQL命令的字符串。
  4. 处理结果:根据执行的查询类型(如 SELECT 查询),可能需要获取结果集并遍历或操作这些结果。
  5. 关闭连接:在完成所有数据库操作后,使用 $connection->close(); 关闭数据库连接,释放资源。

die() 函数是 PHP 中的一个内置函数,当调用它时,会立即停止(终止)当前脚本的执行。此函数常用于在发生错误或遇到无法继续执行程序的情况时,输出一条消息并退出脚本。它可选地接受一个参数,该参数可以是字符串、数字或其他类型,会被转换为字符串形式并输出到浏览器或控制台。

例如,在数据库连接失败时使用 die() 函数的场景

1
2
3
if ($c->connect_error) {
die("Connection failed: " . $c->connect_error);
}

在这段代码中,如果数据库连接失败,$c->connect_error 将包含错误描述。die() 函数被用来输出这条错误信息,并且之后的任何代码都不会被执行,因为脚本已经终止了。

需要注意的是,虽然 die() 函数在处理错误时很方便,但在更复杂的错误处理逻辑中,可能更倾向于使用异常处理机制(try-catch 语句块),以实现更精细的控制流管理。不过,在简单脚本或快速原型开发中,die() 或其同义词 exit() 仍然非常常用。

$c->connect_error 是在使用 PHP 的 mysqli 扩展连接数据库时,检查连接是否成功的一种方式。这里 $c 是创建的 mysqli 对象,代表了到MySQL服务器的数据库连接。当尝试建立连接时,如果发生任何错误,$c->connect_error 属性会被自动填充错误信息。

具体来说:

  • $c:这是你给 mysqli 类实例化后的对象的引用。通过这个对象,你可以调用各种方法来执行SQL查询、获取结果等操作。
  • ->:这是 PHP 中用于访问对象属性或方法的箭头符号。
  • connect_error:这是一个只读属性,表示上一次连接尝试时发生的错误。如果连接成功,这个属性的值是 null;如果连接失败,它将包含一个描述错误的字符串。

因此,$c->connect_error 的检查通常紧跟着 new mysqli(...) 语句之后,用来判断数据库连接是否建立成功。如果该属性不为空,说明连接过程中遇到了问题,这时可以根据错误信息采取相应的错误处理措施,比如使用 die() 函数输出错误信息并终止脚本执行。