摘要訊息 : 學習 PHP 的基本語法和規範.

0. 前言

对于 PHP 的课堂, 和 Swift 课堂一样, 也是总共 10 个课时, 讲完 PHP 的基本语法, 中间会参杂一些比较高级的语法, 有能力者可以学习. PHP 课堂默认你有一定的计算机语言基础.

本文于 2022 年 3 月 17 日进行一次更新和修正. 修正之后本文已经归档, 不再享受更新.

1. PHP 标识符

因为 PHP 可以嵌入在 JavaScript、HTML 等语言中, 所以标识符就变得非常重要. 因为要让编译器知道, 这段代码不是 HTML 而是 PHP :

<?php
    // ...
?>

这种是最常用的标识符, 也推荐大家使用这一种 PHP 标识符, 结尾的 ?> 可以省略掉.

无标识符风格并不推荐大家使用, 因为没有明确标识具体的语言, 因此可能和其它程式设计语言发生冲突 :

<?
    // ...
?>

当然, 还有 Script 风格和 ASP 风格 :

<script language="php">
    // ...
</script>

<%
    // ...
%>

2. 编码规范

和 Swift 不同的是, PHP每一句结束都需要 ; 作为结尾, 告诉解释器结束这一句代码 :

<?php
    echo "Hello, PHP!";
?>

在一段 PHP 代码结束标记中, 隐含了一个分号, 所以 PHP 代码段中最后一行可以不需要分号 :

<?php echo "Hello, PHP!" ?>

PHP 提供了 3 种注释风格 :

  • // : 单行注释;
  • # : 单行注释, 这个是 Shell 风格的;
  • /* */ : 多行注释.

3. 常量

PHP 通过 define() 命令来定义一个常量 :

<?php
    define("常量名", 常量值);
?>

其中常量值可以是字符串. 在 PHP 7 中, 增加了可以通过 define() 命令来定义一个常量数组.

当然, PHP 中会有一些内置的常量 :

  • _FILE_ : 获得文件完整的路径和文件名;
  • _LINE_ : 获得 PHP 程序的行数;
  • PHP_VERSION : 获得 PHP 的版本;
  • PHP_OS : 获得 PHP 解析器的操作系统名称;
  • TRUE : 真;
  • FALSE : 假;
  • E_ERROR : 指到最近的错误处;
  • E_WARNING : 指到最近的警告处;
  • E_PARSE : 指到解析语法有潜在问题处;
  • E_NOTICE : 指到发生不寻常但不一定是错误处 (例如 : 存取一个不存在的变量);
  • _DIR_ : 获得文件所在的目录;
  • _FUNCTION_ : 函数的名称;
  • _CLASS_ : 类的名称.

4. 变量

不像 C++ 或者 Java, PHP 中的变量声明非常简单, 一般在变量名称前面加一个 $ 即可, 可以以大小写 "a-z"、"0-9"、"_". 但是变量不可以以 数字 开头, 并且其中也不允许存在非法字符. 这种命名方式最大的优势就在于可以命名已经保留的关键字, 例如 array, iffor 等等 :

<?php
    $array = array(1, 2, 3);
    print_r($array);
    /* 结果 :
        Array(
             [0] => 1
             [1] => 2
             [2] => 3
        )
    */
    $if = 6;
    echo $if;    // 结果 : 6
?>

在变量前面增加 & 符号就代表引用, 两个变量会指向内存中的一个存储空间 :

<?php
    $a = 1;
    $b = &$a;
    $b = 2;
    echo $a;    // 结果 : 2
?>

有一种特殊的变量叫作可变变量 :

<?php
    $a = "admin";
    $$a = "guest";
    echo $admin;
    echo "\n";
    echo $a;
    /* 结果 :
        guest
        admin
    */
?>

仔细解读这一段代码其实和变量的传递有点类似 : 首先创建了一个 $a 的变量, 之后再次 $$a 就相当于 $admin. 这相当于可以在 PHP 程式码运作的时候创建一个新的变数.

全局变量可以在函数之外任意位置都可以访问 :

<?php
    $a = 20;
    function show_a() {
        echo $a;
    }
    //show_a();    // 报错
    echo $a;    // 结果 : 20
?>

超全局变量的特点可以从名字去解读, 就是任何位置都可以访问到这个变量. PHP 内置的超全局变量有 :

  • $GLOBALS : 包含全局变量的数组;
  • $_GET : 包含所有通过 GET 方法传递变量的数组;
  • $_POST : 包含所有通过 POST 方法传递变量的数组;
  • $_FILES : 包含文件上传变量的数组;
  • $_COOKIE : 包含 Cookie 变量的数组;
  • $_SERVER : 包含服务器变量环境的数组;
  • $_ENV : 包含环境变量的数组;
  • $_REQUEST : 包含用户所有输入内容的数组 (包括了 $_GET, $_POST$_COOKIE);
  • $_SESSION : 包含了会话变量的数组;

如果想要在函数内访问函数外的变量, 可以通过 global 关键字或者 $GLOBALS 数组 :

<?php
    $a = 20;
    function show_a() {
        global $a;    // 等价于 $a = $GLOBALS["a"];
        echo $a;
    }
    show_a();
    echo "\n";
    echo $a;
    /* 结果 :
        20
        20
    */
?>

静态变量只有函数内可以访问, 它的初始化只在被第一次访问的时候, 它的状态会一直被保留到程式结束 :

<?php
    function print() {
        static $a = 0;
        ++$a;
        print($a);
    }
    print();
    echo "\n";
    print();
    /* 结果 :
        0
        1
    */
?>

PHP 中可以通过 unset() 函数来销毁垃圾变量.

5. 数据类型

  • 整数型 : Int;
  • 浮点型 : FloatDouble;
  • 字符串型 : String;
  • 数组型 : Array;
  • 对象型 : Object;
  • NULL 型;
  • 布尔型 : Bool,
    • 整数型 : 为 0 时, 布尔属性为 False; 非 0 时, 布尔属性为 True;
    • 浮点型 : 为 0.0 时, 布尔属性为 False; 非 0 时, 布尔属性为 True;
    • 字符串型 : 为 "" 或者 "0" 时, 布尔属性为 False; 否则, 布尔属性为 True;
    • 数组型 : 不含任何元素的数组, 布尔属性为 False; 否则, 布尔属性为 True;
    • NULL 型 : 布尔属性永远为 False;
  • 接口类 : Interfaces;
  • 资源 (Resource) 类型.

因为 PHP 语言为动态类型语言, 所以上述不再深入.

6. 数据类型转换

可以直接在变量前表明数据类型进行数据转换 :

<?php
    $a = 2.2;
    $a = (int)$a;
    echo $a;    // 结果 : 2
?>

PHP 内建的 settype 函数也可以用于数据转换. 它的回传值为 Bool 型别, 用于表明转换的成功和失败; 它接受两个参数, 第一个是要转换的变数, 第二个是要转换的类型, 第二个参数是一个字串 :

<?php
    $a = 2.2;
    $cast_result = settype($a, "int");
    echo $a;    // 结果 : 2
    echo $cast_result;    // 结果 : True
?>