相关技术介绍

1.5 相关技术介绍
1.5.1 PHP

PHP 是一种创建动态交互站点的强有力的服务器端脚本语言。PHP 语法非常类似于 Perl 和 C。PHP 常常搭配 Apache(web 服务器)一起使用,不过它也支持 ISAPI,并且可以运行于 Windows 的微软 IIS 平台。

PHP 和其他的语言相比,最大的优势是它集成了 700 多个内建的函数且有非常多的扩展,配合 Apache 服务器,使得它处理 HTTP 的请求非常方便。另一方面,它对 MySQL 的支持也非常好,有很多的访问扩展库。本书会使用一种比较轻量的访问 MySQL 的扩展 mysqli。接下来先介绍一下 PHP 的基本语法。由于本书的主题是微信公众平台的开发,所以不会详细介绍 PHP 的语法。如果你有 C、C++ 或者 Java 等其他语言的开发经验,那么阅读本书的 PHP 语法介绍之后就可以基本掌握 PHP 语法了。如果你没有其他语言的开发经验,建议你购买一本专门介绍 PHP 语法的书籍学习。当然如果你做过 PHP 的开发,那可以直接跳过本节。

1. PHP 的基本语法

PHP 的脚本块以“<?php” 开始, 以“?>” 结束。可以把 PHP 的脚本块放置在文档中的任何位置。当然,在支持简写的服务器上,可以使用“<?”和“?>”来开始和结束脚本块。不过,为了达到最好的兼容性,推荐使用标准形式(<?php),而不是简写形式。下面的代码就是 PHP 脚本的一个简单应用,其实现的是打印一个简单的字符串: hello world!。

<?php
echo "hello world!";
?>

右击 Test 工程,在弹出的快捷菜单中选择“New”选项,然后选择“PHP File”选项,在弹出的“新建 PHP 文件”对话框的“File Name”文本框中键入“test.php”,单击“Finish”按钮。接着在新建的 test.php 文件里输入以上代码,并通过 Ctrl+S 快捷键保存,如图 1-22 所示。
test.php
图1-22 test.php

然后打开浏览器,在地址栏里输入 http://127.0.0.1/Test/test.php,浏览器中将显示“hello world!”,如图 1-23 所示。
test.php 在 google Chrome 中的运行结果
图1-23 test.php 在 google Chrome 中的运行结果

test.php 文件的创建和运行展示了最基本的使用 Apache 和 zendstudio 开发和测试 PHP 脚本的过程:
1)在 zendstudio 中创建文件,并编写相应的代码。
2)在浏览器中运行脚本,查看脚本输出是否正确。如果代码有语法错误或者出现了异常,浏览器会打印出语法错误提示和抛出的异常描述。

本书中的所有 PHP 代码都是这样编写并调试的。

PHP 的注释和 C 语言的注释是一致的,用“//”作为单行注释的开始,用“/*”和“*/”包含多行注释,如图 1-24 所示。
单行注释和多行注释
图1-24 单行注释和多行注释

2. PHP 的变量

PHP 中所有的变量都是以 $ 符号开始的。PHP 是一门松散类型的语言,在变量设置中不需要明确声明该变量的数据类型。根据变量被设置的方式,PHP 会自动把变量转换为正确的数据类型。在 C、C++ 和 Java 等强类型的语言中,必须在变量被使用前显式声明它的类型。另外,PHP 的变量不需要提前声明,在使用时会被自动声明。在 Test 中新建一个文件,命名为 test2.php,键入以下代码:

<?php
$a = 5;
echo $a;
echo "<BR>";
$b = "this is a string";
echo $b;
echo "<BR>";
echo "$a, $b";
echo "<BR>";
echo '$a, $b';
?>

