2024年1月9日发(作者:)

【通篇说明】

一、命令标准格式中的符号与字体说明:

“˽”代表空格;

“|”代表并列可选关键字;

“[……]”代表可选项);

斜体字,如:Parameter,表示为说明性字符,在实际命令中用具体内容替换;

标黑粗体字,如:directive,为命令关键字,不可替换;

注释标记:❑、##、//、/*……*/(多行注释)

第3章 PHP基础

3.5 PHP的基本语法

3.5.1 PHP标记

PHP一共提供了4种不同的标记风格供我们使用,如下所示:

(1)

官方推荐风格,标记之间的代码将被自动解释为PHP脚本语言。

(2)

短标记风格,使用这种标记之前须在配置文件中将short+open_tag设置为开启,不推荐这种风格。

(3)<%...%>

ASP风格,使用这种标记之前须在配置文件中将asp_tags设置为开启。

(4)

JavaScript标记的风格,这种标记风格是最长的,如果读者使用过JavaScript或VBScript,就会熟悉这种风格。如果你所使用的HTML编辑器无法支持其他标记风格,则可以使用它。这种风格在任何环境下都是可以用的,只是我们并不常使用。

 PHP 也允许使用短标记 ,但不鼓励使用。只有通过激活 中的 short_open_tag 配置指令或者在编译 PHP 时使用了配置选项 --enable-short-tags 时才能使用短标记。

 如果文件内容是纯 PHP 代码,最好在文件末尾删除 PHP 结束标记。这可以避免在 PHP 结束标记之后万一意外加入了空格或者换行符,会导致 PHP 开始输出这些空白,而脚本中此时并无输出的意图。

 要输出大段文本时,跳出 PHP 解析模式通常比将文本通过 echo 或

print 输出更有效率。

 可以在 PHP 中使用四对不同的开始和结束标记。其中两种,

总是可用的。另两种是短标记和 ASP 风格标记,可以在 配置文件中打开或关闭。尽管有些人觉得短标记和 ASP 风格标记很方便,但移植性较差,通常不推荐使用。

Note: 嵌入到 XML 或 XHTML 中

 此外注意如果将 PHP 嵌入到 XML 或 XHTML 中则需要使用 标记以保持符合标准。

Note: 版本区别

只使用的文件:>ver 5.3

 在 PHP 5.2 和之前的版本中,解释器不允许一个文件的全部内容就是一个开始标记

完全合法:>ver 5.4

 自 PHP 5.4 起,短格式的 echo 标记

short_open_tag 的设置是什么。

3.5.2 PHP中的注释

为代码添加注释是一种良好的编程习惯,不仅可以使程序更清晰,也更利于团队开发。PHP提供的注释主要有两种类型:单行注释和多行注释,这两种注释的语法和示例如下所示。

(1)单行注释

❑C++风格的单行注释

注释通常不会超过一行。因为这种注释很简短,所以没必要界定注释的结束。PHP支持C++的单行注释语法,在某一行代码中,//符号后面的所有内容均被视为注释,如下所示:

//这里写注释内容

❑shell风格的单行注释

PHP还支持另一种C++风格的单行注释,称为shell风格,它以#号开头。在某一行代码中,#符号后面的所有内容均被视为注释,如下所示:

#这里写注释内容

(2)多行注释

代码中通常要有一些详细的功能描述或其他的解释内容,这些说明可能有多行。虽然可以在每行的前面都加上C++或shell风格的注释符,但PHP还支持一种多行注释的形式,同时标注注释的开始和结束。多行注释以/*符号开头,以*/符号结束,在这两个符号之间可以写入多行注释,如下所示:

/*

*这里写注释内容

*/

注意:

 单行注释仅仅注释到行末或者当前的 PHP 代码块,视乎哪个首先出现。这意味着在 // ... ?> 或者 # ... ?> 之后的 HTML 代码将被显示出来:?>

跳出了 PHP 模式并返回了 HTML 模式,// 或 # 并不能影响到这一点。

 如果启用了 asp_tags 配置选项,其行为和 // %> 或 # %> 相同。

 不过, 标记在单行注释中不会跳出 PHP 模式。

 C 风格的注释在碰到第一个 */ 时结束。要确保不要嵌套 C 风格的注释。试图注释掉一大块代码时很容易出现该错误。

3.5.3指令分隔符

同 C 或 Perl 一样,PHP 需要在每个语句后用分号结束指令。一段 PHP 代码中的结束标记隐含表示了一个分号“;”在一个 PHP 代码段中的最后一行可以不用分号结束。如果后面还有新行,则代码段的结束标记包含了行结束。

3.5.4 从HTML中分离

凡是在一对开始和结束标记之外的内容都会被 PHP 解析器忽略,这使得 PHP

