只是打印出 hello world 肯定是不够的,是吗?你会希望做得比这还要多——你想要输入一些内容,操纵它,然后从中得到一些输出出来的内容。我们可以在 PHP 中通过使用变量与常量来实现这一目标,在本章中我们还会学习其它的一些概念。

PHP 标记

当解析一个文件时,PHP 会寻找起始和结束标记,也就是 <?php?>,这告诉 PHP 开始和停止解析二者之间的代码。此种解析方式使得 PHP 可以被嵌入到各种不同的文档中去,而任何起始和结束标记之外的部分都会被 PHP 解析器忽略。

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

注释

PHP 支持 C,C++ 和 Unix Shell 风格(Perl 风格)的注释。例如:

1
2
3
4
5
6
<?php
echo "This is a test"; // 这是 C++ 风格的单行注释
/* 这是一个
多行注释 */
echo "This is yet another test";
echo 'One Final Test'; # 这是 shell 风格的单行注释

注释主要用作写给程序读者看的笔记。

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

1
2
3
4
<?php
/*
echo "This is a test"; /* 这个注释将要引起问题 */
*/

你应该在你的程序中尽可能多地使用有用的注释:

  • 解释假设
  • 说明重要的决定
  • 解释重要的细节
  • 说明你想要解决的问题
  • 说明你想要在程序中克服的问题,等等。

代码会告诉你怎么做,注释会告诉你为何如此。

这样做对你的程序的读者来说非常有用,他们可以很容易地理解你的程序是做什么的。请记住,这个人可以是六个月后的你!

常量

常量是一个简单值的标识符(名字)。如同其名称所暗示的,在脚本执行期间该值不能改变。常量默认为大小写敏感。传统上常量标识符总是大写的。

常量名和其它任何 PHP 标签遵循同样的命名规则。合法的常量名以字母或下划线开始,后面跟着任何字母,数字或下划线。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php

// 合法的常量名
define("FOO", "something");
define("FOO2", "something else");
define("FOO_BAR", "something more");

// 非法的常量名
define("2FOO", "something");

// 下面的定义是合法的,但应该避免这样做:(自定义常量不要以__开头)
// 也许将来有一天PHP会定义一个__FOO__的魔术常量
// 这样就会与你的代码相冲突
define("__FOO__", "something");

常量的范围是全局的。不用管作用区域就可以在脚本的任何地方访问常量。

变量

PHP 中的变量用一个美元符号后面跟变量名来表示。变量名是区分大小写的。

变量名与 PHP 中其它的标签一样遵循相同的规则。一个有效的变量名由字母或者下划线开头,后面跟上任意数量的字母,数字,或者下划线。

1
2
3
4
5
6
7
8
<?php
$var = 'Bob';
$Var = 'Joe';
echo "$var, $Var"; // 输出 "Bob, Joe"

$4site = 'not yet'; // 非法变量名;以数字开头
$_4site = 'not yet'; // 合法变量名;以下划线开头
$i站点is = 'mansikka'; // 合法变量名;可以用中文

变量默认总是传值赋值。那也就是说,当将一个表达式的值赋予一个变量时,整个原始表达式的值被赋值到目标变量。

PHP 也提供了另外一种方式给变量赋值:引用赋值。这意味着新的变量简单的引用(换言之,“成为其别名” 或者 “指向”)了原始变量。改动新的变量将影响到原始变量,反之亦然。

使用引用赋值,简单地将一个 & 符号加到将要赋值的变量前(源变量)。例如,下列代码片断将输出“My name is Bob”两次:

1
2
3
4
5
6
<?php
$foo = 'Bob'; // 将 'Bob' 赋给 $foo
$bar = &$foo; // 通过 $bar 引用 $foo
$bar = "My name is $bar"; // 修改 $bar 变量
echo $bar;
echo $foo; // $foo 的值也被修改

有一点重要事项必须指出,那就是只有有名字的变量才可以引用赋值。

类型

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

四种标量类型:

  • boolean(布尔型)
  • integer(整型)
  • float(浮点型,也称作 double)
  • string(字符串)

三种复合类型:

  • array(数组)
  • object(对象)
  • callable(可调用)

两种特殊类型:

  • resource(资源)
  • NULL(无类型)

Boolean 布尔类型

这是最简单的类型。boolean 表达了真值,可以为 TRUE 或 FALSE。

要指定一个布尔值,使用常量 TRUE 或 FALSE。两个都不区分大小写。

1
2
<?php
$foo = True; // 设置 $foo 为 TRUE

Integer 整型

integer 是集合 ℤ = {…, -2, -1, 0, 1, 2, …} 中的某个数。

整型值可以使用十进制,十六进制,八进制或二进制表示,前面可以加上可选的符号(- 或者 +)。

1
2
3
4
5
6
<?php
$a = 1234; // 十进制数
$a = -123; // 负数
$a = 0123; // 八进制数 (等于十进制 83)
$a = 0x1A; // 十六进制数 (等于十进制 26)
$a = 0b11111111; // 二进制数字 (等于十进制 255)

Float 浮点型

浮点型(也叫浮点数 float,双精度数 double 或实数 real)可以用以下任一语法定义:

1
2
3
4
<?php
$a = 1.234;
$b = 1.2e3;
$c = 7E-10;

String 字符串

一个字符串 string 就是由一系列的字符组成,其中每个字符等同于一个字节。

单引号

定义一个字符串的最简单的方法是用单引号把它包围起来(字符 ‘)。

1
2
<?php
echo 'this is a simple string';

双引号

如果字符串是包围在双引号(”)中, PHP 将对一些特殊的字符进行解析,如 \n 换行,\t 水平制表符等。另外最重要的特征是变量会被解析。

Heredoc 结构

第三种表达字符串的方法是用 heredoc 句法结构:<<<

1
2
3
4
5
6
<?php
$str = <<<EOD
Example of string
spanning multiple lines
using heredoc syntax.
EOD;

Array 数组

PHP 中的数组实际上是一个有序映射。映射是一种把 values 关联到 keys 的类型。此类型在很多方面做了优化,因此可以把它当成真正的数组,或列表(向量),散列表(是映射的一种实现),字典,集合,栈,队列以及更多可能性。

1
2
3
4
5
6
7
8
9
10
11
<?php
$array = array(
"foo" => "bar",
"bar" => "foo",
);

// 自 PHP 5.4 起
$array = [
"foo" => "bar",
"bar" => "foo",
];

key 可以是 integer 或者 string。value 可以是任意类型。可以不指定键名,或者对某些单元指定键名。

数组单元可以通过 array[key] 语法来访问。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
$array = array(
"foo" => "bar",
42 => 24,
"multi" => array(
"dimensional" => array(
"array" => "foo"
)
)
);

var_dump($array["foo"]);
var_dump($array[42]);
var_dump($array["multi"]["dimensional"]["array"]);

Object 对象

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

1
2
3
4
5
6
7
8
9
10
11
<?php
class foo
{
function do_foo()
{
echo "Doing foo.";
}
}

$bar = new foo;
$bar->do_foo();

接下来我们将看见如何使用变量与常量。你需要保存以下案例并尝试运行程序。

如何编写 PHP 程序

从今以后,保存和运行 PHP 程序的标准步骤如下:

对于 PhpStorm 用户

  1. 打开 PhpStorm。
  2. 以给定的文件名创建新文件。
  3. 输入案例中给出的代码。
  4. 右键并运行当前文件。

对于其他编辑器用户

  1. 打开你选择的编辑器。
  2. 输入案例中给出的代码。
  3. 以给定的文件名将其保存成文件。
  4. 在解释器中通过命令 php program.php 来运行程序。

案例:使用变量与常量

输入并运行以下程序:

1
2
3
4
5
6
7
8
9
10
11
12
<?php
# 文件名:var.py
$i = 5;
echo $i . "\n";
$i = $i + 1;
print $i . "\n";

$s = <<<EOT
This is a multi-line string.
This is the second line.
EOT;
print $s;

输出:

1
2
3
4
5
6
This is a multi-line string.
This is the second line.

它是如何工作的

下面是这一程序的工作原理。首先,我们使用赋值运算符(=)将常量数值 5 赋值给变量 $i。这一行被称之为声明语句(Statement)因为其工作正是声明一些在这一情况下应当完成的事情:我们将变量名 $i 与值 5 相连接。然后,我们通过 echo 语句来打印变量 $i 所声明的内容,这并不奇怪,只是将变量的值打印到屏幕上。这里我们同时打印了 \n 是为了换行。

接着,我们将 1 加到 $i 变量所存储的值中,并将得出的结果重新存储进这一变量。然后我们将这一变量打印出来,并期望得到的值应为 6

类似地,我们将文本赋值给变量 $s,并将其打印出来。

针对静态编程语言程序员的提示

变量只需被赋予某一值。不需要声明或定义数据类型。

逻辑行与物理行

所谓物理行(Physical Line)是你在编写程序时你所看到的内容。所谓逻辑行(Logical Line)是 PHP 所看到 的单个语句。PHP 以 ; 作为不同逻辑行的结束与分隔。

PHP 鼓励每一行使用一句独立语句从而使得代码更加可读。

如果你有一行非常长的代码,你可以通过使用反斜杠将其拆分成多个物理行。

1
2
3
$s = 'This is a string. \
This continues the string.';
echo $s;

输出:

1
This is a string. This continues the string.

缩进

空白区在各行的开头,这被称作缩进(Indentation)。在逻辑行的开头留下空白区(使用空格或制表符)用以确定各逻辑行的缩进级别,而后者又可用于确定语句的分组。

这意味着放置在一起的语句拥有相同的缩进。每一组这样的语句被称为块(block)

如何缩进

使用四个空格来缩进。好的编辑器会自动为你完成这一工作。请确保你在缩进中使用数量一致的空格。

总结

现在我们已经了解了诸多本质性的细节,我们可以前去了解控制流语句等更多更加有趣的东西。记得一定要充分理解你在本章所阅读的内容。