购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

1.2 基本语法

PHP是一种弱类型、面向对象的编程语言,本节会快速地介绍一下PHP的基本语法,示例代码可以从ch01/quick_start.php里找到。

1.2.1 基本规范

PHP代码以<?php作为起始标记,以?>作为结束标记。如果一个文件的内容全部为PHP代码,或文件的结尾部分是PHP代码,推荐省略?>结束标记。因为如果加上?>结束标记,无意间在其后增加了空行,那么会在输出内容里增加这些空行,造成不必要的麻烦。

PHP用分号分割每个语句。代码段的最后一行可以不用分号结束,但一般不推荐如此使用。

PHP的注释分为单行注释和块注释。

     // This is a line comment
     
     # This is a line comment too
     
     /*
     This is a block coment,
     which can be used in multi lines
     */

1.2.2 数据类型

PHP中的变量不用事先定义类型,而且运行过程中可以改变其类型。PHP 7.1及以上的版本支持10种数据类型,如表1-4所示。

表1-4 PHP数据类型

1.2.3 变 量

PHP定义一个变量的方法是,美元符号$加上变量名。变量名的规则是首字符为数字或下画线,其余可为数字、字母与下画线,例如:

     $var = 'foo';

变量区分大小写。例如:

     $var = 'foo';
     $VAR = 'FOO';

$var与$VAR是不同的变量。

PHP内置了一些预定义变量,这些变量通常为超全局变量,代码的任何地方都可以直接使用这些变量。常见的预定义变量如表1-5所示。

表1-5 PHP预定义变量

变量的范围是指变量的生效范围,即在其上下文背景内能否被访问、赋值等。PHP的变量范围分为以下三种。

(1)文件域:定义在两个不同文件的变量,其作用域限制在文件内部。

例如,文件a.php中定义了$a:

     <?php
     $a = 1;

文件b.php引入a.php,但这时$a在b.php里不生效,所以$a未定义,即$a=NULL。

     <?php
     include a.php;
     var_dump($a);//$a = NULL

(2)函数域:定义在函数内部的变量,其作用域限制在函数内部。

例如函数foo里定义了$a=1,但其生效范围仅限于函数foo里,所以函数foo之外的$a=NULL。

(3)全局变量:全局变量可以在任意地方生效,表1-4中的PHP数据类型里的预定义变量就是全部变量。

可以使用global来改变变量的作用域。例如:

1.2.4 常 量

常量在定义之后,其值不能改变,而且不能被unset。

常量的定义方式有以下两种:

1.define
     define('FOO','foo');
2.const
     const FOO = 'foo';

PHP定义了一些魔术常量,如表1-6所示。

表1-6 PHP魔术常量

1.2.5 运算符

运算是一种给定若干输入值,通过特定的操作产生输出值的过程,运算符就是表示特定的操作。根据输入值的个数不同可以分为几种情况:一元运算符只能接收一个值,如递增/递减运算符;两元运算符接收两个值,如常见的加减乘除运算符;三元运算符接收三个值,PHP仅有一个三元运算符?:。

表1-7整理了PHP支持的运算符。

表1-7 PHP运算符

1.2.6 流程控制

PHP的流程控制分为条件控制、循环控制、分支控制和goto语句。

1.条件控制

根据条件执行语句,满足则执行,不满足则忽略。例如:

2.循环控制

重复执行语句若干次,可以根据条件是否满足决定循环是否终止或继续运行。以下介绍for、foreach、while、do-while、break和continue的使用。

(1)for

(2)foreach

(3)while

(4)do-while

(5)break和continue

在循环控制里,可以使用break和continue改变执行的流程。

● break跳出循环。break可以接受一个可选的数字参数来决定跳出几重循环。

● continue跳过本次循环,不再执行continue语句之后的剩余代码。continue也可以接受一个可选的数字参数来决定跳过几重循环到循环结尾。默认值是1,即跳到当前循环末尾。

3.分支控制

在需要一个变量或表达式与多个不同值比较的场景下,可以用switch代替众多的if else判断。例如:

注意break的使用,如果某个case不加break,该case将会向下执行,直到遇到break或所有case执行完毕才停止。

4.goto语句

goto用来跳转到程序中的另一位置。在各个语言里,goto被视为破坏程序可读性的罪魁祸首,一般不推荐使用。

1.2.7 函 数

PHP的函数分为内置函数和自定义函数。内置函数是PHP标准函数,如strlen为获取给定字符串长度;用户可以自行定义一个函数来实现想要的功能。

定义函数的格式如下:

其中$arg1,$arg2为参数,$arg2的类型为int,默认值为0。函数的返回值类型为int。

函数的参数是函数的输入,默认按值传递,也可以通过引用传递。函数支持默认参数和可变长度参数。

1.引用传递