上述代码的分析如下:
❑ echo "<BR>" 是打印一个网页换行符。
❑ 我们声明了两个变量—— $a 和 $b,因为把 $a 设置成了 5,所以 PHP 会自动把 $a 设置成整型变量;同样的,会把 $b 设置成字符串变量。
❑ 注意其中的 echo "$a, $b" 和 echo '$a, $b',对应不同的输出。在双引号中变量会自动解析成它的值,而在单引号中,变量不会做任何转义。这和 Shell 脚本是一致的。
在浏览器中执行 http://127.0.0.1/Test/test2.php,结果如图 1-25 所示。
test2.php 的执行结果
图1-25 test2.php 的执行结果

PHP 中有一个非常简便的连接操作符: . (一个英文的句号)。它可以连接字符串,当操作数中有非字符串时,会先转换成字符串,然后再做字符串连接操作。继续上面的例子,我们在上面代码的末尾加入以下代码:

<?php
echo "<BR>";
echo $a . $b;
echo "<BR>";
echo $a . $a;
?>

在浏览器中执行修改后的代码,结果如 1-26 所示。
连接操作符的结果
图1-26 连接操作符的结果

可以看到其他 $a 和 $b 的连接形成了“5this is a string”,$a 先转成了一个字符串再和 $b 做连接操作。在语句 $a . $a 中,连接操作符两边的 $a 都被转成了字符串再做连接操作,于是得到结果“55”。

3. PHP 的运算符

PHP 的运算符包括算术运算符、赋值运算符、比较运算符和逻辑运算符。这些运算符的定义和 C、C++ 和 Java 中的都是一样的,本书不做详细介绍,下面以表格的方式列出这些运算符的定义。
❑ 算术运算符,其具体定义如表 1-1 所示。

表 1-1 算术运算符

运算符说明例子结果
+$x=2
$x+2
4
-$x=2
5-$x
3
*$x=4
$x*5
20
/15/53
5/22.5
%取余5%21
10%82
10%20
++自增$x=5
$x++
$x=6
--自减$x=5
$x--
$x=4

❑ 赋值运算符,其具体定义如表 1-2 所示。

表 1-2 赋值运算符

运算符例子实际意义
=x=yx=y
+=x+=yx=x+y
-=x-=yx=x-y
*=x*=yx=x*y
/=x/=yx=x/y
.=x.=yx=x.y
%=x%=yx=x%y

❑ 比较运算符,其具体定义如表 1-3 所示。

表1-3 比较运算符

运算符说明例子
==等于5==8,返回 false
!=不等于5!=8,返回 true
>大于5>8,返回 false
<小于5<8,返回 true
>=大于或者等于5>=8,返回 false
<=小于或者等于5<=8,返回 true

❑ 逻辑运算符,其具体定义如表 1-4 所示。

表 1-4 逻辑运算符

运算符说明例子
&&与(and) x=6
y=3
(x < 10 && y > 1) 返回 true
||或(or) x=6
y=3
(x==5 || y==5) 返回 false
!非(not) x=6
y=3
!(x==y) 返回 true

4. PHP 数组

PHP 的数组和其他语言的有很大的不同,这也是 PHP 语言的特色之一。PHP 有三种类型的数组:数值数组、关联数组和多维数组。

(1)数值数组

数值数组存储的每一个元素都带有一个数值ID 键,这和 C、C++、Java 中的数组是一样的。可以使用不同的方式来创建数值数组,例如下面这种定义方式:

<?php
$animal = array("dog","cat","sheep");
?>

这种以定义一个 array 的方式创建的数组,系统会自动为数组中的每个值分配一个从 0 开始的键值。它等同于下面的方式:

<?php
$animal[0] = "dog";
$animal[1] = "cat";
$animal[2] = "sheep";
?>

下面我们测试一下采用上面这种方式新建的数组,建立新的测试文件或者删除 test2.php 文件中的代码,输入下面的代码:

<?php
$animal[0] = "dog";
$animal[1] = "cat";
$animal[2] = "sheep";
echo $animal[0].",".$animal[1]."and".$animal[2]."are animals!"
?>