文件可以具备混合内容。 可以使 PHP 嵌入到 HTML 文档中去,如下例所示。

This is going to be ignored by PHP and displayed by the browser.

This will also be ignored by PHP and displayed by the browser.

例外:HTML中使用PHP条件语句时:

处于条件语句中间时,此时 PHP 解释器会根据条件判断来决定哪些输出,哪些跳过。见下例。

使用条件结构:

This will show if the expression is true.

Otherwise this will show.

 要输出大段文本时,跳出 PHP 解析模式通常比将文本通过 echo 或 print 输出更有效率。

3.6 PHP中的变量与常量

3.6.1 变量

*PHP中的变量也是临时的,它们只存在于一个脚本的执行期间。

也就是说,它们只有在此时才有一个值。当用户单击一个链接或者提交表单时,将获得一个新的页面,同时这些变量也将不复存在。

1.变量声明

我们已经对变量有了一个初步的了解,在掌握了正确的语法后,就可以自己创建变量。变量总是以美元符号$开头,然后是变量名。声明变量时必须遵循如下规则:

❑所有的变量名必须以美元符号($)开头。

❑美元符号后的第一个字符必须为字母(A~Z,a~z)或者下划线(_)(不能使用数字)。

❑变量名剩下的部分可以是任何数量的字母、数字和下划线组合。

❑变量名中不能出现空格(通常使用下划线进行字符分隔)。

❑变量名是区分大小写的,这就意味着$phpchina和$PHPChina是截然不同的变量,因此将两个变量进行如此相似的命名是非常不明智的。

这些变量是合法的:$phpchina、$phpchina_zend、$_phpchina。

注意:

与其他语言不同,PHP通常不需要在使用变量前声明或初始化变量。

换句话说,可以在定义变量类型之前先引用。尽管如此,最好还是不要这样做,

好的编程习惯是:所有的变量都应当在使用前进行声明,最好还要带有注释。

Note:未初始化可能引起的错误

依赖未初始化变量的默认值在某些情况下会有问题,例如把一个文件包含到另一个之中时碰上相同的变量名。另外把 register_globals 打开是一个主要的安全隐患。使用未初始化的变量会发出 E_NOTICE 错误,但是在向一个未初始化的数组附加单元时不会。

isset() 检测初始化

isset() 语言结构可以用来检测一个变量是否已被初始化。

bool isset ( mixed $var [, mixed $... ] )

检测变量是否设置,并且不是 NULL。

如果已经使用 unset() 释放了一个变量之后,它将不再是 isset()。若使用 isset() 测试一个被设置成 NULL 的变量,将返回 FALSE。同时要注意的是一个 NULL 字节("0")并不等同于 PHP 的 NULL 常数。

2.变量赋值

声明变量之后,就可以为其赋值。变量赋值有两种方法:

值赋值

$变量名=实际值(表达式);

引用赋值

$变量名A=&$变量名B;

Note: $this不能赋值

$this是一个特殊的变量,它不能被赋值。

3.可变变量

PHP支持对变量名称进行动态解析,也就是说,可以将变量名存储在另一个变量名中。如B变量存储了A变量的名称,通过对B变量的解析,即可得到A变量的值,如代码清单3-2所示:

$temp_1='temp_2';//变量B存储了变量A的名称

$temp_2="I'm temp_2";//为变量A赋值

echo $temp_1;//将输出I'm temp_2

Warning不能被动态引用

注意,在 PHP 的函数和类的方法中,超全局变量不能用作可变变量。$this 变量也是一个特殊变量,不能被动态引用。

4.变量作用域

(1)局部变量

在函数中声明的变量被认为是局部变量,即它只能在该函数中引用。如果在函数外赋值,将被认为是完全不同的另一个变量。注意,退出声明变量的函数时,该变量及相应的值就会撤销。

(2)函数参数

在声明参数的函数内部可以访问和处理这些参数,但当函数执行结束时,参数就会被撤销。

(3)全局变量global

全局变量可以在程序的任何地方访问。但是,为了修改一个全局变量,就必须在要修改该变量的函数中将其显式地声明为全局变量。

声明全局变量:global $a, $b;

只要在变量的前面加上关键字GLOBAL即可将其标识为全局变量。

改变为全局变量:

如果将GLOBAL关键字放在一个已有的变量的名称前面,则表示PHP要使用同名的变量。

(4)静态变量static $a = 0;

静态变量的作用域称为静态(static)作用域。静态变量在函数退出时不会丢失值,当再次调用此函数时还能保留这个值。

声明静态变量:

在变量名前面加上关键字STATIC就可以声明一个静态变量。

5.超级全局变量

PHP提供了很多有用的预定义变量,可以在执行脚本的任何位置访问,用于提供与环境有关的大量信息。

PHP的全部超级全局变量如下所示:

❑$GLOBALS:

包含所执行脚本内部全部可用的变量所组成的数组,数组的键即为变量的名称。

❑$_SERVER:

包含正在执行的脚本的周边环境信息,例如服务器的名称和正在运行的页面的名称等。

❑$_GET

包含可发送到服务器的变量。其中$_GET以url的形式传参,$_GET有字数限制(一般为2083B),且以url方式传参安全性不高。

❑$_POST:

POST则以包的形式传参。相对的,$_POST理论上没有字符限制,以HTTP包的形式传参,安全性更高。

❑$_SESSION

SESSION可以储存用户整个会话过程中的状态信息。

❑$_COOKIE:

COOKIE可设置并在本地保留明码信息。

❑$_REQUEST:

用户输入的所有变量数组,包含$_POST、$_GET和$_SESSION数组。

6. 预定义变量Table of Contents

Warning:影响预定义有效性

PHP 4.2.0 以及后续版本中,PHP 指令 register_globals 的默认值为 off。这是 PHP 的一个主要变化。让 register_globals 的值为 off将影响到预定义变量集在全局范围内的有效性。(详见上文链接)

Note: 不能被用作可变变量

超级全局变量不能被用作函数或类方法中的可变变量。

预定义变量列表:

超全局变量 — 超全局变量是在全部作用域中始终可用的内置变量

$GLOBALS — 引用全局作用域中可用的全部变量

$_SERVER — 服务器和执行环境信息

$_GET — HTTP GET 变量

$_POST — HTTP POST 变量

$_FILES — HTTP 文件上传变量

$_REQUEST — HTTP Request 变量

$_SESSION — Session 变量

$_ENV — 环境变量

$_COOKIE — HTTP Cookies

$php_errormsg — 前一个错误信息

$HTTP_RAW_POST_DATA — 原生POST数据

$http_response_header — HTTP 响应头

$argc — 传递给脚本的参数数目

$argv — 传递给脚本的参数数组

7.外部变量

HTML 表单(GET 和 POST)

当一个表单提交给 PHP 脚本时,表单中的信息会自动在脚本中可用。有很多方法访问此信息。

Note: $_POST 和 $_GET

超全局数组例如 $_POST 和 $_GET,自 PHP 4.1.0 起可用。

IMAGE SUBMIT 变量名

当提交表单时,可以用一幅图像代替标准的提交按钮,用类似这样的标记:

当用户点击到图像中的某处时,相应的表单会被传送到服务器,并加上两个变量 sub_x 和 sub_y。它们包含了用户点击图像的坐标。有经验的用户可能会注意到被浏览器发送的实际变量名包含的是一个点而不是下划线(即 sub.x 和 sub.y),但 PHP 自动将点转换成了下划线。

HTTP Cookies

PHP 透明地支持 » RFC 6265定义中的 HTTP cookies。

Cookies 是一种在远端浏览器端存储数据并能追踪或识别再次访问的用户的机制。

可以用setcookie() 函数设定 cookies。Cookies 是 HTTP 信息头中的一部分,因此 SetCookie 函数必须在向浏览器发送任何输出之前调用。对于 header()函数也有同样的限制。

Cookie 数据会在相应的 cookie 数据数组中可用,例如 $_COOKIE,$HTTP_COOKIE_VARS 和 $_REQUEST。更多细节和例子见setcookie() 手册页面。

如果要将多个值赋给一个 cookie 变量,必须将其赋成数组。例如:

setcookie("MyCookie[foo]", 'Testing 1', time()+3600);

setcookie("MyCookie[bar]", 'Testing 2', time()+3600);

?>

这将会建立两个单独的 cookie,尽管 MyCookie 在脚本中是一个单一的数组。

如果想在仅仅一个 cookie 中设定多个值,考虑先在值上使用serialize() 或 explode()。

注意在浏览器中一个 COOKIE

会替换掉上一个同名的 COOKIE,除非路径或者域不同。因此对于购物车程序可以保留一个计数器并一起传递,例如:

Example #4 一个 setcookie() 的示例

if (isset($_COOKIE['count'])) {

$count = $_COOKIE['count'] + 1;

} else {

$count = 1;

}

setcookie('count', $count, time()+3600);

setcookie("Cart[$count]", $item, time()+3600);

?>

3.6.2 常量

1.自定义常量define()

在PHP中使用define()定义常量。常量默认为大小写敏感。传统上常量标识符总是大写的。

语法:define()

bool define ( string $name , mixed $value [, bool $case_insensitive =

false ] )

参数

name

常量名。

value

常量的值;仅允许标量和 null。标量的类型是 integer, float,string 或者 boolean。 也能够定义常量值的类型为 resource ,但并不推荐这么做,可能会导致未知状况的发生。

case_insensitive

如果设置为 TRUE,该常量则大小写不敏感。默认是大小写敏感的。比如, CONSTANT 和 Constant 代表了不同的值。

