PHP7是PHP编程语言的一个主要版本,号称是开发Web应用程序的一次革命,可开发和交付移动企业和云应用。此版本被认为是PHP在2004年发布PHP5后最重要的变化。另外,此文章转摘后盾人向军老师文档,基于这个文档基础上进行学习。
教程转自后盾人向老师
PHP为什么这么厉害?
占有率高
PHP(外文名:PHP: Hypertext Preprocessor,中文名:“超文本预处理器”)是一种通用开源脚本语言。利于学习,使用广泛,主要适用于Web开发领域。。
截至 2018 年,近 80% 的互联网网站基于 PHP 开发和运行,下图是w3techs提供的PHP在web开发市场占有率。
通过数据可以知道PHP语言是热度和使用度非常高,大部分商业网站都在使用PHP进行开发,显而易见PHP人才需要量巨大,学习和使用PHP语言是很有前途的。
基础知识
基础入门
PHP是什么?
PHP(PHP: Hypertext Preprocessor,超文本预处理器的缩写),是一种被广泛应用的开放源代码的、基于服务器端的用于产生动态网页的、可嵌入HTML中的脚本程序语言,尤其适合 WEB 开发。
当客户端向服务器的程序提出请求时,web服务器根据请求响应对应的页面,当页面中含有php脚本时,服务器会交给PHP解释器进行解释执行,将生成的html代码再回传给客户端,客户端的浏览器解释html代码,最终形成网页格式的页面。
执行方式
PHP 代码被包含在特殊的起始符和结束符中,使得网页的脚本可以进出“PHP 模式”。其它用 C 或 Perl 语言写的脚本,需要用大量的命令来编写程序以输出 HTML ,而用PHP 编写一个 HTML 脚本,只需嵌入了一些代码来完成操作(例如,在本例中输出了一些文本)。
和客户端的 JavaScript 不同的是,PHP 代码是运行在服务端的。如果在服务器上建立了如上例类似的代码,则在运行该脚本后,客户端就能接收到其结果,但他们无法得知其背后的代码是如何运作的。甚至可以将 web 服务器设置成让 PHP 来处理所有的 HTML 文件,这么一来,用户就无法得知服务端到底做了什么。
PHP运行环境安装
大家在初始学习PHP时使用集成化开发环境是最好的选择,下面是常用的集成开发环境
集成开发软件 | 可使用的操作系统 | 说明 |
---|---|---|
WAMP | Win | 推荐 |
XAMPP | Win/Mac | |
Mamp | Mac | 推荐 |
Lamp | Linux(CentOS/Fedora/Debian/Ubuntu) |
PHP的特点
- 是开放源代码的,服务器端的脚本语言。
- 独立于操作系统,可以运行在几乎所有系统中。
- 支持大部分的服务器,如Apache,IIS。
- 支持大量的数据库,主要是Access\MySQL\SQL Server这三种。
- 可以创建图象。
- … …
- 还有一些其他特色功能在后面的高级技术详细介绍。
- 我们知道的网站如迅雷、新浪微博等大型网站都在使用PHP程序。
C/S与B/S结构
C/S结构
C/S (Client/Server)结构,即大家熟知的客户机和服务器结构。它是软件系统体系结构,通过它可以充分利用两端硬件环境的优势,将任务合理分配到Client端和Server端来实现,降低了系统的通讯开销。目前大多数应用软件系统都是Client/Server形式的两层结构
B/S****结构
B/S(Browser/Server)结构即浏览器和服务器结构。它是随着Internet技术的兴起,对C/S结构的一种变化或者改进的结构。在这种结构下,用户工作界面是通过WWW浏览器来实现,极少部分事务逻辑在前端(Browser)实现,但是主要事务逻辑在服务器端(Server)实现。这样就大大简化了客户端电脑载荷,减轻了系统维护与升级的成本和工作量,降低了用户的总体成本。
集成开发环境
WAMP
Windows下的Apache+Mysql/MariaDB+Perl/PHP/Python,一组常用来搭建动态网站或者服务器的开源软件,本身都是各自独立的程序,但是因为常被放在一起使用,拥有了越来越高的兼容度,共同组成了一个强大的Web应用程序平台。
MAMP
苹果系统下MAMP PRO是专业级版本的经典本地服务器环境的os x软件。MAMP这几个首字母代表苹果的OSX系统上的Macintosh、Apache、MySQL和PHP,顾名思义,你应该知道MAMP的强大功能 啦!MAMP 内含 Apache 伺服器、PHP 安装套件以及MySQL安装套件。
PHP的标记风格
<?php … … ?>
这是PHP推荐使用的标记风格。服务器管理员不能禁用这种风格的标记。
方便的与HTML混排
<?php
if ($expression) {
?>
<strong>This is true.</strong>
<?php
} else {
?>
<strong>This is false.</strong>
<?php }?>
PHP 将直接输出结束标记和下一个开始标记中的任何非 PHP 代码。当需要输出大量的文本时,退出 PHP 解析模式将比使用echo( )或者print( )或者此类的函数打印所有文本要更加的有效。
分号
PHP用分号来分隔简单的语句。复合语句用大括号来标记代码块,如条件测试或循环,在大括号后面不要用分号。和其他语言不一样的是,在PHP中右括号(?>)前的分号不是必选的。
空白和换行符
一般来说,空白符在PHP中无关紧要。可以将一个语句展开成任意行,或者将语句紧缩在一行。
可以利用这个灵活的格式来使代码更具有可读性(通过排列分配、缩进等)。一些懒惰的程序员利用这种自由的格式创建根本无法阅读的代码,这是不提倡的。
程序的注释
PHP支持C、C++和Shell脚本风格的注释,如下:
// 单行注释
/* ...*/ 多行注释 (注意:不能嵌套)
# 脚本注释
数据类型
弱类型
PHP是一种非常弱的类型语言。在大多数编程语言中,变量只能保持一种类型的数据,而且这个类型必须在使用变量前声明,例如C语言中。
而在PHP中,变量的类型通常不是由程序员设定的,确切地说,是根据该变量使用的上下文在运行时(即变量的值)决定的。
简单来说,var = 1;就是数字,var2 = '1'就是字符串,变量类型是由值决定的。
定义变量
可变的量成为变量
PHP 中一个美元符号($)后面跟上一个变量名称,即表示一个变量。变量的名称是对大小写敏感的。
$hd = 'houdun';
$HD = 'houdunwang';
输出两个变量结果是不一样的
变量名与 PHP 中其它的标签一样遵循相同的规则。一个有效的变量名由字母或者下划线开头,后面跟上任意数量的字母,数字,或者下划线。和js定义变量是一样的 $hd123 $_hd123
查看数据
echo
输出一个或多个变量,他不是函数,不需要使用括号,如果输出多个请用逗号分隔
echo 1,2,3,4;
var_dump
打印变量的相关信息
var_dump(1234);
区别:echo 是直接输出,var_dump输出和带有变量类型
变量赋值
传值赋值
$变量名=值
$a = 1;
$b = $a;
$b = 2;
echo $a;//结果是1
传址赋值 举例,在桌面创建a.txt,然后创建一个快捷方式叫b.txt,这个时候改变b.txt的时候,其实也在改变a.txt
\$变量名=&$变量名
$a = 1;
$b = &$a;
$b = 2;
echo $a;//结果是2
可变变量
可变变量
有时候使用可变变量名是很方便的。就是说,一个可变变量获取了一个普通变量的值作为这个可变变量的变量名。
例:
<?php
$a = 'hello'; //普通变量
$$a = 'world'; //可变变量 相当于:$hello = ‘world’;
echo "$a ${$a}";//输出:hello world
echo "$a $hello";//输出:hello world
?>
外部变量
PHP的特点之一是可以用简单的方式处理表单数据,获取环境变量。在PHP中,这些外部数据或变量保存在一种特殊的全局数组中。
$_GET["VAR"] get参数 请看get.php
$_POST["VAR"] post参数 请看post.php
$_REQUEST["VAR"] 可接收get与post及cookie参数 请看request.php
外部变量不只这些,后面我们会用到其他外部变量到时再讲。
常量
语义
常量是一个简单值的标识符(名字)。常量默认为大小写敏感。按照惯例常量标识符总是大写的。 常量不一定大写,按照规范是大写
常量名和其它任何 PHP 标签遵循同样的命名规则。合法的常量名以字母或下划线开始,后面跟着任何字母,数字或下划线。和变量定义名称一样
定义方式
define(“常量名",值);
define(‘HD’,’houdunwang’);
echo HD;
注:常量只能包含标量 标量包含 整形,浮点,字符串,布尔值
系统常量
- PHP_VERSION 显示PHP版本
- PHP_OS 显示服务器的操作系统版本
- TRUE FALSE 表示真假的常量 true 和 false 可以小写
系统本身自带的常量,这个地方可以让大家动手试一下自己的PHP版本和操作系统
变量与常量检测
检测变量是否存在
isset(变量名) 返回值为boolean
$bool = isset($var);
var_dump($bool);
# 结果是false
删除变量
unset(变量名) 是一个语句,没有返回值
$var = 'houdun’;
unset($var);
echo $var;
# 结果报undefined的错误
检测常量是否存在
defined(常量); 返回值为boolean
$bool = defined('A');
var_dump($bool);
# 结果是false
常量和变量不同
- 常量前面没有美元符号($)
- 常量只能用define() 函数定义,而不能通过赋值语句
- 常量一旦定义就不能被重新定义或者取消定义 重点
- 常量的值只能是标量
- 常量可以不用理会变量范围的规则而在任何地方定义和访问 至于变量范围,后面讲解函数的局部变量要详细讲解,这个地方作为了解
数据类型
布尔型(boolean)
当转换为 boolean 时,以下值被认为是FALSE:这个地方提示学生不用记,按照自己的感觉来就可以判定了,读完一遍之后把ppt关掉,提问true还是false,学生都会知道的
- 布尔值 FALSE
- 整型值 0(零)
- 浮点型值 0.0(零)
- 空白字符串
- 字符串 "0"
- 没有成员变量的数组
- 没有单元的对象(仅适用于 PHP 4)
- 特殊类型 NULL(包括尚未设定的变量)
所有其它值都被认为是 TRUE
整型(integer)与浮点型(Float)
整型
整型值可以用十进制,十六进制或八进制符号指定,前面可以加上可选的符号(- 或者 +)十六进制用0x开头代表,八进制用0开头代表,十六进制和八进制不用去深究,我们php用的非常少,用的最多的就是十进制,-代表负数,+代表整数
$num = 1;
$num = -1;
var_dump($num);
浮点数
浮点数简单理解为带小数点的数值类型。如:$a = 1.234
字符串(string)
示例:
$str = '后盾网';
echo $str;
// 直接输出会乱码,发送完头部就ok,因为不支持本地编码,所以需要我们指定编码
// header('Content-type:text/html;charset=utf-8');
NULL
NULL数据类型只有一个值NULL。
- 变量未被赋予任何值
- 变量被赋值为NULL
- 被unset()函数处理后的变量
示例:
$a; //变量 \$a未被赋予任何变量,值为NULL
\$b = NULL; //变量 \$b被赋值为NULL
\$c = 10;
unset($c);
//使用unset()函数处理后,\$c为NULL
取得和判断数据类型的函数
getType()
$num = 1234;
\$type = gettype(\$num);
var_dump(\$type);
检测是否为布尔型
$var = true;
\$bool = is_bool(\$var);
var_dump(\$bool);
检测是否为整型
$int = 1234;
$bool = is_int($int);
var_dump($bool);
检测是否为浮点数
$num = 1.1234;
$bool = is_float($num);
var_dump($bool);
检测是否为字符串
$string = 'houdunwang';
$bool = is_string($string);
var_dump($bool);
检测是否为NULL
$var = null;
$bool = is_null($var);
var_dump($bool);
类型转换
自动转换
PHP类型根据值,自动转换
$num1 = '1';
$num2 = '2';
echo $num1 + $num2; # 字符串转为数字相加
强制转换
settype($var,'type'); # type类型为integer、double、string、array 与 object
$var = '123';
settype($var,’integer’);
var_dump($var); 就会变成int类型
intval() $var = '123';
var_dump(intval($var));
floatval() $var = '1.23';
var_dump(floatval($var));
strval() $var = 123;
var_dump(strval($var));
流程控制
算术运算符
$a+$b 加法 $a和$b的和
$a-$b 减法 $a和$b的差
$a*$b 乘法 $a和$b的积
$a/$b 除法 $a除以$b的商
$a%$b 取模 $a除以$b后的余数
递增/递减运算符
++$a 前加 $a 的值先加一,然后进行操作
$a++ 后加 $a 的值先进行操作,后加一
--$a 前减 $a 的值先减一,然后进行操作
$a-- 后减 $a 的值先进行操作,后减一
比较运算符
运算符 名称 结果
$a==$b 等于 TRUE,如果$a等于$b
$a===$b 全等于 TRUE,如果$a等于$b,并且类型也相同
$a!=$b 不等 TRUE,如果$a不等于$b
$a<>$b 不等 TRUE,如果$a不等于$b
$a!==$b 非全等 TRUE,如果$a不等于$b,或者类型不同
$a<$b 小于 TRUE,如果$a严格小于$b
$a>$b 大于 TRUE,如果$a严格$b
$a<=$b 小于等于 TRUE,如果 $a 小于或者等于$b
$a>=$b 大于等于 TRUE,如果 $a 大于或者等于$b
三元表达式
变量=(表达式)?值1:值2;
当表达式的返回值为true时,$变量被赋予值1,否则被赋予值2
逻辑运算符
$a and $b 逻辑与 TRUE,如果 $a 与 $b 都为 TRUE
$a or $b 逻辑或 TRUE,如果 $a 或 $b 任一为TRUE
!$a 逻辑非 TRUE,如果 $a 不为 TRUE
$a && $b 逻辑与 TRUE,如果 $a 与 $b 都为TRUE
$a || $b 逻辑或 TRUE,如果 $a 或 $b 任一为TRUE
注:其中and与&& 、or与||是同一逻辑运算符的两种写法
其他运算符
字符串运算符
有两个字符串运算符。第一个是连接运算符(“.”),它返回其左右参数连接后的字符串。第二个是连接赋值运算符(“.=”),它将右边参数附加到左边的参数后。
赋值运算符
基本的赋值运算符是“=”。你一开始可能会以为它是“等于”,其实不是的。它实际上意味着把右边表达式的值赋给左边运算数。
顺序结构
在程序结构中,最基本的就是顺序结构。程序会按照自上而下的顺序执行。基本形式为
<?php
语句1;
语句2;
…..
语句n;
?>
单个if语句
if( 条件式 ){
执行语句组
}
当条件表达式的值为真(true)时,PHP将执行语句组,相反条件表达式的值为假(false)时,PHP将不执行语句组,忽略语句组执行下面的语句。
if…else语句
if(条件表达式){
语句组1
}else{
语句组2
}
if-else 条件判断与 if 条件判断类似,所不同的是,if-else 语句的条件表达式值为真(true)时,会执行 if 的本体语句(语句组1),而条件表达式值为假(false)时,则执行 else 的本体语句(语句组2)。
else if语句
if(条件表达式1){
语句组1
}elseif(条件表达式2){
语句组2
}else{
语句组3
}
while循环语句
while(表达式){
语句或语句序列
}
当while循环语句中表达式(循环控制语句)的结果为真时,程序将反复执行同一段程序:循环体( while中的语句或语句序列),直到满足一定的条件(表达式的结果为假时)后才停止执行该段程序。
for循环语句
for(表达式1;表达式2;表达式3){
语句或语句序列;
}
表达式1为循环初始条件;
表达式2为循环控制条件;
表达式3为控制变量递增;
语句或语句序列为循环体。
switch-case语句
switch(表达式){
case 值1:
语句序列1; break;
case 值2:
语句序列2; break;
…
default:
语句序列 n; break;
}
特殊流程控制语句
break
我们之前在 switch 条件判断中已经使用过 break 关键字,它会使得程序流程离开 switch 本体中的语句,如果 break 使用在 for、while 或 do-while 循环结构中时,将会使得程序离开该层循环。
continue
continue 的作用与 break 有点类似,continue 若使用在 for、while 或 do-while循环结构中,当程序执行至 continue 时,之后的语句将直接被略过,而直接执行下一次的循环动作。
函数编程
什么是函数?
函数的概念:
函数(function)是⼀一段完成指定任务的已命名代码,函数可以遵照给 它的⼀一组值或参数完成任务,并且可能返回⼀一个值。使⽤用函数可以节省 编译时间,因为⽆无论调⽤用多少次,函数只需被编译⼀一次。
函数的特性:
• 控制程序设计的复杂性 • 提⾼高软件的可靠性
• 提⾼高软件的开发效率
• 提⾼高软件的可维护性
• 提⾼高程序的重⽤用性
函数名称定义:
它是函数在程序代码中的识别名称,函数名可以是以字⺟母或下划线开头 后跟零个或多个字⺟母、下划线和数字的任何字符串串。函数名不不区分⼤大⼩小 写。命名函数时不不可使⽤用已声明的函数,或PHP内建的函数名称。
函数参数:
所谓的参数就是⽤用来把数值由函数外部传⼊入函数体中,并⽤用来加以运算 处理理。参数之间⽤用“ ,”号隔开。当函数不不需要任何数值传⼊入时,可以省 略略参数。
函数语法格式
function 函数名称(参数1,参数2 ...){
程序内容叙述;
return 返回值; //如需函数有返回值时使⽤用;
}
函数的使⽤用:
• 函数名称(参数1,参数2 ...);
$返回值变量量 = 函数名称(参数1,参数2);
函数返回值
返回值:
当调⽤用函数时需要它返回⼀一些数值,那么就要函数体中⽤用return语句句实 现。格式如下:
return 返回值; //返回值也可以是⼀一个表达式
如果函数中没有使⽤用return返回值时则函数返回值为null
函数检测
函数名称定义:
function_exists() 函数的作⽤用是检查类的⽅方法是否存在
检测hd这个函数是否定义:
var_dump(function_exists('hd'));
变量的能见度
意指变量量在程序中的可作⽤用范围。当⼀一个变量量执 ⾏行行赋值动作后,会随着声明局部的差异,而有不不同的作⽤用范围。
⼤致上来说变量量会依据声明的局部分为下列列两种:局部变量量和全局变量量
局部变量
在函数之中声明的变量量就是局部变量量,并且该变量量只有在函数范围之中才 能加以使⽤用。如果其它程序局部需要调⽤用使⽤用该变量量值时,必须透过 「return」指令,来将其传回⾄至主程序区块以作后续处理理。
<?php
$hd=0;
function p(){
$hd = 3; //定义局部变量量
echo "在函数中显示局部变量量\$hd值: $hd </br>";
}
p();
echo "在函数外显示变量量\$hd值: $hd <br>";
全局变量
在函数范围之外声明的变量量为全局变量量,在函数⽆无法直接使⽤用全局变量量,函数
要使⽤用全局变量量,必须要利利⽤用global引⼊入。
<?php
$hd=“后盾⽹网”;
function p() {
global $hd; //利利⽤用 global 引⼊入全局变量量 echo $hd;
}
p();
?>
# 可以使⽤用全局数组$GLOBALS调⽤用全局变量量。 echo $GLOBALS[“hd”];
静态变量
PHP支持声明函数变量为静态的(static)。一个静态变量在所有对该函数的调用之间共享,并且仅在脚本的执行期间函数第一次被调⽤时被初始化。
要声明函数变量为静态的⽤关键字static。通常静态变量的第一次使⽤用时赋予⼀个初始值。
参数的传递
按值传递参数
⽗程序直接传递指定的值或是变量给函数使用。由于所传递的值或变量,与函数里的数值分别储存于不同的内存区块,所以当函数对所导入的数值作了任何变动时,并不会对父程序造成直接影响。
按址传递参数(⽤用“&”符号实现)
相对于按值传递模式,并不会将⽗程序中的指定数值或⽬标变量传递给函数,⽽是把该数值或变量的内存储存区块相对地址导入函数之中。因此当该数值在函数中有任何变动时,会连带对⽗程序造成影响。
参数默认值
在php中,⽀支持函数的默认⽅方式调⽤用。如果在调⽤用函数时没有指定参数的值,在函数中会使⽤用参数的默认值。 默认参数必须列列在所有没 有默认值参数的后⾯面。
变量函数
- PHP支持变量函数的概念。这意味着如果⼀个变量名后有圆括号, PHP 将寻找与变量量的值同名的函数,并且将尝试执⾏行它。除了了别的事情以外,这个可以被⽤于实现回调函数,函数表等等。
- 变量函数不能⽤用于语言结构,例如 echo(),print(),unset(), isset(),empty(),include(),require() 以及类似的语句。需要使⽤⾃己的外壳函数来将这些结构用作变量函数。
递归调用
所谓的函数递归调用,就是函数可以在其声明的执⾏叙述之中调用执行⾃己。
通常在此类型的函数之中会附加⼀个条件判断叙述,以判断是否需要执行递归调用,并且在特定条件下终止函数的递归调用动作,把⽬前流程的主控权交回上⼀层函数执行。因此当某个执行递归调用的函数,没有附加条件判断叙述时可能会造成⽆限循环的错误情形。
函数递归调⽤最大的好处在于可以精简程序中繁杂重复调⽤用程序,并且能以这种特性来执行⼀些较为复杂的运算动作。
<?php
# 利⽤递归调⽤来运算 N 的阶乘
function recursive($n)
if ($n > 1){
$r=$n*facto($n-1);}
else{
$r=$n;
}
return $r;
}
echo "当 N 值为 5 时,阶乘为: ".recursive(5)."<br>";
echo "当 N 值为 10 时,阶乘为: ".recursive(10); ?>
代码重用
include和require
将文件导入,就像把该文件粘贴到使用函数的地方。
区别
include( )与require ( )区别在于在脚本执行时包含,当处理失败时include( )产生一个警告而require( )则导致一个致命错误。
include './test.php'; echo ‘test’; //如果test.php文件不存在会报一个warning错误,但是可以输出test
require './test.php'; echo ‘test’; //如果test.php文件不存在会报一个fatal错误,不可以输出test
include_once和require_once
- 与include( )语句及require( )类似,区别是如果该文件中的代码已经被包括了,则不会再次包括。
- 这两个函数用于在脚本执行期间同一个文件有可能被包括超过一次的情况下,以避免函数重定义,变量重新赋值等问题。
# 因为 include 每次都加载所以下面两行代码执行会报错
include './functions.php';
include './functions.php';
//下面使用 include_once 就不会报错
include_once './functions.php';
include_once './functions.php';