在浏览器中测试,结果如图 1-27 所示。
数组测试结果
图1-27 数组测试结果

可以把数组的定义方式换成使用 array 的方式,得到的结果是一样的。需要注意的一点是数组中各个元素的类型不需要一样。可以定义以下的数组:

<?php
$arr = array("string", 5, 1);
?>

这是 PHP 语言和其他语言(C/C++/Java)相比最大的不同之处。

(2)关联数组

和数值数组不同,关联数组的 key 可以为整型或者字符串。和数值数组一样,关联数组也有两种定义方式。下面展示的是第一种方式:

<?php
$animal = array(
    'dog' => 23,
    'cat' => 26,
    'sheep' => 35
);
?>

下面第二种方式:

<?php
$animal['dog'] = 23;
$animal['cat'] = 26;
$animal['sheep'] = 35;
?>

这和 C++ 的 STL 的 map 容器类似。但是它比 map 容器更灵活,因为 STL 的 map 在声明的时候就规定好了 key 的类型和 value 的类型,PHP 的关联数组中每个 key 和每个 value 的类型都可以不一样。以下的定义方式是合法的:

<?php
$animal = array(
    'dog' => 23,
    'cat' => 26,
    'sheep' => 35,
    1 => 45,
    0 => 47
);
?>

这和下面的定义是一致的:

<?php
$animal['dog'] = 23;
$animal['cat'] = 26;
$animal['sheep'] = 35;
$animal[1] = 45;
$animal[0] = 47;
?>

(3)多维数组

在多维数组中,如果主数组是一个数值数组,那么它的元素还可以是一个数组(关联数组或者数值数组),如下面的代码所示:

<?php
$arr = array(
    array(1,2,3),
    array(
        "cat" => 10,
        "dog" => 21,
        "sheep" => 46
    )
);
?>

如果主数组是一个关联数组,那么它的 value 可以是一个数组(关联数组或者数值数组),如以下代码所示:

<?php
$arr = array(
    "cat" =>array(1,2,3),
    "dog" =>array(
        "cat" => 45,
        "dog" => 23
    )
);
?>

PHP 的数组是 PHP 中最灵活的数据类型,可以任意组合各种数据类型,下面的数组也是合法的:

<?php
$arr = array(
    'hello',
    'cat' => array('hello', 'world'),
    'dog' => 1,
    'sheep'
);
?>

PHP 会为没有 key 的元素自动分配一个从 0 开始的 key 值,上面代码中创建的数组中的元素'hello' 的 key 为 0,'sheep' 的 key 为 1。为了证实这个结论,我们先引入两个 PHP 的内建函数 var_dump 和 var_export。

5. 常用函数

(1) var_dump 和 var_export

var_dump 可以把变量以字符串形式打印出来,而 var_export 可以把变量以字符串形式打印出来或者返回。先看下面的代码:

<?php
$arr = array(
    'hello',
    'cat' => array('hello', 'world'),
    'dog' => 1,
    'sheep'
);
var_dump($arr);
?>

执行结果如图 1-28 所示。
var_dump 测试结果
图1-28 var_dump 测试结果

仔细查看图 1-28 中的输出,最开始的“array(4)”,表明 var_dump 函数的入参“$srr”是一个大小为 4 的数组(数组第一维的长度为 4)。接下来的一个花括号包含的是这个数组的说明,数组的每一个元素的 key 都在一个中括号中,然后每个元素的 value 是由类型和它的值组成的。仔细观察数组中每个元素的下标:第一个元素“hello”的下标为 0,最后一个元素“sheep”的下标为 1;其他的元素的下标都是我们在程序中指定的。这证实了我们的结论:对没有设定下标的元素,PHP 会自动为它们设定从 0 开始的下标。

