ZetCode

PHP 字符串插值

最后修改时间:2025 年 4 月 16 日

PHP 字符串插值允许将变量直接嵌入到字符串字面量中。它提供了一种方便的方式来组合变量和静态文本。PHP 提供了几种用于字符串插值的语法选项。

插值在单引号和双引号字符串中的行为不同。复杂的表达式和数组/对象访问也可以使用特定的语法进行插值。适当的插值使代码更清晰、更易读。

基本定义

字符串插值是在字符串字面量中评估变量的过程。在 PHP 中,双引号字符串和 heredoc 语法支持插值。单引号字符串将所有内容都视为字面量。

最简单的形式是直接变量嵌入:"Hello $name"。对于复杂的表达式,使用花括号:"总计:{$price * $qty}"。数组/对象访问需要使用花括号以确保清晰度。

插值发生在运行时,当字符串被求值时。它比连接更易读,但具有相似的性能特征。根据上下文和清晰度需求选择语法。

简单变量插值

此示例显示了双引号字符串中的基本变量插值。

simple_interpolation.php
<?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 演示了单引号,其中变量按字面意思出现。双引号是插值的必要条件。

使用花括号的复杂表达式

此示例演示了如何使用花括号进行复杂表达式。

complex_interpolation.php
<?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}";

花括号允许在字符串中嵌入复杂的表达式,但对于计算,建议在字符串之外执行它们以确保兼容性和可读性。然后可以将最终值有效地插值到字符串中。

数组和对象插值

此示例演示了如何插值数组元素和对象属性。

array_object_interpolation.php
<?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 语法支持插值,并且对于多行字符串很有用。

heredoc_interpolation.php
<?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 对于双引号一样 - 没有插值。

nowdoc_example.php
<?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。它适用于代码示例或模板。

使用函数调用的插值

此示例演示了插值函数返回值。

function_interpolation.php
<?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);

可以通过首先分配给变量或使用复杂的语法来插值函数调用。插值中不支持直接函数调用。为了清晰起见,通常最好在创建字符串之前计算值。

特殊字符转义

此示例显示了在插值字符串中转义特殊字符。

escaping_interpolation.php
<?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 这样的特殊序列在双引号中有效。当美元符号不用于插值时,需要进行转义。

插值中的可变变量

此高级示例显示了在字符串中使用可变变量。

variable_variables.php
<?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 字符串插值,展示了从基本到高级的技术。适当的插值使字符串处理更清晰,更易于维护。

作者

我叫 Jan Bodnar,是一位充满激情的程序员,拥有丰富的编程经验。自 2007 年以来,我一直在撰写编程文章。迄今为止,我撰写了超过 1,400 篇文章和 8 本电子书。我拥有超过十年的编程教学经验。

列出 所有 PHP 教程