PHP 符号参考手册:->、::、@ 等符号的含义是什么?

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

PHP 符号参考手册:从 -> 到 ... — 它们真正的含义是什么?

\n\n

您是否曾经看着别人的 PHP 代码,感觉自己像是在阅读古老的象形文字?箭头、冒号、奇怪的问号——这些都可能吓到甚至是有经验的开发者。实际上,每个符号背后都有一个简单而合乎逻辑的概念。

\n\n

我们为您准备了 完整的 PHP 符号参考手册,将“魔法符号”转化为易于理解的工具。本指南基于 Stack Overflow 上最热门的问题,并专门为 pythonlib.ru 的读者进行了改编。开始吧!

\n\n

1. 箭头 ->(对象访问运算符)

\n\n

面向对象 PHP 中最常见的“象形文字”。箭头表示 “获取此对象的属性或方法”。

\n\n
class Cat {\n    public $name = 'Murka';\n    public function meow() {\n        return 'Meow!';\n    }\n}\n\n$cat = new Cat();\necho $cat->name;   // Murka\necho $cat->meow(); // Meow!
\n\n

请记住:箭头左侧始终是对象 ($cat),右侧是其属性或方法(不带 $ 符号)。

\n\n

2. 双冒号 ::(作用域解析运算符)

\n\n

双冒号用于访问 静态 属性和方法、类常量,以及访问父类。

\n\n
class MathHelper {\n    const PI = 3.14;\n    public static function square($x) {\n        return $x * $x;\n    }\n}\n\necho MathHelper::PI;        // 3.14\necho MathHelper::square(5); // 25
\n\n

当您看到 :: 时,在心里将其替换为“静态”或“常量”。这是理解的关键。

\n\n

2.1 特殊情况:parent::

\n\n
class Animal {\n    protected function sound() {\n        return '...';\n    }\n}\n\nclass Dog extends Animal {\n    public function sound() {\n        return parent::sound() . ' Woof!';\n    }\n}
\n\n

3. @ 符号(错误抑制运算符)

\n\n

最具争议的符号之一。表达式前的 @ 抑制所有可能发生的错误。

\n\n
$result = @file_get_contents('http://example.com');\n// 如果网站不可用,不会显示错误
\n\n

重要提示:不要滥用 @!这会使调试变得复杂。仅在您 确实 预期错误并准备处理它时使用。

\n\n

4. ??(Null 合并运算符)

\n\n

在 PHP 7.0 中引入,并迅速成为开发者的最爱。它检查变量是否存在且不为 null。

\n\n
$username = $_GET['user'] ?? 'Guest';\n// 如果 $_GET['user'] 未设置,则赋值为 'Guest'\n\n// 旧方法:\n$username = isset($_GET['user']) ? $_GET['user'] : 'Guest';
\n\n

可以链式使用:$a ?? $b ?? $c — 将取第一个非 null 的值。

\n\n

5. ?->(Null 安全运算符)

\n\n

PHP 8.0 的新特性。允许“安全地”访问可能为 null 的对象的属性和方法。

\n\n
class User {\n    public function getAddress() {\n        return new Address();\n    }\n}\n\n// 如果用户未登录 — $user = null\n$city = $user?->getAddress()?->city;\n// 代替冗长的检查:\n// if ($user && $user->getAddress()) { ... }
\n\n

6. ...(展开运算符)

\n\n

三个点“展开”数组或可迭代对象。非常适合向函数传递参数或合并数组。

\n\n
function sum(...$numbers) {\n    return array_sum($numbers);\n}\n\necho sum(1, 2, 3, 4); // 10\n\n// 传递时展开数组:\n$nums = [1, 2, 3];\necho sum(...$nums); // 6\n\n// 合并数组:\n$arr1 = [1, 2];\n$arr2 = [3, 4];\n$merged = [...$arr1, ...$arr2]; // [1, 2, 3, 4]
\n\n

7. <=>(Sp

博客

书籍推荐