函数的参数默认传递方式为值传递,即传递的参数的作用域仅限函数内部,在函数内部改变参数的值,不会改变函数外部的值。如下例,尽管在value_demo函数里将$str改变了,但外部输出的仍然是原值。

引用传递是指将参数以引用方式传递到函数内部(类似于C语言的指针),函数内的修改会生效。如下例,在reference_demo函数里将$str改变参数值,在外部就生效了。

2.可变长度参数

如果定义函数时无法确定参数的个数,可以使用可变长度参数,语法为…+参数名。例如:

与可变长度参数相关的函数有三个,如表1-8所示。

表1-8 与可变长度参数相关的函数

1.2.8 字符串

字符串是主流语言都支持的一种数据结构,类似于自然语言,程序员的第一个编程任务输出的“hello world”就是字符串。PHP提供了强大的字符串处理函数。

定义字符串可以使用双引号或单引号,双引号支持变量解析,而单引号不支持。示例:

     $str = 'hello';//单引号定义字符串
     $str2 = "$str world";//双引号定义字符串

字符串可以用“.”符号进行拼接:

     $str3 = $str . ' world';//字符串拼接

PHP甚至提供了大小写转换的函数,例如:

     strtoupper('Hello World');//将字符串转化为大写
     strtolower('Hello World');//将字符串转化为小写

1.2.9 数 组

PHP的数组除了传统意义的数组(如C语言里的数组)外,还可以起到链表、队列、栈、map的作用。数组可以说是PHP的核心,拥有广泛的应用场景。

● 遍历。从MySQL读出的数据,可以数组方式进行遍历处理。

● 排序。数组排序,支持自定义排序规则和多维数组排序。

● 格式转换。与JSON格式相互转换,以方便使用Restful风格的接口格式。

定义数组有两种方式:

数组分为两种,其一是纯数组,其下标为数字,叫作压缩数组(packed array);其二是哈希数组(hash array),类似于其他语言的map。

PHP的数组有丰富的函数库可供使用,请看下面的几个示例。

数组遍历示例:

排序示例:

     $nums = [1,3,2,6,4,5];
     sort($nums);//正序排序,结果为1,2,3,4,5,6
     rsort($nums);//逆序排序,结果为6,5,4,3,2,1

格式转换:

     $json = json_encode($array);
     $array = json_decode($json,true);

1.2.10 类与对象

PHP是一种面向对象的编程语言,它提供了丰富的面向对象的特性。类是计算机语言对外部世界物体的一个抽象描述,对象是类的实例。

定义一个类的格式如下:

PHP的类是单继承的,即最多只能有一个父类。可以实现多个接口,用逗号来分隔多个接口的名称。类有属性和方法,属性和方法都有私有、受保护、公有三种访问控制。

PHP的类和对象的术语解释如表1-9所示。

表1-9 PHP类和对象

1.2.11 异常处理

在PHP 5中处理异常的流程是try … catch … finally。如果在try中出现可被捕获(thrown)的异常(Exception),可以在catch里处理此异常(如返回默认值,进行回退操作等),在finally里处理兜底逻辑(如关闭socket、关闭文件等)。

PHP 7的异常处理不同于PHP 5。PHP 7引入了一个与Exception同级别的结构Error,并将一些Fatal Error当作Error异常抛出。这种Error异常也可以像Exception异常一样被第一个匹配的try/catch块所捕获。如果没有匹配的catch块,则调用异常处理函数(事先通过set_exception_handler()注册)进行处理。如果尚未注册异常处理函数,则按照传统方式处理:被报告为一个致命错误(Fatal Error)。例如:

调用一个未定义的函数:

     undefined_func();

这时会输出类似于以下的错误信息并中断程序的运行:

     Fatal error: Uncaught Error: Call to undefined function undefined_func()

使用try/catch之后,可以捕获这种错误,程序也能继续运行。

PHP 7的Error层次结构如表1-10所示。

表1-10 PHP 7的Error层次结构

当需要处理异常时,应该使用哪种类型呢?一般而言,Error处理与代码有关的错误,如进行取模操作时除数为0引发的错误,引用不存在的函数引发的错误等;Exception处理与外部环境有关的错误,如MySQL连接异常、文件打开异常、网络访问异常等。

1.2.12 命名空间

命名空间是一种对类的层级结构的一种封装方式,类似于操作系统的目录。在不同的命名空间下,用户不用担心类/函数/常量的名字冲突,在引入第三方类库时,也不用担心名字冲突。

在引入其他命名空间之下类库时,如果标识符名称冲突或过长,可以使用use as来创建别名。使用示例如下: UgayGJQXgzvLMTIPi5KbsKxklaaH++uLHyJ72MROIvUkHMi5PLcaxdbYwFVLpiXK

     namesapce David\Name;
     use Other\Name as OtherName;
点击中间区域
呼出菜单
上一章
目录
下一章
×