注意事项:特定类型、不能改变

1、常量一经定义就永远不能改变,如果要再次定义常量值,则会产生警告并且再次定义的值会被忽略。

2、定义常量名称时不可用字符“$”开头,并且常量的值只能是特定的类型:整数、浮点数、字符串和布尔值。

常量和变量有如下不同:

 常量前面没有美元符号($);

 常量只能用 define() 函数定义,而不能通过赋值语句;

 常量可以不用理会变量的作用域而在任何地方定义和访问;

 常量一旦定义就不能被重新定义或者取消定义;

 常量的值只能是标量。

Note: const 关键字定义常量

和使用 define() 来定义常量相反的是,使用 const 关键字定义常量必须处于最顶端的作用区域,因为用此方法是在编译时定义的。这就意味着不能在函数内,循环内以及 if 语句之内用 const 来定义常量。

参见类常量。

Note:加载生效

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

示例:

define("PI",3.141592);//声明一个常量PI

$pi2=2*PI;//使用常量PI

Print("PI doubled equals f%",$pi2);

?>

查看常量:

查看常量是否被定义可以使用函数defined,函数的返回值为布尔类型。其形式如下:

boolean define(staring name,

mixed value [,bool case_insensitive])

可选参数case_insensitive,如果这个参数的值为TRUE,那么后面对此常量的引用将不区分大小写。

2.魔术常量

PHP为它运行的任何脚本提供了大量的预定义常量。有八个魔术常量它们的值随着它们在代码中的位置改变而改变。

名称

__LINE__

__FILE__

说明

文件中的当前行号。

文件的完整路径和文件名。如果用在被包含文件中,则返回被包含的文件名。自 PHP 4.0.2 起,__FILE__ 总是包含一个绝对路径(如果是符号连接,则是解析后的绝对路径),而在此之前的版本有时会包含一个相对路径。

__DIR__

文件所在的目录。如果用在被包括文件中,则返回被包括的文件所在的目录。它等价于dirname(__FILE__)。除非是根目录,否则目录中名不包括末尾的斜杠。(PHP 5.3.0中新增) =

__FUNCTION__

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

__CLASS__

类的名称(PHP 4.3.0 新加)。自 PHP 5 起本常量返回该类被定义时的名字(区分大小写)。在 PHP 4 中该值总是小写字母的。类名包括其被声明的作用区域(例如 FooBar)。注意自 PHP 5.4 起 __CLASS__ 对

trait 也起作用。当用在 trait 方法中时,__CLASS__ 是调用 trait

方法的类的名字。

__TRAIT__

Trait 的名字(PHP 5.4.0 新加)。自 PHP 5.4 起此常量返回 trait

被定义时的名字(区分大小写)。Trait 名包括其被声明的作用区域(例如 FooBar)。

__METHOD__

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

名称

__NAMESPACE__

说明

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

5.3.0 新增)。

最后要提醒大家,魔术常量的值会根据使用该常量的文件位置的改变而改变,这些特殊常量不区分大小写。

3.7 表达式

3.8 PHP中的数据类型

3.8.0 数据类型总述

PHP这种弱类型语言,变量的类型则是由数据决定的。

PHP 支持 8 种原始数据类型。

四种标量类型:

boolean(布尔型)

integer(整型)

float(浮点型,也称作 double)

string(字符串)

两种复合类型:

array(数组)

object(对象)

最后是两种特殊类型:

resource(资源)

NULL(无类型)

伪类型:

为了确保代码的易读性,本手册还介绍了一些伪类型:

mixed(混合类型)

number(数字类型)

callback(回调类型)

以及伪变量 $...。

其他类型:

 可能还会读到一些关于“双精度(double)”类型的参考。实际上 double 和

float 是相同的,由于一些历史的原因,这两个名称同时存在。

 变量的类型通常不是由程序员设定的,确切地说,是由 PHP 根据该变量使用的上下文在运行时决定的。

查看类型的函数:

如果想查看某个表达式的值和类型,用 var_dump() 函数。

如果只是想得到一个易读懂的类型的表达方式用于调试,用 gettype() 函数。

is_type 函数:

要查看某个类型,不要用 gettype(),而用 is_type 函数。

if (is_int($an_int)) {

$an_int += 4;

}

语法:is_type

Bool Is_typecode($var)

返回值是bool型,即:如果变量(或表达式)的值的类型=typecode类型名,返回ture,否则返回fales。

3.8.1 布尔型bool

布尔型是最简单的数据类型,表达式的值只有TURE和FALSE两个,不区分大小写。

注意 -1和其他非零值(不论正负)一样,被认为是TURE,而不是FALSE。

3.8.2 整型int

