PHP 字符串插值
最后修改时间:2025 年 4 月 16 日
PHP 字符串插值允许将变量直接嵌入到字符串字面量中。它提供了一种方便的方式来组合变量和静态文本。PHP 提供了几种用于字符串插值的语法选项。
插值在单引号和双引号字符串中的行为不同。复杂的表达式和数组/对象访问也可以使用特定的语法进行插值。适当的插值使代码更清晰、更易读。
基本定义
字符串插值是在字符串字面量中评估变量的过程。在 PHP 中,双引号字符串和 heredoc 语法支持插值。单引号字符串将所有内容都视为字面量。
最简单的形式是直接变量嵌入:"Hello $name"。对于复杂的表达式,使用花括号:"总计:{$price * $qty}"。数组/对象访问需要使用花括号以确保清晰度。
插值发生在运行时,当字符串被求值时。它比连接更易读,但具有相似的性能特征。根据上下文和清晰度需求选择语法。
简单变量插值
此示例显示了双引号字符串中的基本变量插值。
<?php declare(strict_types=1); $name = "Alice"; $age = 25; echo "Hello $name, you are $age years old.\n"; // Single quotes don't interpolate echo 'Hello $name, you are $age years old.';
第一个 echo 显示了双引号中的插值成功。变量被替换为它们的值。第二个 echo 演示了单引号,其中变量按字面意思出现。双引号是插值的必要条件。
使用花括号的复杂表达式
此示例演示了如何使用花括号进行复杂表达式。
<?php
declare(strict_types=1);
$price = 19.99;
$quantity = 3;
// Calculate the total outside the string.
$total = $price * $quantity;
echo "Total: {$total}\n";
$taxRate = 0.08;
// Calculate the total with tax outside the string.
$totalWithTax = $total * (1 + $taxRate);
echo "Total with tax: {$totalWithTax}";
花括号允许在字符串中嵌入复杂的表达式,但对于计算,建议在字符串之外执行它们以确保兼容性和可读性。然后可以将最终值有效地插值到字符串中。
数组和对象插值
此示例演示了如何插值数组元素和对象属性。
<?php
declare(strict_types=1);
$user = [
'name' => 'Bob',
'age' => 30,
'address' => [
'city' => 'New York',
'zip' => '10001'
]
];
echo "User: {$user['name']}, Age: {$user['age']}\n";
echo "City: {$user['address']['city']}, ZIP: {$user['address']['zip']}\n";
class Product {
public string $name = "Laptop";
public float $price = 999.99;
}
$product = new Product();
echo "Product: {$product->name}, Price: \${$product->price}";
数组元素需要使用花括号,并在键周围加上引号。多维数组可以使用嵌套语法。对象属性在花括号内使用箭头符号。在字符串中访问复杂变量时,始终使用花括号。
Heredoc 字符串插值
Heredoc 语法支持插值,并且对于多行字符串很有用。
<?php
declare(strict_types=1);
$title = "PHP Tutorial";
$author = "Jane Doe";
$version = 8.2;
echo <<<DOC
<h1>$title</h1>
<div class="meta">
Author: $author<br>
Version: $version
</div>
DOC;
Heredoc 字符串 (<<<DOC) 的行为类似于双引号字符串,用于插值。它们保留换行符和格式。结束标识符必须单独位于其自身的行首。Heredoc 非常适合 HTML 模板或 SQL 查询。
Nowdoc 语法(非插值)
Nowdoc 对于单引号就像 heredoc 对于双引号一样 - 没有插值。
<?php
declare(strict_types=1);
$language = "PHP";
$template = <<<'TEMPLATE'
<div class="header">
Welcome to our $language tutorial.
<!-- $language won't be interpolated -->
</div>
TEMPLATE;
echo $template;
Nowdoc 在起始标识符周围使用单引号。它像单引号一样,将所有内容视为字面量。当您需要多行字符串而不需要变量替换时,请使用 nowdoc。它适用于代码示例或模板。
使用函数调用的插值
此示例演示了插值函数返回值。
<?php
declare(strict_types=1);
function getDiscount(): float {
return 15.0; // 15% discount
}
$price = 89.99;
echo "Price: \${$price}, After discount: \$" . $price * (1 - getDiscount()/100);
可以通过首先分配给变量或使用复杂的语法来插值函数调用。插值中不支持直接函数调用。为了清晰起见,通常最好在创建字符串之前计算值。
特殊字符转义
此示例显示了在插值字符串中转义特殊字符。
<?php
declare(strict_types=1);
$name = "O'Reilly";
echo "Hello \"$name\", how's your day?\n";
$path = "C:\\xampp\\htdocs";
echo "Path: $path\n";
$price = 19.99;
echo "Price: \$$price\n";
echo "Unicode: \u{1F60A}"; // Smiley face emoji
字符串中的双引号需要使用反斜杠进行转义。反斜杠本身也必须转义。像 \n、\t 和 Unicode 这样的特殊序列在双引号中有效。当美元符号不用于插值时,需要进行转义。
插值中的可变变量
此高级示例显示了在字符串中使用可变变量。
<?php
declare(strict_types=1);
$varName = "status";
$$varName = "active"; // Creates $status variable
// Use {${expr}} syntax to fix deprecation warning
echo "Current status: {${$varName}}\n";
$userData = [
'name' => 'admin',
'role' => 'administrator'
];
$field = 'name';
// Access array elements remains unchanged
echo "Username: {$userData[$field]}";
可变变量需要花括号进行插值。更新后的语法 {${expr}} 确保与 PHP 8.2 及以上版本的兼容性。这种方法避免了弃用警告,同时保持了动态变量访问。谨慎使用此技术以确保代码清晰度。
来源
本教程通过示例介绍了 PHP 字符串插值,展示了从基本到高级的技术。适当的插值使字符串处理更清晰,更易于维护。
作者
列出 所有 PHP 教程。