var_export 函数和 var_dump 类似,不同之处是它接受第二个参数:一个 bool 值(true/false)。当 var_export 不传入第二个参数的时候,它输出变量的字符串表示的是和 var_dump 的类似(此时第二个参数的为默认值 false)的。当设定第二个参数为 true 时,它会把变量的字符串当作返回值返回,而不是直接输出。看下面的例子:

<?php
$arr = array(
    'hello',
    'cat' => array('hello', 'world'),
    'dog' => 1,
    'sheep'
);
$ret = var_export($arr, true);
echo "var_export result: " . $ret ;
?>

执行结果如图 1-29 所示。
var_export 的输出
图1-29 var_export 的输出

仔细观察 var_export 的输出会发现,和 var_dump 的输出不同之处是它不输出类型信息。但是这些类型信息基本上可以一眼看出。

var_dump 和 var_export 这两个函数给调试代码带来了非常大的方便。有了这两个函数可以在需要查看复杂变量值的时候,加入类似上面例子中的代码。可能学过 Java、使用过 Eclipse 的人更倾向于使用 zendstudio 内建的调试功能,因为 zendstuio 也是基于 Eclipse 开发的。我们不评论这两种方法的优劣,只谈偏好吧。笔者觉得通过写日志的方式来查看程序逻辑可能存在的错误是最合适的,因为它可以真实地反映代码执行的先后顺序。另外 PHP 是一种脚本语言,不需要编译即可执行,这样在修改完代码后到执行之间不需要花很多时间来编译。根据笔者多年的 PHP 开发经验,使用这种写日志的方式来排错是非常高效的。既然谈到写日志,下面介绍一个最简单的写日志的函数 file_put_contents。

(2) file_put_contents

file_put_contents 是一个可以写字符串到文件的函数,有四个入参,但我们只要关心前三个。第一个入参是表示文件地址的字符串;第二个是需要写入的字符串;第三个是写入的模式,我们一般用宏定义 FILE_APPEND,表示追加写入。看下面的例子。

<?php
file_put_contents("C:\\AppServ\\tmp.txt", "start\n", FILE_APPEND);

$arr = array(
    'hello',
    'cat' => array('hello', 'world'),
    'dog' => 1,
    'sheep'
);

$ret = var_export($arr, true);
file_put_contents("C:\\AppServ\\tmp.txt","var_export result:".$ret."\n",FILE_APPEND);
file_put_contents("C:\\AppServ\\tmp.txt", "end\n", FILE_APPEND);
?>

执行这段代码,然后打开文件 tmp.txt,查看 file_put_contents 输出,如图 1-30 所示。
file_put_contents 输出
图1-30 file_put_contents 输出

我们在执行这段之前并没有手工建立 tmp.txt 文件,这说明 file_put_contents 在没有文件的情况下会自动创建文件。另外 var_export 的输出和在 Chrome 里输出的不一样,文件里的格式更好看,因为对齐了。这是因为 var_export 是用 ASCII 码中的 \t 和 \n 来做对齐处理的,但是这些字符串的意义在浏览器中是不能正常解析的,但是在文本处理器 editplus 中可以正常解析。

PHP 的基本语法就介绍到这里,它的其他的特性和其他语言相差不大,在后面介绍其他预备知识和具体使用到的时候再介绍。

介绍到这里,我有一些经验和读者分享。学习一门语言不能上来就使用一本很厚的书,这样花很长时间看完书,接受了太多的信息,反而不知道从何处下手。从最基本最简单的开始,边用边学新的特性,这样会学得更扎实、更实用。在使用一段时间后再通读一下大部头的名著,才会真正吸收里面的内容,使自己对这门语言有全面的了解,让自己有实质性的提高。

下一节 1.5.2 HTTP
上一节 1.4 zendstudio 的安装与配置
返回微信公众平台应用开发实战

天香空城微信二维码
关注 天香空城 微信号 ulisse 或扫描二维码,可以了解微信营销书籍
微信营销书评
微信公众平台开发源码

返回微信营销