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 教程。