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; // 布尔值
?>
变量命名规则
- 变量名必须以
$符号开头 $后的第一个字符必须是字母或下划线- 后续字符可以是字母、数字或下划线
- 变量名区分大小写
- 不能使用 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)
布尔值只有 true 和 false 两个值(不区分大小写)。
<?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
?>
小结
本章我们学习了:
- PHP 标记和注释
- 变量的创建和作用域
- 各种数据类型(整数、浮点数、字符串、布尔值、数组、对象)
- 类型转换
- 常量的定义和使用
- 各种运算符
下一章我们将学习控制流语句。