整型就是一个不包含小数部分的数,整型值可以指定为十进制、十六进制或八进制,八进制数字前必须加上零(0),十六进制符号数字前必须加上0x。

例如:

$num_1=123//一个十进制数

$num_2=0123//一个八进制数(等于十进制数中的83)

$num_3=0x3A//一个十六进制数(等于十进制数中的58)

因为PHP中不存在整除,所以,如果运算结果超出整型范围,则返回float,即整型的1/2等于float 0.5。

3.8.3 字符串string

字符串就是一个连续的字符的序列。一般可通过以下两种方式指定一个字符串的值。

1.单引号

当字符串应当按照声明的原样解释时,可以使用单引号括起这个字符串。这表示,解析字符串时,变量和转义序列都不会进行解析。示例如下:

转义符:

如果要在字符串中包含单引号,则需在它前面加上反斜线,这叫做字符的转义(escape),示例如下:

insingle-quoted(').';?>

如果要在字符串中包含反斜线,则需要对反斜线进行转义。示例如下:

insingle-quoted().';?>

2.双引号

相对于单引号的字符串,PHP处理程序会剖析双引号括起的字符串,以便查找和替换特别的转义序列和变量。PHP转义序列如下所示:

n 换行字符

r 回车字符

t 制表符

反斜线字符

$ 美元符号

0 值在0~255之间的字符,八进制表示法

x 值在0~255之间的字符,十六进制表示法

3.8.4 数组arry

由多个数值以键值对的形式存储而成的数据集合称为数组,其中,键也称为索引。

数组的相关函数:

注意:在开发PHP项目的时候,应尽量避免数组中存在类似''),所以数组后面的值将不会解析出来,这样就会导致数据的丢失。

count()

可以取得数组元素的个数。

print_r()

将数组全部打印出来以便查看数组的结构。

sort()

按照数组元素的值进行排序,按照先数字后字母的顺序由小到大进行排序,排序后数组的索引将会重置。

rsort()

按照由大到小的顺序对元素的值进行排序。

ksort()

按照数组的键名(索引顺序)对数组进行由小到大的排序。

krsort()

将数组进行由大到小的排序。

asort()

按值从大到小排序,执行asort()排序后的数组索引将不会重置,完全保留原数组键值的对应信息。

注意:使用sort()函数排序后的数值型数组是按数据值的大小进行排序的,字符型数组是按ASCII码的顺序进行排序的。如果一个数组的内容中同时包含英文字符、汉字字符和数字,使用sort()函数进行排序的顺序则依次为数字、英文字符和符、汉字字符和数字,使用sort()函数进行排序的顺序则依次为数字、英文字符和汉字字符。

3.8.5 对象object

创建对象的过程称为实例化,当一个对象被创建后,就包含了三个方面的特性:句柄、属性和方法。在面向对象的程序设计中,对象是一个非常重要的核心概念。

1.对象的句柄

对象被创建后,该对象就会获得一块存储空间,该控件的地址即为对象的标识,也就是对象的句柄。

2.属性与方法

在面向对象编程中,模块被组织成一个个对象。这些对象拥有方法和属性,从抽象的角度来看,方法是一个对象所做的动作,而属性是对象的特性。从编程的角度来看,方法就是函数,而属性就是变量。在一个理想化的面向对象体系中,每个部分都是一个对象,体系由对象及对象间通过方法形成的联系所构成。

关于对象的具体应用,将在第8章详细介绍。

对象初始化

要创建一个新的对象 object,使用 new 语句实例化一个类:

class foo{

function do_foo()

{

echo "Doing foo.";

}

}

$bar = new foo;

$bar->do_foo();

?>

转换为对象

 如果将一个对象转换成对象,它将不会有任何变化。

 如果其它任何类型的值被转换成对象,将会创建一个内置类 stdClass 的实例。

 如果该值为NULL,则新的实例为空。

 数组转换成对象将使键名成为属性名并具有相对应的值。对于任何其它的值,名为 scalar 的成员变量将包含该值。

$obj = (object) 'ciao';

echo $obj->scalar; // outputs 'ciao'

?>

3.8.6 其他类型

除了上面讲到的类型,PHP在特定情况下会用到以下几种类型:

1.资源

PHP有时会处理一些数据库连接或操作系统对象的句柄。资源 resource 是一种特殊变量,保存了到外部资源的一个引用。它们是被称为资源(resource)的特殊变量。一般情况下,资源在函数之间传递,这些函数知道如何处理它们。当不再需要这些资源时,PHP就会自动释放它们。

get_resource_type — 返回资源(resource)类型

描述

string get_resource_type ( resource $handle )

此函数返回一个字符串,用于表示传递给它的 resource 的类型。如果参数不是合法的 resource,将产生错误。

Note: 持久数据库连接

持久数据库连接比较特殊,它们不会被垃圾回收系统销毁。参见数据库永久连接一章。

