跳到主要内容

PHP 基础语法

本章将介绍 PHP 的基础语法,包括变量、数据类型、运算符等核心概念。

PHP 标记

PHP 代码需要放在特定的标记内,服务器才能识别并执行。

标准标记(推荐)

<?php
// PHP 代码
echo "Hello, World!";
?>

这是最通用的 PHP 标记方式,始终可用,推荐使用。

短标记

<? echo "Hello"; ?>
<?= "Hello" ?> <!-- 等价于 <?php echo "Hello" ?> -->

短标记需要在 php.ini 中启用 short_open_tag = On,不推荐在生产环境使用。

脚本标记(已弃用)

<script language="php">
echo "Hello";
</script>

这种标记方式在 PHP 7.0 后已移除,不要使用。

注释

注释用于解释代码,不会被执行。

<?php
// 单行注释 - 双斜杠

# 单行注释 - 井号(不推荐)

/*
* 多行注释
* 可以跨越多行
*/

/**
* 文档注释
* 用于生成 API 文档
* @param string $name 用户名
* @return string 问候语
*/
function greet($name) {
return "Hello, $name!";
}
?>

变量

变量用于存储数据。PHP 变量以 $ 符号开头,后面跟变量名。

创建变量

<?php
$name = "张三"; // 字符串
$age = 25; // 整数
$price = 19.99; // 浮点数
$is_active = true; // 布尔值
?>

变量命名规则

  1. 变量名必须以 $ 符号开头
  2. $ 后的第一个字符必须是字母或下划线
  3. 后续字符可以是字母、数字或下划线
  4. 变量名区分大小写
  5. 不能使用 PHP 保留字
<?php
// 合法的变量名
$name = "张三";
$_count = 10;
$user_name = "李四";
$userName = "王五";

// 非法的变量名(会报错)
// $1name = "错误"; // 不能以数字开头
// $user-name = "错误"; // 不能包含连字符
// $class = "错误"; // 不能使用保留字
?>

变量作用域

PHP 有四种变量作用域:

局部变量

在函数内部声明的变量,只能在函数内部访问。

<?php
function test() {
$local = "局部变量"; // 局部变量
echo $local;
}

test(); // 输出:局部变量
// echo $local; // 错误:无法访问
?>

全局变量

在函数外部声明的变量,函数内部需要使用 global 关键字访问。

<?php
$global = "全局变量";

function test() {
global $global; // 声明使用全局变量
echo $global;
}

test(); // 输出:全局变量
?>

也可以使用 $GLOBALS 数组:

<?php
$x = 10;
$y = 20;

function add() {
$GLOBALS['z'] = $GLOBALS['x'] + $GLOBALS['y'];
}

add();
echo $z; // 输出:30
?>

静态变量

使用 static 关键字声明,函数执行结束后不会被销毁。

<?php
function counter() {
static $count = 0; // 静态变量
$count++;
echo $count . "\n";
}

counter(); // 输出:1
counter(); // 输出:2
counter(); // 输出:3
?>

超全局变量

PHP 预定义的变量,在任何作用域都可访问:

<?php
// $_GET - GET 请求参数
// $_POST - POST 请求参数
// $_REQUEST - GET + POST + COOKIE
// $_SERVER - 服务器信息
// $_SESSION - 会话变量
// $_COOKIE - Cookie 变量
// $_FILES - 上传文件信息
// $_ENV - 环境变量

echo $_SERVER['PHP_SELF']; // 当前脚本路径
echo $_SERVER['HTTP_HOST']; // 当前主机名
?>

数据类型

PHP 支持多种数据类型,分为三大类:标量类型、复合类型和特殊类型。

标量类型

整数(int)

整数是没有小数部分的数。

<?php
$decimal = 42; // 十进制
$negative = -42; // 负数
$octal = 052; // 八进制(等于 42)
$hexadecimal = 0x2A; // 十六进制(等于 42)
$binary = 0b101010; // 二进制(等于 42)

// 整数溢出会转为浮点数
$large = 2147483648; // 32位系统上会转为浮点数

// 检查是否为整数
var_dump(is_int(42)); // bool(true)
var_dump(is_int(42.0)); // bool(false)
?>

浮点数(float)

浮点数是带有小数部分的数。

<?php
$price = 19.99;
$scientific = 1.5e3; // 科学计数法,等于 1500
$negative = -2.5;

// 浮点数精度问题
$a = 0.1 + 0.2;
var_dump($a == 0.3); // bool(false),精度问题

// 比较浮点数应使用 epsilon
$epsilon = 0.00001;
var_dump(abs($a - 0.3) < $epsilon); // bool(true)
?>

字符串(string)

字符串是一系列字符。

