虽然是做前端的,可是平时看书、做项目都会与后端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开始,以?>结束,如下代码:
1
2
3
|
<?php //PHP代码 ?> |
php文件的默认文件扩展名为.php,这个文件中通常包含了HTML标签和一些PHP脚本代码,比如下面的PHP文件实例:
1
2
3
4
5
6
7
8
9
|
<!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没有变量声明的命令。变量在我们第一次赋值给它的时候被创建。如下所示:
1
2
3
4
5
6
|
<?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相同)。
举例如下:
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" ; ?> |
结果如下:
几点讨论:
- 调用myTest()函数时,只输出了y,因为y是函数内的局部变量,而没有输出x!(即前面所提到的,函数不能直接访问全局变量)
- 在外部直接输出x和y时,只输出了x,因为x时全局变量,而没有输出y,因为y时局部变量。
- 我们可以看到代码 echo "变量 x 为: $x"; 在PHP中可以将变量放进字符串中输出(而在JavaScript中必须将变量和字符串使用+来拼接)。
(2).global关键字
刚刚我们认识了PHP变量中这个奇怪的特点:即函数不能访问全局变量!
但是我们可以通过global关键字使得函数可以访问全局变量。如下例所示:
1
2
3
4
5
6
7
8
9
10
11
|
<?php $x =5; $y =10; function myTest() { global $x , $y ; $y = $x + $y ; } myTest(); echo $y ; ?> |
之前说函数不能访问全局变量,但是只要我们把想要访问的全局变量在函数内加上global关键字就可以正常访问了。
实际上,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 ; ?> |
(3)static作用域
我们知道,当一个函数被调用之后,其内部的局部变量就会被销毁以释放内存,如果我们不想其被销毁,可以在声明变量时使用static关键字。如下:
1
2
3
4
5
6
7
8
9
10
11
|
<?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()。比如:
123456
<?php<br>
$test
=
"PHP"
;<br>
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。举例如下:
12345
<?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,尽管作用不一样...举例如下:
12345678
<?php
$x
=628;
var_dump(
$x
);
echo
(
"<br>"
);
$x
=-345;
var_dump(
$x
);
echo
(
"<br>"
);
?>
输出结果为:
12int(628)
int(-345)
- Float(浮点)--浮点数即带有小数部分的数字,或者是指数形式。如:
1234
<?php
$x
=6.28;
var_dump(
$x
);
?>
会输出:float(6.28)。
- Boolean(布尔型)--布尔型可以是true或者是false。如$x=true;或者$y=false;布尔型通常用于条件判断。
- Array(数组)--数组可以在一个变量中存储多个值。例子如下:
1234
<?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关键字声明类对象。类可以是包含属性和方法的结构。即现在类中定义数据类型,之后会在实例化的类中使用数据类型。
举例如下:
1
2
3
4
5
6
7
8
9
10
11
12
|
<?php class Car { var $color ; function Car( $color = "green" ){ $this ->color= $color ; } function what_color(){ return $this ->color; } } ?> |
其中和js类似,关键字this就是指向当前对象实例的指针,不指向任何其他对象或类。
NULL(空值)--表示 没有值,我们也可以通过设置变量值为NULL来清空变量数据。
6.PHP中的常量
常量一经定义,在脚本的其他任何地方都不能被改变,且常量可以在整个脚本中使用(全局变量)。
其定义举例如下:
1 | define( "GREET" , "hello world" ,false); |
其中第一个参数是必选的,规定了常量名称。第二个参数时必选的,规定了常量的值。第三个参数时可选的,若为true,则常量的大小写不敏感,false为大小写敏感。若省略不屑,默认是敏感的。如:
1
2
3
4
5
6
|
<?php define( "GREET" , "hello world" ,false); echo GREETING; // 输出 "hello world" echo \'<br>\' ; echo greet; // 输出 "greet",因为前面设置了大小写敏感。 ?> |
7.PHP中的字符串变量
(1)在PHP中,针对于字符串定义的运算符只有一个--并置运算符(.)。作用是把两个字符串的值连起来。如下所示:
1
2
3
4
5
6
|
<?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开始)
1 | $cars = array ( "Volvo" , "BMW" , "Toyota" ); |
法二:人工分配ID键,如下所示:
1
2
3
|
$cars [0]= "Volvo" ; $cars [1]= "BMW" ; $cars [2]= "Toyota" ; |
另外,PHP提供了一个统计数组长度的函数,count();以数组错位参数即可,如:统计cars数组的长度:
1 | echo count ( $cars ); |
输出结果为3。
其次说明关联数组。同样有两种创建关联数组的方法。(注意:关联数组即ID键名为字符串而不是数字了)
法一:
1 | $age = array ( "zzw" => "20" , "htt" => "18" ); |
法二:
1
2
|
$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中)如下:
1 | < input type="text" name="sex" value="man"> |
这里我们默认value是man,实际上value应当由用户输入,这里我做了简化,而example.php中的代码如下:
1
2
3
4
|
<?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页面如下:
1
2
3
4
5
|
<html> <body> <a href= "test.php?subject=PHP&web=baidu.com" > $_GET 测试</a> </body> </html> |
于是,当我们点击了之后,就会向php文件发送这个参数,在PHP文件中我们可以这样接收:
1
2
3
|
<?php echo "project" . $_GET ( "subject" ). "at" . $_GET ( "web" ); ?> |
于是,我们就可以得到输入的文件:"projectPHPatbaidu.com"
13.while循环 do while循环 for循环的语法规则和JavaScript是相同的,这里不再累赘。
这里主要介绍一下foreach循环--该循环主要用于遍历数组
语法(英文为syntax):
1
2
3
4
|
foreach ( $array as $value ) { //要执行的代码; } |
注意:中间的是as 其中$array是一个数组,没进行一次循环,当前数组元素的值就会被赋值给$value变量(指针会注意的移动)。即第一次循环$value的值是数组中的第一个值,第二次循环$value的值是数组的第二个值,直到将这个数组被循环结束。
14.PHP中的函数
PHP是世界上最好的语言,恐怕与它的函数不无关系吧!因为PHP的真正威力源自于它的函数,在PHP中,提供了超过1000个内建的函数。
(1)创建PHP函数--语法如下:
1
2
3
4
|
function functionName() { //要执行的代码; } |
注意:函数的名称应该提示出它的功能,且函数名称应该以字母或下划线开头(不能以数字开头)。
PHP函数的执行和JavaScript及C++都是类似的--通过调用来执行。
(2)添加参数
和JS与C++一样,直接在函数名称后面的括号里即可添加参数,参数即为一个局部变量。
(3)返回值
类似的,如需让函数返回一个值,使用return语句即可实现。
举例如下:
1
2
3
4
5
6
7
8
9
|
<?php function addFun( $x , $y ) { $total = $x + $y ; return $total ; } $TOTAL =addFun(90,10); echo "90+10的和为:" . $TOTAL ; ?> |
15.PHP中的魔术变量
PHP向它运行的任何脚本提供了大量的预定义常量。只是很多常量是由不同的扩展库定义的,只有在加载了这些扩展库是才会出现。下面会介绍8个魔术变量--它们的值会随着它们在代码中的位置改变而改变。
(1)_LINE_
该变量的值依赖于它在脚本中所处的行来决定。且这些特殊而常量不区分大小写.如:
1
2
3
|
<?php echo \'这是第"\' ._LINE_ \'"行\' ; ?> |
上述实例输出这是第”2“行
(2)_FILE_
该变量会输出文件的完整路径(新版本PHP返回绝对路径)和文件名。如果用在被包含文件中,则返回被包含的文件名。如:
1
2
3
|
<?php echo \'该文件位于 " \' . __FILE__ . \' " \' ; ?> |
输出:"C:\wamp\www\example\index.php"
(3) _DIR_
该变量会返回文件所在的目录。如果用在被包含文件中,则返回被包括的文件所在目录。
(4)_FUNCTION_
该变量会返回函数名称(函数被定义时的名字)。如:
1
2
3
4
|
<?php function addFunc() ?> |
(5)_CLASS_
返回的是该类被定义时的名字(区分大小写)。
(6)_TRAIT_
trait名包括其被声明的作用区域(例如Foo\Bar).
(7)_METHOD_
类的方法名,返回该方法被定义时的名字(区分大小写)。
1
2
3
4
5
6
|
<?php function test() { echo \'函数名为:\' . __METHOD__ ; } test(); ?> |
结果输出:函数名为:test。
(8)_NAMESPACE_
当前命名空间的名称。(注意:命名空间这个概念在JavaScript中是没有的。
16.PHP中的命名空间
注意:命名空间在JavaScript中是没有这个概念的,在C++中有这个概念。实际上,命名空间有着相当重要的意义。它可以解决以下两类问题:
- 用户编写的代码与PHP内部的类、函数、常量或第三方类、函数、常量之间的冲突。
- 为很长的标识符名称创建一个别名,提高源代码的可读性。
(1)定义命名空间
我们可以通过关键字namespace来声明。如果一个文件中包含命名空间,它必须在其他所有的代码之前声明命名空间。如:
1
2
3
4
5
6
|
<?php namespace mySpace; //其他代码必须放在声明命名空间的语句之下。 ?> |
注意:也可以定义多个不同的命名空间,如:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
<?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中类的定义
1
2
3
4
5
6
7
8
9
10
11
|
<?php class phpClass { var $var1 ; var $var2 = "constant string" ; function myfunc ( $arg1 , $arg2 ) { [..] } [..] } ?> |
这里需要注意:
- 类使用class关键词,并在其后加上类的名称
- 类名之后使用大括号来定义类的变量和方法
- 类的变量使用var来声明,变量也可以初始化值。与js同,用var,都是弱类型语言。
在PHP中,也有this,假设我们已经定义了一个类,并且基于类实例化了对象,那么我们就可以通过对象调用成员方法了。如下所示:
1
2
3
|
$baidu ->setTitle( "百度一下" ); $baidu ->setUrl( "baidu.com" ); $baidu ->getTitleAndUrl(); |
注意到,在php中调用方法时使用的时->而没有使用js中的.是因为php中.是并置运算符用于将字符串连接的,所以使用->来调用方法。
(5)继承:通过extends关键字来继承一个类,如:
1
2
|
class Child extends Parent{ } |
(6)方法重写:如果从父类继承的方法不能满足子类的要求,那么可以对其进行改写,这个过程实际上叫做方法的覆盖(override),也成为方法的重写。
(7)访问控制:这个和C++相似,即在属性或者方法的前面添加关键字public(公有)、 protected(受保护)、 private(私有)来实现。
- 公有的类成员可以在任何地方被访问
- 受保护的类成员可以被其自身及其子类和父类访问
- 私有的成员只能被其定义所在的类访问。
(8)接口:通过接口(interface),可以指定某个类必须实现哪些方法,但不需要定义这些方法的具体内容。接口是通过interface关键字来定义的,就像是定义一个标准的类一样,但是其中定义的所有方法都是空的。并且接口中定义的方法都必须是共有的,这是接口的特性。要实现一个接口,必须使用implements操作符。类中必须实现接口中定义的所有方法,否则会报一个致命错误。类可以实现多个接口,用逗号来分隔多个接口的名称。举例如下:
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
|
<?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代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
<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文件通过下面的语句就可以对该表单进行相应的操作:
1
2
|
欢迎<?php echo $_POST ( "fname" ); ?>!<br> 你的年龄是<?php echo $_POST [ "age" ];?>岁 |
二.表单验证
客户端?or 服务器?
实际上表单验证应该通过客户端脚本(js)进行验证,因为浏览器验证速度更快,并且可以减轻服务器额负载。
但是当验证用户输入需要插入数据库,这是就应该考虑使用服务器验证。在服务器验证的一种好的方式是:把表单传过去而不是传一个页面,这样用户就可以在同一张表单页面上得到错误信息,用户也就更容易发现错误了。
这里我们当然只介绍服务器验证即PHP表单验证---because为了防止黑客,并且为了防止垃圾信息。
比如下面的这样一个PHP表单验证,名字必须只能包含字母和空格。E-mail必须包含@ 和. 。网址必须是一个有效的URL,性别必须选择一个,这是怎么做到的呢?
先让我们看看html代码:
1
2
3
4
5
6
7
|
“名字”: < 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表单代码如下:
1 | < 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中的所有变量。脚本代码如下所示:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
<? php //定义变量并且默认设置位空值 $name=$email=$gender=$comment=$website="";//这种是连续赋值的方式 if($_SERVER["REQUEST_METHOD"]=="POST") //关键REQUEST_METHOD包括POST 和 GET { $name=test_input($_POST["name"]); <br> // $_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代码:
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
|
<?
|
全部评论
请发表评论