NULL是PHP中的特殊类型和值,它代表“无值”。如果变量符合下列要求,则它们的值为NULL。

❑被设置为大小写敏感的关键字NULL。

❑从未被赋过值。

❑使用unset()方法后清除。

NULL、0、空字符的区别:NULL表示无值,0和空字符表示有值,值为0和空。

3.8.7 Callback 回调类型

自 PHP 5.4 起可用 callable 类型指定回调类型 callback。本文档基于同样理由使用 callback 类型信息。

一些函数如 call_user_func() 或 usort() 可以接受用户自定义的回调函数作为参数。回调函数不止可以是简单函数,还可以是对象的方法,包括静态类方法。

传递

一个 PHP 的函数以 string 类型传递其名称。可以使用任何内置或用户自定义函数,但除了语言结构例如:array(),echo,empty(),eval(),exit(),isset(),list(),print 或 unset()。

一个已实例化的对象的方法被作为数组传递,下标 0 包含该对象,下标 1 包含方法名。

静态类方法也可不经实例化该类的对象而传递,只要在下标 0 中包含类名而不是对象。自 PHP 5.2.3 起,也可以传递'ClassName::methodName'。

除了普通的用户自定义函数外,create_function() 可以用来创建一个匿名回调函数。自 PHP 5.3.0 起也可传递 closure给回调参数。

3.8.8 本文档中使用的伪类型与变量

mixed

mixed 说明一个参数可以接受多种不同的(但不一定是所有的)类型。

例如 gettype() 可以接受所有的 PHP 类型,str_replace() 可以接受字符串和数组。

number

number 说明一个参数可以是 integer 或者 float。

callback

本文档中在 PHP 5.4 引入 callable 类型之前使用 了 callback 伪类型。二者含义完全相同。

void

void 作为返回类型意味着函数的返回值是无用的。void 作为参数列表意味着函数不接受任何参数。

...

在函数原型中,$... 表示等等的意思。当一个函数可以接受任意个参数时使用此变量名。

数据类型Table of Contents

Boolean 布尔类型

Integer 整型

Float 浮点型

String 字符串

Array 数组

Object 对象

Resource 资源类型

NULL

Callback 回调类型

本文档中使用的伪类型与变量

类型转换的判别

3.9 强制类型转换

在项目开发中,经常会用到类型转换,例如把商品的价格由整型转换为字符型,与别的信息连在一起组成一张价目表。

3.9.1 显式和隐式强制类型转换

1.隐式强制类型转换

按操作结果的类型自动转换数据类型。隐式强制类型转换是一种最常见的转换方式,也是由PHP语言引擎自动解析的转换方式。

2.显式强制类型转换(typecode)$var

有时,PHP引擎认为转换类型后的数据会改变或丢失,将不自动转换,在这种情况下,可以使用(type cast)的方式显式强制转换某变量的值。

语法:

(typecode)$var

将一个变量$var转化成typecode所标明的变量类型。

转换规则:

(int)/(integer) $a:转换为整数

(float)/(double)/(real) $a:转换为浮点数

(string) $a:转换为文本字符串

(bool) $a /(boolean):转换为布尔值

(array) $a:转换为数组

(object) $a:转换为对象

(unset)$a:转换为NULL,

不会删除该变量或 unset 其值。仅是返回 NULL 值而已。

3.9.2 有用的强制类型转换函数

is_type():判断当前是否为某种类型的变量。

Gettype():得到当前变量的类型。

Settype():有两个参数为要转换的变量和要转换的类型,函数返回布尔值,表示转换成功。

* 3.9.3 Callback 回调类型

自 PHP 5.4 起可用 callable 类型指定回调类型 callback。本文档基于同样理由使用 callback 类型信息。

一些函数如 call_user_func() 或 usort() 可以接受用户自定义的回调函数作为参数。回调函数不止可以是简单函数,还可以是对象的方法,包括静态类方法。

传递

一个 PHP 的函数以 string 类型传递其名称。可以使用任何内置或用户自定义函数,但除了语言结构例如:array(),echo,empty(),eval(),exit(),isset(),list(),print 或 unset()。

一个已实例化的对象的方法被作为数组传递,下标 0 包含该对象,下标 1 包含方法名。

静态类方法也可不经实例化该类的对象而传递,只要在下标 0 中包含类名而不是对象。自 PHP 5.2.3 起,也可以传递 'ClassName::methodName'。

除了普通的用户自定义函数外,create_function() 可以用来创建一个匿名回调函数。自 PHP 5.3.0 起也可传递 closure 给回调参数。

Example #1 回调函数示例

// An example callback function

function my_callback_function() {

echo 'hello world!';

}

// An example callback method

class MyClass {

static function myCallbackMethod() {

echo 'Hello World!';

}

}