<?php
// 单引号字符串 - 不解析变量和转义字符(除 \' 和 \\)
$str1 = 'Hello\nWorld'; // 输出:Hello\nWorld

// 双引号字符串 - 解析变量和转义字符
$name = "张三";
$str2 = "Hello, $name"; // 输出:Hello, 张三
$str3 = "Hello\nWorld"; // 输出:Hello(换行)World

// Heredoc 语法 - 类似双引号
$str4 = <<<EOD
这是一个
多行字符串
你好,$name
EOD;

// Nowdoc 语法 - 类似单引号(PHP 5.3+)
$str5 = <<<'EOD'
这是一个
多行字符串
不解析变量 $name
EOD;
?>

布尔值(bool)

布尔值只有 truefalse 两个值(不区分大小写)。

<?php
$is_true = true; // 或 TRUE
$is_false = false; // 或 FALSE

// 以下值在布尔上下文中为 false
$a = (bool) false; // false
$b = (bool) 0; // false
$c = (bool) 0.0; // false
$d = (bool) ""; // false
$e = (bool) "0"; // false
$f = (bool) []; // false(空数组)
$g = (bool) null; // false
?>

复合类型

数组(array)

数组可以存储多个值。

<?php
// 索引数组
$colors = ["红", "绿", "蓝"];
$numbers = [1, 2, 3, 4, 5];

// 关联数组
$person = [
"name" => "张三",
"age" => 25,
"city" => "北京"
];

// 多维数组
$users = [
["name" => "张三", "age" => 25],
["name" => "李四", "age" => 30]
];

// 访问数组元素
echo $colors[0]; // 输出:红
echo $person["name"]; // 输出:张三
echo $users[1]["age"]; // 输出:30
?>

对象(object)

对象是类的实例。

<?php
class Person {
public $name;
public $age;

public function __construct($name, $age) {
$this->name = $name;
$this->age = $age;
}

public function greet() {
return "你好,我是" . $this->name;
}
}

$person = new Person("张三", 25);
echo $person->name; // 输出:张三
echo $person->greet(); // 输出:你好,我是张三
?>

特殊类型

NULL

null 表示变量没有值。

<?php
$var = null;

// 以下情况变量为 null
// 1. 被赋值为 null
// 2. 尚未被赋值
// 3. 被 unset()

$x; // null(未赋值)
$y = null; // null
$z = "hello";
unset($z); // $z 变为 null

var_dump(is_null($var)); // bool(true)
?>

资源(resource)

资源是对外部资源的引用,如数据库连接、文件句柄等。

<?php
// 文件资源
$file = fopen("test.txt", "r");

// 数据库连接资源
$conn = mysqli_connect("localhost", "user", "pass");

var_dump(is_resource($file)); // bool(true)
?>

类型转换

自动类型转换

PHP 会根据上下文自动转换类型。

<?php
// 字符串转数字
$a = "10" + 5; // 15(字符串 "10" 转为整数)
$b = "10.5" + 5; // 15.5(字符串 "10.5" 转为浮点数)

// 数字转字符串
$c = "数字:" . 10; // "数字:10"

// 布尔转换
$d = 1 && true; // true
$e = "" || false; // false
?>

强制类型转换

使用 (类型)类型val() 函数进行转换。

<?php
// 使用 (类型) 强制转换
$a = (int) "42"; // 42
$b = (float) "3.14"; // 3.14
$c = (string) 100; // "100"
$d = (bool) 1; // true
$e = (array) "hello"; // ["hello"]

// 使用函数转换
$f = intval("42"); // 42
$g = floatval("3.14"); // 3.14
$h = strval(100); // "100"
$i = boolval(1); // true
?>

类型检查函数

<?php
var_dump(is_int(42)); // bool(true)
var_dump(is_float(3.14)); // bool(true)
var_dump(is_string("hello")); // bool(true)
var_dump(is_bool(true)); // bool(true)
var_dump(is_array([1, 2])); // bool(true)
var_dump(is_object(new stdClass())); // bool(true)
var_dump(is_null(null)); // bool(true)
var_dump(is_numeric("42")); // bool(true)
var_dump(is_scalar(42)); // bool(true) - 标量类型检查
?>

常量

常量是值不可改变的标识符。

定义常量

<?php
// 使用 define() 函数
define("SITE_NAME", "我的网站");
define("MAX_SIZE", 1024);
define("IS_DEBUG", true);

// 使用 const 关键字(PHP 5.3+)
const VERSION = "1.0.0";
const PI = 3.14159;

// 访问常量
echo SITE_NAME; // 输出:我的网站
echo MAX_SIZE; // 输出:1024
echo VERSION; // 输出:1.0.0
?>

define() 与 const 的区别

<?php
// define() 可以在运行时定义
$name = "MY_CONST";
define($name, 100); // 可以使用变量作为名称

