AI 摘要

本文系统梳理 PHP 语法基础:从标准/短标记、注释与输出语句入手,详解变量传值与引用赋值、可变变量、常量、预定义常量及表达式;完整介绍标量、复合、特殊三大类型,字符串单双引号、heredoc/nowdoc 差异,is_xxx 检测、自动与强制类型转换;覆盖算术、比较、三元、逻辑、位运算等运算符及 if、switch、while、for、替代语法流程控制;最后说明 include/require 与 *_once 文件包含机制,为后续开发奠定扎实语法根基。

基本语法

PHP 标记

PHP 代码可以嵌入 HTML 中使用,为了区分 PHP 代码和 HTML 代码,需要使用 PHP 标记对 PHP 代码进行标识,PHP 的标记分为标准标记和短标记。

PHP 标记的基本用法:

<?php 代码块 ?>
<? 代码块 ?>    // 不推荐使用,需要在php.ini中启用short_open_tag
<?= 输出内容 ?>

示例:PHP 标记

入口页面(index.php):

<h1><?php echo "Hello PHP!" ?></h1>
<h1><?= "Hello PHP!" ?></h1>

示例效果:


在 PHP 标记后面,如果没有除 PHP 以外的其他代码,标记末尾的 ?> 符号可以省略。

注释

在 PHP 开发中,为了方便开发人员阅读和维护代码,可以添加注释对代码进行解释说明。

单行注释的基本用法:

// ...
# ...

多行注释的基本用法:

/*
    ....
*/

输出语句

PHP 提供了一系列的输出语句,常用的输出语句有 echo、print、print_r、var_dump 等。

echo 输出语句用于输出字符串,如果输出其他类型的数据,会自动转换成字符串。

echo 输出语句的基本用法:

echo "...";
echo "...", "...";

print 输出语句与 echo 输出语句类似,但 print 输出语句只能输出一个数据。

print 输出语句的基本用法:

print "...";

print_r 输出语句可以输出任意类型的数据,如字符串、数组等。

print_r 输出语句的基本用法:

print_r("...");

var_dump 输出语句不仅可以输出一个或多个任意类型的数据,还可以获取数据的类型和元素值。

var_dump 输出语句的基本用法:

var_dump("...");
var_dump("...", "...");

示例:输出语句

入口页面(index.php):

<?php
echo "Hello echo<br>";

print "Hello print<br>";

print_r("Hello print_r<br>");

var_dump("Hello var_dump")

示例效果:


标识符

定义标识符(如变量名、函数名、类名、方法名等)需要遵循一定的规则:

  • 标识符只能由字母、数字、下划线以及 0x80-0xff 范围内(十六进制数值范围)的字符组成。
  • 标识符不能以数字开头。
  • 标识符用作变量名时,区分大小写。

关键字

在使用关键字时,需要注意关键字不能作为常量、函数名或类名使用。

随着 PHP 版本的更新,关键字也在不断变化,可以通过查阅 PHP 官方手册来获取最新的关键字列表。

变量、常量和表达式

变量

PHP 是弱类型语言,变量不需要实现声明,就可以直接进行赋值使用。

PHP 变量赋值分为传值赋值和引用赋值。

传值赋值是将等号右边的数据赋值给左边的变量。

传值赋值的基本用法:

$变量名 = 变量值;

示例:传值赋值

入口页面(index.php):

<?php
$userName = "多仔";
$age = 18;

echo "姓名:".$userName;   // 使用.号拼接字符串
echo "<br>";
echo "年龄:".$age;

示例效果:


引用赋值时,如果其中的一个变量的值发生改变,则另一个变量的值也会发生改变。

引用赋值的基本用法:

$变量名 = &$要引用的变量名;

示例:引用赋值

入口页面(index.php):

<?php
$userName = "多仔";
$age = 18;

echo "姓名:".$userName;
echo "<br>";
echo "年龄:".$age;
echo "<br>";

// 引用赋值
$newAge = &$age;

// 修改变量$age的值
$age = 81;

// 变量$newAge的值随着变量$age的改变而改变
echo "年龄:".$newAge;

示例效果:


可变变量

PHP 提供了可变变量,可以在开发时动态地改变一个变量的名称,将另一个变量的值作为该变量的名称。

