初识PHP
虽然是做前端的,可是平时看书、做项目都会与后端PHP相关,但却不是很了解,并经常听PHP大神说:PHP是世界上最好的语言!因此,通过这篇博文学习、总结PHP,来认识认识这个“世界上最好的语言”。
第一部分:PHP简介
1.PHP的全称是Hypertext Preprocessor,即超文本预处理器,它是一种通用开源脚本语言。们知道JavaScript也是一种运行在浏览器上脚本语言来控制页面内容,而PHP是运行在服务器端的脚本语言读取数据库把内容显示在页面上。另外,PHP是开源的,免费使用的,因此有着无数的民间高手,贡献这很多使用的类库,使其有强大的生命力,相对于微软公司的ASP.NET这种收费的情况而言还是有些些优势的,并且PHP可以运行在各种平台上,但是ASP.NET只能运行在windows平台下。当然ASP.NET也有很多优秀的地方是PHP不可及的。
2.那么什么是PHP文件呢?我们有时可以看到以.php作为后缀名的文件,实际上这就是PHP文件,该文件可以包含文本、HTML、JavaScript代码和PHP代码,且PHP代码在服务器上执行,结果以纯HTML形式返回给浏览器。
3.PHP能做什么呢?
- 可以生成动态的页面内容(这个在前端通过ajax实现)
- 可以创建、打开、读取、写入、关闭服务器上的文件
- 可以收集表单数据(我们在前端写的表单 其中包括name value,这些都是和PHP相关的)
- 可以添加、删除、修改我们的数据库中的数据
当然,除此之外,PHP还有很多强大的功能。通过PHP,我们不再限于输出HTML,还可以输出图像、PDF文件、flash电影等。
4.为什么使用PHP? 前面介绍过,它可以在不同的平台上运行(windows、linux、unix、MAC os x等),并且它与目前几乎所有的正在被使用的服务器兼容(Apache、IIS等)。
第二部分:PHP语法
一. 基本的PHP语法如下:
PHP脚本可以放在文档中的任何位置,PHP脚本以<?php开始,以?>结束,如下代码:
<?php //PHP代码 ?>
php文件的默认文件扩展名为.php,这个文件中通常包含了HTML标签和一些PHP脚本代码,比如下面的PHP文件实例:
<!DOCTYPE html> <html> <body> <h1> 我的第一个PHP文件</h1> <?php echo "Hello World!"; ?> </body> </html>
运行结果如下:
对于上面的PHP文件,有以下几点需要注意:
- 我在文件中没有加入<meta>标签,实际上也是可以加的,只是我省略了而已
- 我们注意到PHP中的每个代码行都必须以分号结束,分号是一种分隔符,用于把指令集区分开来。
- echo指令用于输出,另外还有print指令。注意发音:
另外,我在PHP代码里使用了注释。//为单行注释,和JavaScript是相同的。多行注释可以使用/* */。
二.PHP中的变量
1.基本概念
和其他所有语言都一样,变量即存储信息的“容器”。与代数类似,可以给PHP变量赋予某个值(比如 x=10)或者表达式(z=x+y)。 毫无疑问的,变量可以是很短的名称(如x和y这种只有一个字母)或者是更具描述性的名称(如age、carname、totalvolume)。规则如下;
- 变量必须以$符号开始,后面跟着变量的名称。
- 变量名必须以字母或者下划线字符开始(注意:在JavaScript中变量必须以字母、下划线或$开始,这里类似的,知识必须用$说明是一个变量)
- 变量名只能包含字母、数字以及下划线(A-z、0-9和_),这个和JavaScript是相同的。
- 变量名中不能包含空格。
- 变量名是区分大小写的。(注意:PHP语句和PHP变量都是区分大小写的)
2.创建(声明PHP变量)
实际上,PHP没有变量声明的命令。变量在我们第一次赋值给它的时候被创建。如下所示:
<?php $txt="hello world"; $x=5; $y=10; $z=$x+$y; ?>
通过上面的php代码,实际上我们就创建了$txt变量、$x变量、$y变量、$z变量。
通过上面的例子我们可以看出:
- 把一个文本值(即字符串)赋值给一个变量时,必须在文本值两侧加上双引号。
- 可以看出,我们声明变量时没有指定该变量的数据类型,故PHP和JavaScript一样都是弱类型语言。而强类型语言如Java、C++是需要在使用变量前先声明(定义)变量的类型(如int double float string等等)和名称的。于是,PHP会根据变量的值自动把变量转化为正确的数据类型。
3.变量作用域
和其他所有语言一样,变量的作用域是脚本中变量可以被引用/使用的部分。
PHP中有四种不同的变量作用域。分别是 local 、global、static、parameter。
(1)首先讨论全局变量和局部变量。
全局变量与全局作用域:在所有函数外部定义的变量,拥有全局作用域。除了函数外,全局变量可以被脚本中的任何部分访问,若要在一个函数中访问全局变量,需要使用global关键字。(关键:这里的全局变量竟然不能被函数访问!!!!)
局部变量:在PHP函数内部声明的变量时局部变量,仅能在函数内部访问(这一点与JavaScript相同)。
举例如下:
<?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()函数时,只输出了y,因为y是函数内的局部变量,而没有输出x!(即前面所提到的,函数不能直接访问全局变量)
- 在外部直接输出x和y时,只输出了x,因为x时全局变量,而没有输出y,因为y时局部变量。
- 我们可以看到代码 echo "变量 x 为: $x"; 在PHP中可以将变量放进字符串中输出(而在JavaScript中必须将变量和字符串使用+来拼接)。
(2).global关键字
刚刚我们认识了PHP变量中这个奇怪的特点:即函数不能访问全局变量!
但是我们可以通过global关键字使得函数可以访问全局变量。如下例所示:
<?php $x=5; $y=10; function myTest() { global $x,$y; $y=$x+$y; } myTest(); echo $y; ?>
之前说函数不能访问全局变量,但是只要我们把想要访问的全局变量在函数内加上global关键字就可以正常访问了。
实际上,PHP将所有的全局变量存储在一个名为$GLOBALS[index]的数组中。index保存变量的名称。这个数组可以在函数内部访问,也可以用来跟新全局变量。上面代码改写为:
<?php $x=5; $y=10; function myTest() { $GLOBALS[\'y\']=$GLOBALS[\'x\']+$GLOBALS[\'y\']; } myTest(); echo $y; ?>
(3)static作用域
我们知道,当一个函数被调用之后,其内部的局部变量就会被销毁以释放内存,如果我们不想其被销毁,可以在声明变量时使用static关键字。如下:
<?php function myTesy() { static $x=0; echo $x; $x++; } myTest(); myTest(); myTest(); ?>
如果我们不使用static关键字,显然函数被调用之后,所有局部变量被销毁,结果就只会输出三个0。然而这里使用了static关键字,于是每次调用函数时,该变量就会保留函数前一次被调用的值。于是会输出012三个数字。注意:static $x=0;的作用仅仅是说明x是一个static变量并赋初值,而不会每次在调用函数时都把x变成0.
4.echo和print语句
作为前端工程师,实际上我们也总是会看到echo语句,并且还会有print语句。两者的具体作用是什么?又有什么区别呢?
- echo可以输出一个或多个字符串或变量(变量可以直接放在字符串中,如果单独输出字符变量,不需要引号),且echo输出的速度比print快。echo是一个语言结构,使用的时候可以不加括号,也可以加上括号:echo 后echo()。比如:
<?php
$test="PHP";
echo $test; echo("<h2> PHP is fun!</h2>"); echo "Hello world !<br>"; echo "I am interested in $test<br>"; echo "My","name","is","zzw"; ?>前面三句为使用echo输出一个字符串,而最后一句为使用echo输出多个字符串0。另外注意到使用echo输出的字符串中可以有HTML标签。
- print同样也是一个语言结构,可以试用括号,也可以不使用括号:print或print()。但是print只允许输出一个字符串或者一个变量,其输出速度较echo慢,且echo没有返回值,而print的返回值为1。举例如下:
<?php $test ="php"; print $test; print "i love $test"; ?>
5.PHP中的数据类型
PHP的数据类型有Sting、Integer、Float、Boolean、Array、Object、NULL,下面逐一介绍。
- string(字符串)--字符串即为一串字符的序列,如“Hello world”。我们可以将字符串放在单引号或者是双引号中(这一点和JavaScript是一样的)。
- Integer(整型)--即没有小数的数字,可以是整数也可以是负数。注意:在PHP中var_dump()函数返回变量的数据类型和值,PHP中竟然用到了和JavaScript中的var,尽管作用不一样...举例如下:
<?php $x=628; var_dump($x); echo("<br>"); $x=-345; var_dump($x); echo("<br>"); ?>
输出结果为:
int(628) int(-345)
- Float(浮点)--浮点数即带有小数部分的数字,或者是指数形式。如:
<?php $x=6.28; var_dump($x); ?>
会输出:float(6.28)。
- Boolean(布尔型)--布尔型可以是true或者是false。如$x=true;或者$y=false;布尔型通常用于条件判断。
- Array(数组)--数组可以在一个变量中存储多个值。例子如下:
<?php $cars=array("Volvo","BMW","Toyota"); var_dump($cars); ?>
我们注意到:这是这个数组变量需要使用array()才能生效。结果会返回:array(3){[0]=>string(5) "Volvo" [1]=>string(3) "BMW" [2]=>string(6) "Toyota"}。结果中array(3)表示数组的长度为3, 【0】【1】【2】表示第一项、第二项、第三项。 string()表示每一项的长度。
- Object(对象)--在PHP中,对象必须声明,即首先使用class关键字声明类对象。类可以是包含属性和方法的结构。即现在类中定义数据类型,之后会在实例化的类中使用数据类型。
举例如下:
<?php class Car { var $color; function Car($color="green"){ $this->color=$color; } function what_color(){ return $this->color; } } ?>
其中和js类似,关键字this就是指向当前对象实例的指针,不指向任何其他对象或类。
NULL(空值)--表示 没有值,我们也可以通过设置变量值为NULL来清空变量数据。
6.PHP中的常量
常量一经定义,在脚本的其他任何地方都不能被改变,且常量可以在整个脚本中使用(全局变量)。
其定义举例如下:
define("GREET","hello world",false);
其中第一个参数是必选的,规定了常量名称。第二个参数时必选的,规定了常量的值。第三个参数时可选的,若为true,则常量的大小写不敏感,false为大小写敏感。若省略不屑,默认是敏感的。如:
<?php define("GREET", "hello world",false); echo GREETING; // 输出 "hello world" echo \'<br>\'; echo greet; // 输出 "greet",因为前面设置了大小写敏感。 ?>
7.PHP中的字符串变量
(1)在PHP中,针对于字符串定义的运算符只有一个--并置运算符(.)。作用是把两个字符串的值连起来。如下所示:
<?php $text1="zzw"; $text2="you are handsome"; $text=$text1." ".$text2; echo $text; ?>
上述代码,通过并置运算符.将text1和有一个空格的字符串""和text2链接起来了。输出结果为: "zzw you are handsome"。
(2)strlen()函数接受一个字符串作为参数,可以返回一个字符串的长度。如echo strlen("zzw");则输出结果为3。
(3)strpos()函数接收两个参数,第一个是一个字符串,第二个是希望查找在第一个中的位置的字符串。如:echo strpos("zzw","w");此代码返回的是2。因为字符串中第一个字符的位置是0而不是1。
8.PHP中的运算符
- 算数运算符:+(加) —(减) *(乘) /(除) %(模) -(取反,例:-2) .(并置)
- 赋值运算符:=(将右边的值赋给左边) +=(与Js同) —= *= /= %= .=
- 递增/递减运算符: ++ —— (这个和JavaScript以及C++中的用法相同)。
- 比较运算符:==(等于) ===(恒等于) !=(不等于) <>(不等于,这个符号之前没见多..) !== (不等于) >(大于) <(小于) >=(大于等于) <=(小于等于)
- 三元运算符: (expr1)?(expr2):(expr3) 即对expr1求值为true是,值为expr2,否则值为expr3。
- 数组运算符:+(集合) ==(相等) !=(不相等) <>(不相等) !==(不恒等)
- 逻辑运算符
- and (与) 例如 (6<10 and 12>10)则返回true
- or (或) 例如(6==5 or 6==6) 则返回true
- xor(有且仅有一个为true) 如(6==6 xor 3==3 )则返回false
- &&(与)和and用法同
- ||(或) 至少有一个为true则返回true 例如(3==2 || 5==5)则返回true
- !(非) 如!(3==5)返回true
9.if else语句和swith语句和JavaScript完全相同,这里不再累赘。
10.PHP中的数组。
之前其实我们已经使用了,这里再接受一下。即:array()。再PHP中主要有三种类型的数组:
- 数值数组--即带有数字ID的数组
- 关联数组--带有指定的键的数组
- 多维数组--包含一个或多个数组的数组
首先谈谈数值数组,一般有有两种方法来创建数值数组
法一: 自动分配ID键(注意:ID键总是从0开始)
$cars=array("Volvo","BMW","Toyota");
法二:人工分配ID键,如下所示:
$cars[0]="Volvo"; $cars[1]="BMW"; $cars[2]="Toyota";
另外,PHP提供了一个统计数组长度的函数,count();以数组错位参数即可,如:统计cars数组的长度:
echo count($cars);
输出结果为3。
其次说明关联数组。同样有两种创建关联数组的方法。(注意:关联数组即ID键名为字符串而不是数字了)
法一:
$age=array("zzw"=>"20","htt"=>"18");
法二:
$age["zzw"]="20"; $age["htt"]="18";
我们可以看出,法二可能更符合我们使用的习惯。
关联数组不谈了,作为前端工程师,对此不细究~
11.PHP数组的排序
- sort()--对数值数组进行升序排序
- rsort()--对数值数组进行降序排序 (注意:r在英语中是“反”的意思)
- asort()--根据关联数组的值,对数组进行升序排列
- arsort()--根据关联数组的值,对数组进行降序排列
- ksort()--根据关联数组的键,对数组进行升序排列(注意:key为键的意思)
- krsort()--根据关联数组的键,对数组进行降序排列
12.超级全局变量
在PHP中,我们之前介绍过说一个函数不能直接访问全局变量,必须在函数内部使用global来声明这个变量,才能被函数调用,实际上,还有其他一些诸如此类的变量,为区分全局变量,我们称之为超级全局变量。如$GLOBALS $_SERVER $_REQUEST $_POST $_GET $_FILES $_ENV $_COOKIE $_SESSION。
之前介绍过了global,因此下面着重介绍$_SERVER $_REQUEST $_POST $_GET
1.$_SERVER
从名字可以知道server为服务器,且$_SERVER是一个包含了诸如头信息(header)、路径(path)以及脚本位置(script locationis)等信息的关联数组。即 $_SERVER是一个由Web服务器创建的包含头信息、路径等等的关联数组
下面列出这个关联数组中的重要元素:
- $_SERVER[\'PHP_SELF\'] 即当前执行脚本的文件名。如http://example.com/test.php/foo.bar 的脚本中可得到/test.php/foo.bar
- $_SERVER[\'SERVER_ADDR\'] 即得到运行PHP脚本所在的服务器的IP地址。
- $_SERVER[\'SERVER_NAME\'] 即得到运行PHP脚本所在服务其的主机名
- $_SERVER[\'SERVER_SOFTWARE\'] 即的到服务其标识字符串,如Apache/2.2.24
- $_SERVER["SERVER_PROTOCOL"] 即得到通信协议的名称版本,如HTTP/1.0
- $_SERVER[\'REQUEST_METHOD\'] 即得到访问页面使用的请求方法,如"GET"等
- $_SERVER[\'HTTP_REFERER\'] 即引导用户代理到当前页的前一页的地址
- $_SERVER[\'REMOTE_ADDR\'] 即得到浏览当前页面的用户IP地址(remote即远程)
- $_SERVER[\'REMOTE_PORT\'] 即得到用户机器上链接到服务其所使用的端口号
- $_SERVER[\'SCRIPT_URI\'] 即URI来指定要访问的页面。例如"/index.html"
更多点击这里
2.$_REQUEST
这个超级全局变量 用于通过接收如input的name值来接收HTML表单提交的数据(即value)。举例如下:
如在一个HTML中的input(比如将其所在表单发送到example.php中)如下:
<input type="text" name="sex" value="man">
这里我们默认value是man,实际上value应当由用户输入,这里我做了简化,而example.php中的代码如下:
<?php $user_sex=$_REQUEST["sex"]; echo $user_sex; ?>
即在php代码中,我们先使用$_REQUEST这个超级全局变量获得name=sex的值(即man)存到$user_sex这个变量中,然后输出。
3.$_POST
和$_REQUEST十分类似,只是$_POST的使用情况是在表单声明了method="post"的情况下,同过$POST来用$_REQUEST相同的方法来收集数据,这里不再举例。
4.$_GET
同样的,此方法类似上面两种方法,需要在form标签中指定该属性method="get",当然,根据get的特点,get也可以收集URL中发送的数据。对于form,方法和上面的request类似,不再举例。对于url的数据,举例如下,假定我们有一个包含参数的超链接的HTML页面如下:
<html> <body> <a href="test.php?subject=PHP&web=baidu.com">$_GET测试</a> </body> </html>
于是,当我们点击了之后,就会向php文件发送这个参数,在PHP文件中我们可以这样接收:
<?php echo "project".$_GET("subject")."at".$_GET("web"); ?>
于是,我们就可以得到输入的文件:"projectPHPatbaidu.com"
13.while循环 do while循环 for循环的语法规则和JavaScript是相同的,这里不再累赘。
这里主要介绍一下foreach循环--该循环主要用于遍历数组
语法(英文为syntax):
foreach($array as $value) { //要执行的代码; }
注意:中间的是as 其中$array是一个数组,没进行一次循环,当前数组元素的值就会被赋值给$value变量(指针会注意的移动)。即第一次循环$value的值是数组中的第一个值,第二次循环$value的值是数组的第二个值,直到将这个数组被循环结束。
14.PHP中的函数
PHP是世界上最好的语言,恐怕与它的函数不无关系吧!因为PHP的真正威力源自于它的函数,在PHP中,提供了超过1000个内建的函数。
(1)创建PHP函数--语法如下:
function functionName() { //要执行的代码; }
注意:函数的名称应该提示出它的功能,且函数名称应该以字母或下划线开头(不能以数字开头)。
PHP函数的执行和JavaScript及C++都是类似的--通过调用来执行。
(2)添加参数
和JS与C++一样,直接在函数名称后面的括号里即可添加参数,参数即为一个局部变量。
(3)返回值
类似的,如需让函数返回一个值,使用return语句即可实现。
举例如下:
<?php function addFun($x,$y) { $total=$x+$y; return $total; } $TOTAL=addFun(90,10); echo "90+10的和为:".$TOTAL; ?>
15.PHP中的魔术变量
PHP向它运行的任何脚本提供了大量的预定义常量。只是很多常量是由不同的扩展库定义的,只有在加载了这些扩展库是才会出现。下面会介绍8个魔术变量--它们的值会随着它们在代码中的位置改变而改变。
(1)_LINE_
该变量的值依赖于它在脚本中所处的行来决定。且这些特殊而常量不区分大小写.如:
<?php echo \'这是第"\'._LINE_\'"行\'; ?>
上述实例输出这是第”2“行
(2)_FILE_
该变量会输出文件的完整路径(新版本PHP返回绝对路径)和文件名。如果用在被包含文件中,则返回被包含的文件名。如:
<?php echo \'该文件位于 " \' . __FILE__ . \' " \'; ?>
输出:"C:\wamp\www\example\index.php"
(3) _DIR_
该变量会返回文件所在的目录。如果用在被包含文件中,则返回被包括的文件所在目录。
(4)_FUNCTION_
该变量会返回函数名称(函数被定义时的名字)。如:
<?php function addFunc() ?>
(5)_CLASS_
返回的是该类被定义时的名字(区分大小写)。
(6)_TRAIT_
trait名包括其被声明的作用区域(例如Foo\Bar).
(7)_METHOD_
类的方法名,返回该方法被定义时的名字(区分大小写)。
<?php function test() { echo \'函数名为:\' . __METHOD__ ; } test(); ?>
结果输出:函数名为:test。
(8)_NAMESPACE_
当前命名空间的名称。(注意:命名空间这个概念在JavaScript中是没有的。
16.PHP中的命名空间
注意:命名空间在JavaScript中是没有这个概念的,在C++中有这个概念。实际上,命名空间有着相当重要的意义。它可以解决以下两类问题:
- 用户编写的代码与PHP内部的类、函数、常量或第三方类、函数、常量之间的冲突。
- 为很长的标识符名称创建一个别名,提高源代码的可读性。
(1)定义命名空间
我们可以通过关键字namespace来声明。如果一个文件中包含命名空间,它必须在其他所有的代码之前声明命名空间。如:
<?php namespace mySpace; //其他代码必须放在声明命名空间的语句之下。 ?>
注意:也可以定义多个不同的命名空间,如:
<?php namespace mySpace1; //mySpace1 这个命名空间下的代码 namespace mySpace2; //mySpace2 这个命名空间下的代码 namespace mySpace3; //mySpace3 这个命名空间下的代码 ?>
注意:在命名空间之前唯一合法的代码是用于定义源文件代码编码方式的declare语句。如declare(encoding="UTF-8");
(2)定义子命名空间
PHP命名空间也允许指定层次化的命名空间的名称。如namespace mySpace\Sub\
Level
(3)命名空间的使用
这一部分内容很多,可以看这里...
17.PHP面向对象
(1) 在面向对象的程序设计(Object-oriented programming,缩写为OOP)中,对象是一个由信息及对信息进行处理的描述所组成的整体,是对现实世界的抽象。
在现实世界中,我们所面对的事情都是对象,如电脑,杯子,灯泡等。
对象的三个主要的特性:
- 对象的形态:如颜色、大写、外形等等。
- 对象的行为:如跑、跳、开门等等。
- 对象的表示:相当于身份证。具体区分在相同的行为与状态下有什么不同。
(2)面向对象的内容
实际上,PHP和C++关于类这方面是很相似的。主要内容有:
- 类-定义了一件事物的抽象特点
- 对象-是类的实例
- 成员变量-定义在类内部的变量,该变量的值对外是不可见的,类被初始化成对象后,该变量为对象的属性。
- 成员函数-定义在类内部的可以访问对象的数据的函数
- 继承-是子类自动共享父类数据结构的方法和机制。在js中是通过原型链继承的
- 父类-可以被其他类继承,又称为基类或者超类。
- 子类-一个类继承其他类称为子类,也可以称为派生类。
- 多态-如不同的对象,接受到同一个消息可以产生不同的结果,这种现象称为多态性。
- 重载-在js中没有重载,而php中有。重载即为函数或者方法有同样的名称,但是参数列表不相同的情况。
- 抽象性-抽象性即为将具有一致的数据结构和行为的对象抽象成类。一个类就是这样一个抽象。
- 封装-即将现实世界中存在的某个客体的属性和行为绑定在一起,并放置在一个逻辑单元内。
- 构造函数-js中同样有构造函数,用来在创建对象时初始化对象。
- 析构函数-C++中也有,js没有,它与构造函数相反,当对象结束其声明周期时(例如对对象所在的函数已经调用完毕),系统自动执行析构函数。它往往用来做“清理善后”的工作。比如在建立对象时用new开辟了一篇内存空间,应该在退出前在析构函数中使用delete释放。
(3)创建对象
如$merceds = new Car(); $bmw = new Car(),这样就通过Car类创建了三个对象。
(4)PHP中类的定义
<?php class phpClass { var $var1; var $var2 = "constant string"; function myfunc ($arg1, $arg2) { [..] } [..] } ?>
这里需要注意:
- 类使用class关键词,并在其后加上类的名称
- 类名之后使用大括号来定义类的变量和方法
- 类的变量使用var来声明,变量也可以初始化值。与js同,用var,都是弱类型语言。
在PHP中,也有this,假设我们已经定义了一个类,并且基于类实例化了对象,那么我们就可以通过对象调用成员方法了。如下所示:
$baidu->setTitle("百度一下"); $baidu->setUrl("baidu.com"); $baidu->getTitleAndUrl();
注意到,在php中调用方法时使用的时->而没有使用js中的.是因为php中.是并置运算符用于将字符串连接的,所以使用->来调用方法。
(5)继承:通过extends关键字来继承一个类,如:
class Child extends Parent{ }
(6)方法重写:如果从父类继承的方法不能满足子类的要求,那么可以对其进行改写,这个过程实际上叫做方法的覆盖(override),也成为方法的重写。
(7)访问控制:这个和C++相似,即在属性或者方法的前面添加关键字public(公有)、 protected(受保护)、 private(私有)来实现。
- 公有的类成员可以在任何地方被访问
- 受保护的类成员可以被其自身及其子类和父类访问
- 私有的成员只能被其定义所在的类访问。
(8)接口:通过接口(interface),可以指定某个类必须实现哪些方法,但不需要定义这些方法的具体内容。接口是通过interface关键字来定义的,就像是定义一个标准的类一样,但是其中定义的所有方法都是空的。并且接口中定义的方法都必须是共有的,这是接口的特性。要实现一个接口,必须使用implements操作符。类中必须实现接口中定义的所有方法,否则会报一个致命错误。类可以实现多个接口,用逗号来分隔多个接口的名称。举例如下:
<?php // 声明一个"iTemplate“接口 interface iTemplate { public function setVariable($name,$var); public function getHtml($template); } //实现接口 class Template implements iTemplate { private vars = array(); public function setVariable ($name,$var) { $this->vars[$name]=$var; } public function getHtml($template) { foreach($this->vars as $name->$value){ $template = str_replace(\'{\' . $name . \'}\', $value, $template); } return $template; } } ?>
(9)常量,可以把类中始终不变的量定义为常量,不需要使用$符号。
常量的值必须是一个定值。如:const constant="8";
(10)抽象类 、调用父类构造函数。。。
第三部分:表单
实际上,对于PHP,我最希望的就是学习表单这一部分了,这一部分,对于前端工程师而言,我相信是必须掌握的,这样才能和后端顺利的交流,协调工作。
一、表单和用户输入
1. 对于一个表单(html),当被发送时,PHP能把来自HTML页面的表单元素自动变成可供PHP脚本使用。
如下面的html代码:
<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>
当用户填完上面的表单并点击提交按钮之后,表单的数据就会被送往名为welcome.php文件,welcome.php文件通过下面的语句就可以对该表单进行相应的操作:
欢迎<?php echo $_POST("fname"); ?>!<br> 你的年龄是<?php echo $_POST["age"];?>岁
二.表单验证
客户端?or 服务器?
实际上表单验证应该通过客户端脚本(js)进行验证,因为浏览器验证速度更快,并且可以减轻服务器额负载。
但是当验证用户输入需要插入数据库,这是就应该考虑使用服务器验证。在服务器验证的一种好的方式是:把表单传过去而不是传一个页面,这样用户就可以在同一张表单页面上得到错误信息,用户也就更容易发现错误了。
这里我们当然只介绍服务器验证即PHP表单验证---because为了防止黑客,并且为了防止垃圾信息。
比如下面的这样一个PHP表单验证,名字必须只能包含字母和空格。E-mail必须包含@ 和. 。网址必须是一个有效的URL,性别必须选择一个,这是怎么做到的呢?
先让我们看看html代码:
“名字”: <input type="text" name="name"> E-mail: <input type="text" name="email"> 网址: <input type="text" name="website"> 备注: <textarea name="comment" rows="5" cols="40"></textarea> 性别: <input type="radio" name="gender" value="female">女 <input type="radio" name="gender" value="male">男
另外还必须有一个HTML表单代码如下:
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
其中,我们使用了method="post";方法来提交数据。刚刚介绍过 $_SERVER是一个超级全局变量,会返回正在执行脚本的文件名。因此$_SERVER["PHP_SELF"]会发送表单数据到当前页面,而不是跳转到不同的页面。而htmlspecialchars() 函数把一些预定义的字符转换为 HTML 实体。预定义的字符是:&、”、‘、<、>。而通过htmlspecialchars()函数可以避免被黑客攻击。 因为任何js代码可以添加在<script>标签中!黑客可以通过这一点来重定向页面到另一台服务器。
当用户提交表单时,我们可以做:
- 使用PHP trim()函数去除用户输入数据中不必要的字符
- 使用PHP stripslashed()函数去除用户输入数据中的反斜杠\。
知道了这些后,接下来我们可以将这些过滤的函数写在一个我们自己定义的函数中,这样可以大大提高代码的复用性。将函数命名为test_input().
现在,我们可以通过test_input()函数来检测$_POST中的所有变量。脚本代码如下所示:
<?php //定义变量并且默认设置位空值 $name=$email=$gender=$comment=$website="";//这种是连续赋值的方式 if($_SERVER["REQUEST_METHOD"]=="POST") //关键REQUEST_METHOD包括POST 和 GET { $name=test_input($_POST["name"]);
// $_POST("name")得到的是name属性值为name的表单的value,以下同理 $email=test_input($_POST["email"]); $website=test_input($_POST["website"]); $gender=test_input($_POST["gender"]); } function test_input($data) { $data=trim($data);//把多余的空格去掉 $data=stripslashed($data);//把其中不应该出现的反斜杠去掉 $data=hmtlspecialchars($data);//实体化html代码 return $data;//返回这个新的被修改过的数据 } ?>
三、表单中的必需字段
如何使得一个字段为必需字段呢?我们可以试用php中的empty()函数,如果为空,则显示对应的错误信息,如果不为空,则将数据传递给test_input()函数。
下面是一段用于处理是否为空的PHP代码:
<?php // 定义变量并默认设为空值 $nameErr = $emailErr = $genderErr = $websiteErr = ""; $name = $email = $gender = $comment = $website = ""; if ($_SERVER["REQUEST_METHOD"] == "POST") { if (empty($_POST["name"])) { //注意:empty函数可以验证是否为空值 $nameErr = "名字是必需的。"; } else { $name = test_input($_POST["name"]); //如果不是空值,则将$_POST["name"]传给test_input(),防止不能正常处理或遭受黑客攻击 } if (empty($_POST["email"])) { $emailErr = "邮箱是必需的。"; } else { $email = test_input($_POST["email"]); } if (empty($_POST["website"])) { $website = ""; } else { $website = test_input($_POST["website"]); } if (empty($_POST["comment"])) { $comment = ""; } else { $comment = test_input($_POST["comment"]); } if (empty($_POST["gender"])) { $genderErr = "性别是必需的。"; } else { $gender = test_input($_POST["gender"]); } } ?>
上面的代码中指出如果为空,则把一个字符串赋值给变量,那么怎么显示错误信息呢?
实际上,我们可以为每个字段添加一些脚本,各个脚本会在信息输入错误是显示对应的错误信息。如下所示:
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>"> 名字: <input type="text" name="name"> <span class="error">* <?php echo $nameErr;?></span> <br><br> E-mail: <input type="text" name="email"> <span class="error">* <?php echo $emailErr;?></span> <br><br> 网址: <input type="text" name="website"> <span class="error"><?php echo $websiteErr;?></span> <br><br> 备注: <textarea name="comment" rows="5" cols="40"></textarea> <br><br> 性别: <input type="radio" name="gender" value="female">女 <input type="radio" name="gender" value="male">男 <span class="error">* <?php echo $genderErr;?></span> <br><br> <input type="submit" name="submit" value="Submit"> </form>
四、php表单验证邮件和URL
以下代码可以通过简单的方式来检测name字段是否包含字母和空格,如果name字段值不合法,将输出错误信息:
$name = test_input($_POST["name"]); if (!preg_match("/^[a-zA-Z ]*$/",$name)) { $nameErr = "只允许字母和空格"; }
其中preg_match()函数将会进行正则表达式匹配,语法如下;
int preg_match(string $pattern ,string $subject)
即在subject字符串中搜索与pattern给出的正则表达式相匹配的内容。
同样的,下面的代码可以验证e-mail地址是否合法,如果不合法,将输出错误信息:
$email = test_input($_POST["email"]); if (!preg_match("/([\w\-]+\@[\w\-]+\.[\w\-]+)/",$email)) { $emailErr = "非法邮箱格式"; }
验证url等不再举例,因为这里涉及到正则表达式,这里我还不是很清楚,后面会详细学习正则表达式。
五、确保在表单中输入值
在用户点击提交按钮后,为确保字段值输入正确,我们在HTML的input元素中插入PHP脚本,
如下所示:
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>"> 名字: <input type="text" name="name" value="<?php echo $name;?>"> <span class="error">* <?php echo $nameErr;?></span> <br><br> E-mail: <input type="text" name="email" value="<?php echo $email;?>"> <span class="error">* <?php echo $emailErr;?></span> <br><br> 网址: <input type="text" name="website" value="<?php echo $website;?>"> <span class="error"><?php echo $websiteErr;?></span> <br><br> 备注: <textarea name="comment" rows="5" cols="40"><?php echo $comment;?></textarea> <br><br> 性别: <input type="radio" name="gender" <?php if (isset($gender) && $gender=="female") echo "checked";?> value="female">女 <input type="radio" name="gender" <?php if (isset($gender) && $gender=="male") echo "checked";?> value="male">男 <span class="error">* <?php echo $genderErr;?></span> <br><br> <input type="submit" name="submit" value="Submit"> </form>
六、$_GET变量
这个变量用于收集来自method="get"的表单中的值。注意:从带有get方法的表单发送的信息,对任何人都是可见的(会显示在浏览器的地址栏),并且对发送信息的量也有限制。如下面所示的html代码:
<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>
这个代码在我们写页面时是经常可以看到的。但是之前我一直不知道当用户点击了“submit”按钮之后的情况。实际上,点击之后,发送到服务其的URL如下所示:
http://www.runoob.com/welcome.php?fname=Runoob$amp;age=3
自此,"welcom.php"文件就可以通过$_GET变量来收集表单数据了(注意:表单域的名称会自动成为#_GET数组的键)
注意:
- 因为在使用method=“get”时,所有额变量名和值都会显示在URL中。所以在发送密码或者其他敏感信息时,不应该使用这个方法。
- 然而,也正因为变量显示在了URL中,所以可以在收藏夹中收藏该页面,因此,在某些情况下,还是很有用的。
- HTTP GET方法不适合大型的变量值,因为它的值是不能超过2000个字符的。
七.$_POST变量
显然,它是用来收集来自method="post"的表单中的值的。注意:从带有POST方法的表单发送的信息,对任何人都是不可见的(不会显示在浏览器的地址栏),因此无法把页面加入书签,并且对发送信息的量也没有限制。(实际上,默认情况下,POST方法的发送信息的量最大值为8MB)
下面是一个html代码,其中有method="post"的表单
<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>
八.$_REQUEST变量
这个变量包含了$_GET $_POST 和$_COOKIE的内容,所以它可以用来收集get方法和post方法发送的表单数据。
当用户点击 "提交" 按钮时,URL 类似如下所示:
http://www.runoob.com/welcome.php
现在welcom.php文件可以通过$_POST变量来收集表单数据了(请注意,表单域的名称会自动成为 $_POST 数组中的键)。