// const 必须在编译时确定
// const $name = 100; // 错误!

// define() 可以在条件语句中使用
if (true) {
define("CONDITIONAL_CONST", 1);
}

// const 不能在条件语句中使用
// if (true) {
// const WRONG = 1; // 错误!
// }
?>

魔术常量

PHP 提供了一些预定义的魔术常量:

<?php
echo __LINE__; // 当前行号
echo __FILE__; // 文件完整路径
echo __DIR__; // 文件所在目录
echo __FUNCTION__; // 函数名
echo __CLASS__; // 类名
echo __METHOD__; // 类方法名
echo __NAMESPACE__; // 命名空间名
?>

运算符

算术运算符

<?php
$a = 10;
$b = 3;

echo $a + $b; // 13 - 加法
echo $a - $b; // 7 - 减法
echo $a * $b; // 30 - 乘法
echo $a / $b; // 3.333... - 除法
echo $a % $b; // 1 - 取余
echo $a ** $b; // 1000 - 幂运算(PHP 5.6+)

// 整除运算符(PHP 7+)
echo intdiv(10, 3); // 3
?>

赋值运算符

<?php
$x = 10;

$x += 5; // $x = $x + 5 -> 15
$x -= 3; // $x = $x - 3 -> 12
$x *= 2; // $x = $x * 2 -> 24
$x /= 4; // $x = $x / 4 -> 6
$x %= 4; // $x = $x % 4 -> 2
$x **= 3; // $x = $x ** 3 -> 8

// 字符串连接赋值
$str = "Hello";
$str .= " World"; // "Hello World"

// null 合并赋值运算符(PHP 7+)
$name = null;
$name ??= "默认值"; // 如果 $name 为 null,赋值为 "默认值"
?>

比较运算符

<?php
// 松散比较(会进行类型转换)
var_dump(5 == "5"); // bool(true)
var_dump(5 != "5"); // bool(false)

// 严格比较(不进行类型转换)
var_dump(5 === "5"); // bool(false)
var_dump(5 !== "5"); // bool(true)

// 其他比较
var_dump(5 > 3); // bool(true)
var_dump(5 < 3); // bool(false)
var_dump(5 >= 5); // bool(true)
var_dump(5 <= 3); // bool(false)

// 太空船运算符(PHP 7+)
echo 1 <=> 1; // 0(相等)
echo 1 <=> 2; // -1(小于)
echo 2 <=> 1; // 1(大于)
?>

逻辑运算符

<?php
$a = true;
$b = false;

// 与运算
var_dump($a && $b); // bool(false)
var_dump($a and $b); // bool(false)(优先级较低)

// 或运算
var_dump($a || $b); // bool(true)
var_dump($a or $b); // bool(true)(优先级较低)

// 非运算
var_dump(!$a); // bool(false)

// 异或运算
var_dump($a xor $b); // bool(true)
?>

字符串运算符

<?php
// 连接运算符
$a = "Hello";
$b = "World";
echo $a . " " . $b; // "Hello World"

// 连接赋值运算符
$str = "Hello";
$str .= " World";
echo $str; // "Hello World"
?>

数组运算符

<?php
$a = ["a" => 1, "b" => 2];
$b = ["b" => 3, "c" => 4];

// 合并运算符(后者覆盖前者)
$c = $a + $b; // ["a" => 1, "b" => 2, "c" => 4]

// 比较运算符
var_dump($a == $b); // bool(false) - 值相同即可
var_dump($a === $b); // bool(false) - 值和顺序都相同
?>

三元运算符

<?php
$age = 20;

// 基本语法
$status = ($age >= 18) ? "成年" : "未成年";
echo $status; // 输出:成年

// 简写形式(PHP 5.3+)
$name = null;
echo $name ?: "匿名"; // 输出:匿名

// null 合并运算符(PHP 7+)
$name = $name ?? "匿名";
echo $name; // 输出:匿名
?>

运算符优先级

当表达式中包含多个运算符时,按照优先级顺序执行:

<?php
// 优先级从高到低(部分)
// ** 幂运算
// ++ -- 递增/递减
// ! 逻辑非
// * / % 乘除取余
// + - . 加减连接
// < > <= >= 比较
// == != === 相等比较
// && 逻辑与
// || 逻辑或
// ?: ?? 三元/null合并
// = += -= 赋值

// 使用括号明确优先级
$result = (2 + 3) * 4; // 20
$result = 2 + 3 * 4; // 14
?>

小结

本章我们学习了:

  1. PHP 标记和注释
  2. 变量的创建和作用域
  3. 各种数据类型(整数、浮点数、字符串、布尔值、数组、对象)
  4. 类型转换
  5. 常量的定义和使用
  6. 各种运算符

下一章我们将学习控制流语句。