在使用可变变量时,变量的值要符合标识符规则,避免出现非法变量名的情况。

可变变量的基本用法:

$变量名 = $$变量名;

示例:可变变量

入口页面(index.php):

<?php
$userName = "多仔";
$age = 18;

$variableName = "userName";

// 相当于输出$userName
echo "姓名:".$$variableName;

示例效果:


常量

在 PHP 中,常量的值始终保持不变,常量一旦被定义就不能被修改或重新定义。

常量的命名遵循标识符的命名规则,习惯上总是使用大写字母定义常量名称。

在 PHP 中定义常量,可以使用 define 函数或 const 关键字。

define 函数的基本用法:

define(常量名, 常量值);

const 关键字的基本用法:

const 常量名 = 常量值;

示例:常量

入口页面(index.php):

<?php
define("HOST", "localhost");
define("PORT", "3306");

const USER = "root";
const PASSWORD = "root";

echo "HOST=", HOST, "<br>";
echo "PORT=", PORT, "<br>";
echo "USER=", USER, "<br>";
echo "PASSWORD=", PASSWORD, "<br>";

示例效果:


预定义常量

PHP 提供了预先定义好的常量来获取 PHP 中的信息。

PHP 中的基本预定义常量:

名称描述
FILE获取 PHP 文件的完整路径
LINE获取 PHP 文件中当前代码的行号
PHP_VERSION获取 PHP 的版本信息
PHP_OS获取当前 PHP 环境的操作系统类型
PHP_INT_MAX获取当前 PHP 环境中整型数的最大值
PHP_INT_SIZE获取 PHP 中整型数的字长
TRUE该常量是一个真值(true)
FALSE该常量是一个假值(false)
NULL该常量是一个空值(null)
E_ERROR表示运行时的致命性错误,值为 1
E_WARNING表示运行时的警告错误,值为 2
E_PARSE表示编译时的解析错误,值为 4
E_NOTICE表示编译时的题型信息,值为 8

示例:预定义常量

入口页面(index.php):

<?php
echo "PHP版本号:", PHP_VERSION, "<br>";
echo "PHP文件路径:", __FILE__, "<br>";

示例效果:


表达式

表达式是 PHP 中非常重要的基石,任何有值的内容都可以理解为表达式。

PHP 的基本表达式:

<?php
$a = 1;
echo $a + 1;
$a = $a + 4;
echo $a + $b;
echo PHP_VERSION;

数据类型

常用数据类型

PHP 支持 3 类数据类型,8 种数据类型。

名称
描述
标量类型bool布尔型值为 true/false,且不分大小写
int整型可用八进制、十进制、十六进制表示
在不同位数的操作系统中,取值范围不一样
当定义的整型数值大于系统的整型数所能表示的最大范围时,将会被自动转换为浮点数
float浮点型可用标准格式和科学计数法表示
string字符串型可用单引号、双引号、heredoc、nowdoc 表示
复合类型array数组支持单维和多维数组
object对象可以用来表示具体的实体或抽象的概念
特殊类型resource资源用于表示对外部资源的引用
外部资源可以是文件、图像、数据库连接等
NULL空值表示一个变量没有被赋予任何值

字符串数据类型

字符串是由连续的字母、数字或字符组成的字符序列。

在 PHP 中,可以使用单引号、双引号表示字符串。

  • 单引号字符串中的变量不会被解析。
  • 双引号字符串中的变量会被解析。

示例:字符串数据类型

入口页面(index.php):

<?php
$number = 100;

echo '$number=', $number;
echo '<br>';
echo "$number=", $number;

示例效果:


当双引号字符串中包含变量时,可能会出现变量与字符串混淆的问题。

为了让 PHP 识别变量,可以使用 {} 符号将变量包裹起来,{} 符号中的内容会被识别成具体的变量。


示例:使用 {} 识别变量

入口页面(index.php):

<?php
$ap = "test";

// 将$ap识别成一个变量
echo "{$ap}ple";

示例效果:


heredoc 和 nowdoc

在 PHP 中,heredoc 和 nowdoc 是两种特殊的字符串表示方式。

  • heredoc 允许在其中进行变量解析和使用特殊字符。
  • heredoc 中,位于开始标记和结束标记之间的变量可以被正常解析,变量不需要用连接符来拼接。
  • nowdoc 类似于 heredoc ,但它不会解析变量和特殊字符。
  • nowdoc 定义的变量不会被解析,会被原样输出。