// Type 1: Simple callback

call_user_func('my_callback_function');

// Type 2: Static class method call

call_user_func(array('MyClass', 'myCallbackMethod'));

// Type 3: Object method call

$obj = new MyClass();

call_user_func(array($obj, 'myCallbackMethod'));

// Type 4: Static class method call (As of PHP 5.2.3)

call_user_func('MyClass::myCallbackMethod');

// Type 5: Relative static class method call (As of PHP 5.3.0)

class A {

public static function who() {

echo "An";

}

}

class B extends A {

public static function who() {

echo "Bn";

}

}

call_user_func(array('B', 'parent::who')); // A

?>

Example #2 使用 Closure 的示例

// Our closure

$double = function($a) {

return $a * 2;

};

// This is our range of numbers

$numbers = range(1, 5);

// Use the closure as a callback here to

// double the size of each element in our

// range

$new_numbers = array_map($double, $numbers);

print implode(' ', $new_numbers);

?>

以上例程会输出:

2 4 6 8 10

Note: 引用创建回调函数

在 PHP 4 中,需要使用引用来创建一个引用来创建一个指向具体对象的回调函数,而不是一个拷贝。参见引用的解释。

Note: 捕获异常

在函数中注册有多个回调内容时(如使用 call_user_func() 与 call_user_func_array()),如在前一个回调中有未捕获的异常,其后的将不再被调用。

3.10 PHP的语句

3.10.1 循环语句

循环

判断条件,然后执行循环。

while(condition){ //条件

statement;

//执行语句

continue; //只跳出一次循环,跳出后继续检查condition条件,

break;

//则直接跳到循环外。

}

...while循环

执行循环,在代码块的结束处验证循环条件。

do

{

Statement

continue; //只跳出一次循环,跳出后继续检查condition条件,

break;

//则直接跳到循环外。

}while(condition)

循环

for(expression1;expression2;expression3){

循环体

}

expression1:循环变量起始值

expression2;步进规则

expression3;循环结束变量值

3.10.2 条件判断语句

语句

if(condition)

{

statement

}else if(condition){

statement

}else{

statement

}

语句

switch($temp)

{

case

'value_1':statement;[break;]

case

'value_2':statement;[break;]

case

'value_3':statement;[break;]

……

……

[default:statement;]

}

3.11 运算符

运算符Table of Contents

运算符优先级

算术运算符

赋值运算符

位运算符

比较运算符

错误控制运算符

执行运算符

递增/递减运算符

逻辑运算符

字符串运算符

数组运算符

类型运算符

运算符优先级

结合方向

运算符

clone new

[

++ -- ~ (int) (float) (string) (array)

(object) (bool) @

instanceof

!

* / %

+ - .

<< >>

== != === !== <>

&

^

|

&&

||

? :

= += -= *= /= .= %= &= |= ^=

<<= >>= =>

and

xor

or

,

附加信息

clone 和 new

array()类型和递增/递减

类型逻辑运算符算术运算符算术运算符和字符串运算符

位运算符比较运算符位运算符和引用

位运算符位运算符逻辑运算符逻辑运算符三元运算符赋值运算符逻辑运算符逻辑运算符逻辑运算符多处用到

位运算符

例子

$a & $b

$a | $b

$a ^ $b

~ $a

$a << $b

$a >> $b

名称

And(按位与)

Or(按位或)

Xor(按位异或)

Not(按位取反)

Shift left(左移)

Shift right(右移)

结果

将把 $a 和 $b 中都为 1 的位设为 1。

将把 $a 和 $b 中任何一个为 1 的位设为 1。

将把 $a 和 $b 中一个为 1 另一个为 0 的位设为

1。

将 $a 中为 0 的位设为 1,反之亦然。

将 $a 中的位向左移动 $b 次(每一次移动都表示“乘以 2”)。

将 $a 中的位向右移动 $b 次(每一次移动都表示“除以 2”)。

比较运算符

例子

$a == $b

名称

等于

结果

TRUE,如果类型转换后 $a 等于 $b。

例子

$a === $b

$a != $b

$a <> $b

$a !== $b

$a < $b

$a > $b

$a <= $b

$a >= $b

名称

全等

不等

不等

不全等

小与

大于

小于等于

大于等于

结果

TRUE,如果 $a 等于 $b,并且它们的类型也相同。

TRUE,如果类型转换后 $a 不等于 $b。

TRUE,如果类型转换后 $a 不等于 $b。

TRUE,如果 $a 不等于 $b,或者它们的类型不同。

TRUE,如果 $a 严格小于 $b。

TRUE,如果 $a 严格大于 $b。

TRUE,如果 $a 小于或者等于 $b。

TRUE,如果 $a 大于或者等于 $b。

 如果比较一个数字和字符串或者比较涉及到数字内容的字符串,则字符串会被转换为数值并且比较按照数值来进行。

 此规则也适用于 switch 语句。当用 === 或 !== 进行比较时则不进行类型转换,因为此时类型和数值都要比对。

错误控制运算符

 PHP 支持一个错误控制运算符:@。当将其放置在一个 PHP 表达式之前,该表达式可能产生的任何错误信息都被忽略掉。

 如果用 set_error_handler() 设定了自定义的错误处理函数,仍然会被调用,但是此错误处理函数可以(并且也应该)调用 error_reporting(),而该函数在出错语句前有 @ 时将返回 0。

 如果激活了 track_errors 特性,表达式所产生的任何错误信息都被存放在变量 $php_errormsg 中。此变量在每次出错时都会被覆盖,所以如果想用它的话就要尽早检查。

递增/递减运算符

 PHP 支持 C 风格的前/后递增与递减运算符。

 Note: 递增/递减运算符不影响布尔值。递减 NULL 值也没有效果,但是递增 NULL 的结果是 1。

递增/递减运算符

例子

++$a

$a++

--$a

$a--

名称

前加

后加

前减

后减

效果

$a 的值加一,然后返回 $a。

返回 $a,然后将 $a 的值加一。

$a 的值减一, 然后返回 $a。

返回 $a,然后将 $a 的值减一。

逻辑运算符

例子 名称 结果

TRUE,如果 $a 和 $b 都为 TRUE。

TRUE,如果 $a 或 $b 任一为 TRUE。

$a and $b

And(逻辑与)

$a or $b

Or(逻辑或)

$a xor $b

Xor(逻辑异或) TRUE,如果 $a 或 $b 任一为 TRUE,但不同时是。

! $a

$a && $b

Not(逻辑非)

And(逻辑与)

TRUE,如果 $a 不为 TRUE。

TRUE,如果 $a 和 $b 都为 TRUE。

例子

$a || $b

名称

Or(逻辑或)

结果

TRUE,如果 $a 或 $b 任一为 TRUE。

“与”和“或”有两种不同形式运算符的原因是它们运算的优先级不同(见运算符优先级)。

数组运算符

例子

$a + $b

$a == $b

$a === $b

名称

联合

相等

全等

结果

$a 和 $b 的联合。

如果 $a 和 $b 具有相同的键/值对则为 TRUE。

如果 $a 和 $b 具有相同的键/值对并且顺序和类型都相同则为 TRUE。

$a != $b

$a <> $b

$a !== $b

不等

不等

不全等

如果 $a 不等于 $b 则为 TRUE。

如果 $a 不等于 $b 则为 TRUE。

如果 $a 不全等于 $b 则为 TRUE。

 + 运算符把右边的数组元素附加到左边的数组后面,两个数组中都有的键名,则只用左边数组中的,右边的被忽略。

外部程序执行运算符 (``)

PHP 支持一个执行运算符:反引号(``)。注意这不是单引号!PHP 将尝试将反引号中的内容作为外壳命令来执行(执行一个外部程序),并将其输出信息返回(即,可以赋给一个变量而不是简单地丢弃到标准输出)。使用反引号运算符“`”的效果与函数 shell_exec() 相同。

$output = `ls -al`;

echo "

$output
";

?>

Note有效条件:

反引号运算符在激活了安全模式或者关闭了 shell_exec() 时是无效的。

Note:双引号不能用

与其它某些语言不同,反引号不能在双引号字符串中使用。

参见手册中程序执行函数,popen(),proc_open() 以及 PHP 的命令行模式。

字符串运算符 “.” “.=”

有两个字符串(string)运算符。

第一个是连接运算符(“.”),它返回其左右参数连接后的字符串。

第二个是连接赋值运算符(“.=”),它将右边参数附加到左边的参数之后。

更多信息见赋值运算符。

$a = "Hello ";

$b = $a . "World!"; // now $b contains "Hello World!"

$a = "Hello ";

$a .= "World!"; // now $a contains "Hello World!"

?>

参见字符串类型和字符串函数章节。

类型运算符

instanceof 用于确定一个 PHP 变量是否属于某一类

class 的实例:

Example #1 对类使用 instanceof

class MyClass

{

}

class NotMyClass

{

}

$a = new MyClass;

var_dump($a instanceof MyClass);

var_dump($a instanceof NotMyClass);

?>

以上例程会输出:

bool(true)

bool(false)

确定一个变量是不是继承自某一父类的子类的实例:

Example #2 对继承类使用 instanceof

class ParentClass

{

}

class MyClass extends ParentClass

{

}

$a = new MyClass;

var_dump($a instanceof MyClass);

var_dump($a instanceof ParentClass);

?>

以上例程会输出:

bool(true)

bool(true)

检查一个对象是否不是某个类的实例,可以使用逻辑运算符

not。