使用 heredoc 定义字符串数据的基本用法:

>>>EOD
// ...
EOD;

使用 nowdoc 定义字符串数据的基本用法:

>>>'EOD'
// ...
EOD;

在使用 heredoc 和 nowdoc 时,需要注意:

  • 开始标记和结束标记使用相同的字符串,通常以大写字母来写。
  • 开始标记后不能出现空格或多余的字符。
  • 结束标记必须顶头写,不能有缩进和空格,且在结束标记末尾要有分号。

heredoc 和 nowdoc 在处理大段的文本内容时非常有用,能使代码更加清晰易读。


示例:heredoc 和 nowdoc

入口页面(index.php):

<?php
$name = "PHP";

$heredoc = <<<EOD
    <div>
        <h3>$name 是世界上最好的语言</h3>
    </div>
EOD;
echo $heredoc;

$nowdoc = <<<'EOD'
    <div>
        <h3>$name 是世界上最好的语言</h3>
    </div>
EOD;
echo $nowdoc;

示例效果:


数据类型检测

为了检测数据类型是否符合预期,PHP 提供了一组 is_xxx 形式的内置函数用于检测数据类型。

数据类型检测的基本函数:

名称描述
is_bool($var)是否是布尔型
is_string($var)是否是字符串型
is_float($var)是否是浮点型
is_int($var)是否是整型
is_null($var)是否是空值
is_array($var)是否是数组
is_resource($var)是否是资源型
is_object($var)
是否是对象型
is_numeric($var)是否为数字或由数字组成的字符串

示例:数据类型检测

入口页面(index.php):

<?php
var_dump(is_bool("1"));
echo "<br>";

var_dump(is_numeric("1"));
echo "<br>";

var_dump(is_string("1"));

示例效果:


自动数据类型转换

自动数据类型转换是指当参数与运算的两个数据类型不同时,PHP 会自动转换成相同的类型再进行运算。

自动转换成布尔型时:

  • 整型 0、浮点型 0、空字符串、字符串 0 转换成布尔型时,都会被转换成 false。
  • 其他数据转换成布尔型时,都会被转换成 true。

示例:自动转换成布尔型

入口页面(index.php):

<?php
var_dump(0 == false);
echo "<br>";

var_dump(0.0 == false);
echo "<br>";

var_dump('' == false);
echo "<br>";

var_dump("0" == false);

示例效果:


自动转换成整型时:

  • 当浮点型数据转换成整型时,将直接对浮点数向下取整。
  • 当布尔型数据转换成整型时,true 会被转换成整型 1,false 会被转换成整型 0。
  • 在 PHP 8 以前,当字符串型数据转换成整型时,若字符串以数字开始,则使用该数字,否则转换为 0。
  • 自 PHP 8 起,如果无法解释运算符前后的其中一个运算对象,则会抛出 TypeError。

示例:自动转换成整型

入口页面(index.php):

<?php
var_dump(true + 1);
echo "<br>";

var_dump(false + 1);
echo "<br>";

var_dump("101PHP" + 1);
echo "<br>";

var_dump("PHP101" + 1);

示例效果:


自动转换成字符串型时:

  • 当布尔值数据转换成字符串型时,true 会被转换成字符串型 1,false 会被转换成空字符串。
  • 当整型或浮点型数据转换成字符串型时,直接将数字转换成字符串形式。

示例:自动转换成字符串型

入口页面(index.php):

<?php
var_dump("true => " . true);
echo "<br>";

var_dump("false => " . false);
echo "<br>";

var_dump(101 . "PHP");
echo "<br>";

var_dump(3.14 . "PHP");

示例效果:


强制数据类型转换

强制数据类型转换是将某个数据或变量转换成想要的数据类型。

强制数据类型转换的基本用法:

(目标数据类型) 变量或数据

示例:强制数据类型转换

入口页面(index.php):

<?php
var_dump((boolean) -1);
echo "<br>";

var_dump((integer) "hello");
echo "<br>";

var_dump((float)false);
echo "<br>";

var_dump((string)101);

示例效果:


数据类型转换函数

PHP 提供了一系列数据类型转换函数,用于获取变量或数据的指定类型的值。

数据类型转换的基本函数:

名称描述
strval($var)获取字符串型的值
intval($var)获取整型的值
floatval($var)获取浮点型的值
boolval($var)获取布尔型的值

示例:数据类型转换

入口页面(index.php):

<?php
var_dump(strval(false));
echo "<br>";

var_dump(intval("101"));
echo "<br>";

var_dump(floatval("0"));
echo "<br>";

var_dump(boolval("1"));

示例效果:


运算符

算数运算符

PHP 的基本算数运算符:

运算符描述运算符作用
+-
*/
%取模**幂运算

赋值运算符

PHP 的基本赋值运算符:

运算符描述运算符描述
=赋值+=加并赋值
-=减并赋值*=乘并赋值
/=除并赋值%取模并赋值
.=连接并赋值**=幂运算并赋值

比较运算符

PHP 的基本比较运算符:

运算符描述运算符描述
==等于!=不等于
<>不等于===全等
!==不全等>大于
>=大于等于<小于
<=小于等于

使用 PHP 的比较运算符时需要注意:

  • 对数据类型不相同对两个数据进行比较时,PHP 会自动将其转换成类型相同的数据再进行比较。
  • === 和 !== 运算符在进行比较时,不仅要比较数值是否相等,还要比较数据类型是否相同。
  • == 和 != 运算符在进行比较时,只比较数值是否相等。

三元运算符

三元运算符即三目运算符,用于实现简单的条件判断,根据条件表达式的结果执行不同的表达式。

三元运算符的基本用法:

条件表达式 ? 条件表达式成立时执行 : 条件表达式不成立时执行

逻辑运算符

PHP 的基本逻辑运算符:

运算符描述运算符描述
&&
!xor异或
andor

递增/递减运算符

PHP 基本的递增/递减运算符:

运算符描述运算符描述
++递增--递减

使用 PHP 的递增/递减运算符时需要注意:

  • 递增/递减运算符只针对纯数字或字母(a-z、A-Z)进行运算。
  • 对于值为字母的变量,只支持递增操作。
  • 当操作数为布尔型类型的数据时,递增/递减操作对其值不产生影响。
  • 当操作数为 NULL 时,递增的结果为 1,递减不受影响。

字符串拼接运算符

PHP 提供了用于拼接两个字符串的运算符 . 符号。

当使用字符串拼接运算符拼接布尔型、整型、浮点型或 NULL 时,会被自动转换成字符串型。


示例:字符串拼接

入口页面(index.php):

<?php
echo "Hello"."PHP";

位运算符

PHP 中的位运算符用于对二进制位(0 和 1)进行操作。

PHP 的基本位运算符:

运算符
名称描述
&按位与如果两个二进制位都为 1,则该位的运算结果为 1,否则为 0
按位或如果二进制位上有一个值位 1,则该位的运算结果为 1,否则为 0
~按位非如果二进制位时 0,则取反值 1。 如果二进制位时 1,则取反值 0
^按位异或如果两个二进制位相同,则该位的运算结果为 0,否则为 1
<<左移将所有二进制位向左移动 1 位,右边的空位补 0,左边移走的部分舍去
>>右移将所有二进制位向右移动 1 位,左边的空位根据原数的符号补位 0 或 1,原数是负数就补 1,原数是正数就补 0

示例:位运算符

入口页面(index.php):

<?php
$m = 1; // 二进制为01
$n = 2; // 二进制为10

// 按位与
$mn_and = $m & $n;
echo "按位与结果:" . $mn_and . "<br>";

// 按位或
$mn_or = $m | $n;
echo "按位或结果:" . $mn_or . "<br>";

// 按位异或
$mn_xor = $m ^ $n;
echo "按位异或结果:" . $mn_xor . "<br>";

// 按位取反
$m_not = ~$m;
echo "按位取反结果:" . $m_not . "<br>";

$m = 3;
// 左移
$m_left_shift = $m << 1;
echo "左移结果:" . $m_left_shift . "<br>";

$m = 8;
// 右移
$m_right_shift = $m >> 2;
echo "右移结果:" . $m_right_shift . "<br>";

示例效果:


位运算可以用于优化一些特定的操作,例如在处理标志位、进行高效的位掩码操作或利用位移实现快速的乘除运算等场景中。

错误控制运算符

错误控制运算符用于在可能出现错误的表达式前使用,不会直接将错误显示给用户。

错误控制运算符的基本用法:

@表达式;

在 PHP8 中,错误控制运算符已经被弃用。

流程控制

分支结构

PHP 中的分支结构常用的有 if、if-else、if-elseif-else、switch-case。

if 语句的基本用法:

if(条件表达式) {
    // ...
}

if-else 语句的基本用法:

if(条件表达式) {
    // ...
} else {
    // ...
}

if-elseif-else 语句的基本用法:

if(条件表达式) {
    // ...
} elseif(条件表达式) {
    // ...
} else {
    // ...
}

switch-case 语句的基本用法:

switch(表达式) {
    case 值1:
        // ...
        break;
    case 值2:
        // ...
        break;
    // ...
    default:
        // ...
}

循环结构

PHP 中的循环结构常用的有 while、do-while、for。

while 语句的基本用法:

while(循环条件) {
    // ...
}

do-while 语句的基本用法:

do{
    // ...
} while(循环条件);

for 语句的基本用法:

for(初始化表达式; 循环条件; 操作表达式) {
    // ...
}

跳转语句

PHP 中的跳转语句常用的有 berak、continue。

  • break 语句在循环语句中用于终止、跳出循环。
  • continue 语句在循环语句中用于结束本次循环,开始下一轮循环。

流程控制代替语句

在 HTML 模板中嵌入 PHP 代码时,流程控制替代语句是一种可读性更好的语法。

流程控制语句和流程控制替代语句的比较:

流程控制语句流程控制替代语句
if(条件表达式) {
// ...
}
if(条件表达式):
// ...
endif;
switch(表达式) {
// ...
}
switch(表达式):
// ...
endswitch;
while(循环条件) {
// ...
}
while(循环条件):
// ...
endwhile;
for(初始化表达式; 循环条件; 操作表达式) {
// ...
}
for(初始化表达式; 循环条件; 操作表达式):
// ...
endfor;

示例:流程控制替代语句

入口页面(index.php):

<h3>10以内的偶数列表</h3>
<ul>
    <?php
    for ($i = 0; $i < 10; $i++) {
        if ($i % 2 == 0) {
            echo "<li>$i</li>";
        }
    }
    ?>
</ul>

<h3>10以内的偶数列表</h3>
<ul>
    <?php for ($i = 0; $i < 10; $i++): ?>
        <?php if($i % 2 == 0): ?>
            <li><?php echo $i ?></li>
        <?php endif; ?>
    <?php endfor; ?>
</ul>

示例效果:


文件包含语句

include 和 require

include 语句和 require 语句都可以引入一个外部文件。

  • include 语句和 require 的用法类似。
  • 当引入外部文件出现错误时,icnlude 语句会发出警告信息,程序继续执行。
  • 当引入外部文件出现错误时,require 语句会抛出致命错误,程序停止运行。

使用 include 语句引入公共代码的基本用法:

include '完整路径文件名';
include('完整路径文件名');

使用 require 语句引入公共代码的基本用法:

require '完整路径文件名';
require('完整路径文件名');

示例:include 和 require

工具类(util.php):

<?php
echo "这是工具类 util.php";

入口页面(index.php):

<?php
include './util.php';

echo "<br>Hello PHP";

示例效果:


include_once 和 require_once

include_once 语句和 require_once 语句也可以引入一个外部文件。

  • 使用 include_once 语句和 require_once 语句引入外部文件时,PHP 会检查该文件是否在程序中已经被引入。
  • 如果该已经被引入,则外部文件不会被再次引入,避免重复引入同一个文件。

示例:include_once 和 require_once

入口页面(index.php):

<?php
echo "<p>使用include引入util.php三次:</p>";
include './util.php';
echo "<br>";
include './util.php';
echo "<br>";
include './util.php';
echo "<br>";

echo "<p>使用include_once引入util.php三次:</p>";
// 上文已经引入util.php,此处不再重复引入
include_once './util.php';
echo "<br>";
include_once './util.php';
echo "<br>";
include_once './util.php';

示例效果: