ZetCode

PHP 严格相等运算符

上次修改时间:2025 年 5 月 18 日

在本教程中,我们将深入探讨 PHP 中的严格相等运算符 (===),这是一个用于确保精确比较和防止意外类型转换的关键工具。

PHP 中的严格相等运算符 (===) 用于比较两个变量的值和数据类型。 只有当值和类型完全匹配时,它才返回 true。 这与宽松相等运算符 (==) 不同,后者允许类型转换——自动转换类型以找到匹配项,这通常会导致意外的结果。 通过强制执行严格比较,=== 有助于保持数据完整性并防止由隐式类型转换引起的隐藏错误。

理解严格相等和宽松相等之间的区别,对于处理用户输入验证、身份验证检查、数据库查询和条件逻辑至关重要。 使用 === 可确保可靠的比较,使您的代码更具可预测性和安全性。

基本比较

严格相等运算符要求值和类型都匹配。 这与仅在类型转换后比较值的宽松相等不同。

basic_comparison.php
<?php

declare(strict_types=1);

$num = 5;
$str = "5";

// Loose equality (value only)
var_dump($num == $str);

// Strict equality (value and type)
var_dump($num === $str);

// Comparing different types
var_dump(0 == false);
var_dump(0 === false);

// Comparing null
var_dump(null == "");
var_dump(null === "");

这演示了 === 如何比 == 更精确。 严格运算符捕获了宽松相等通过自动类型转换会忽略的类型差异。

λ php basic_comparison.php
bool(true)
bool(false)
bool(true)
bool(false)
bool(true)
bool(false)

比较不同类型

PHP 使用 == 的类型转换可能会导致令人惊讶的结果。 === 运算符通过要求完全类型匹配来帮助避免这些陷阱。

type_comparison.php
<?php

declare(strict_types=1);

// String vs integer
var_dump("42" == 42);
var_dump("42" === 42);

// Empty string vs false
var_dump("" == false);
var_dump("" === false);

// Zero vs false
var_dump(0 == false);
var_dump(0 === false);

// String zero vs false
var_dump("0" == false);
var_dump("0" === false);

// Null vs empty array
var_dump(null == []);
var_dump(null === []);

这些示例显示了 == 可能由于类型转换而给出意外 true 结果的常见情况,而 === 保持严格的类型检查。

λ php type_comparison.php
bool(true)
bool(false)
bool(true)
bool(false)
bool(true)
bool(false)
bool(true)
bool(false)
bool(true)
bool(false)

数组比较

比较数组时,=== 检查它们是否具有相同顺序且类型相同的键/值对。

array_comparison.php
<?php

declare(strict_types=1);

$arr1 = [1, 2, 3];
$arr2 = ["1", "2", "3"];
$arr3 = [1, 2, 3];

// Loose comparison
var_dump($arr1 == $arr2);
var_dump($arr1 == $arr3);

// Strict comparison
var_dump($arr1 === $arr2);
var_dump($arr1 === $arr3);

// Associative arrays
$assoc1 = ["id" => 1, "name" => "Alice"];
$assoc2 = ["id" => "1", "name" => "Alice"];
$assoc3 = ["name" => "Alice", "id" => 1];

var_dump($assoc1 == $assoc2);
var_dump($assoc1 === $assoc2);
var_dump($assoc1 === $assoc3);

对于数组,=== 要求所有值具有相同的类型,而 == 将执行类型转换。

// Associative arrays
$assoc1 = ["id" => 1, "name" => "Alice"];
$assoc2 = ["id" => "1", "name" => "Alice"];
$assoc3 = ["name" => "Alice", "id" => 1];

var_dump($assoc1 == $assoc2);
var_dump($assoc1 === $assoc2);
var_dump($assoc1 === $assoc3);

键的顺序对于使用 === 比较关联数组很重要。 $assoc1$assoc3 不相等,即使它们具有相同的键/值对。

λ php array_comparison.php
bool(true)
bool(true)
bool(false)
bool(true)
bool(true)
bool(false)
bool(false)

对象比较

比较对象时,=== 检查两个变量是否引用同一对象实例,而不仅仅是具有相同属性的对象。

object_comparison.php
<?php

declare(strict_types=1);

class User {
    public $name;

    public function __construct($name) {
        $this->name = $name;
    }
}

$user1 = new User("Alice");
$user2 = new User("Alice");
$user3 = $user1;

// Loose comparison (checks properties)
var_dump($user1 == $user2);
var_dump($user1 == $user3);

// Strict comparison (checks instance)
var_dump($user1 === $user2);
var_dump($user1 === $user3);

// Checking object IDs
var_dump(spl_object_id($user1) === spl_object_id($user3));

对象的 === 运算符验证它们是否是同一实例,而不仅仅是具有相同属性值的对象。 spl_object_id 函数可以帮助可视化这一点。

λ php object_comparison.php
bool(true)
bool(true)
bool(false)
bool(true)
bool(true)

真实世界的例子

在表单验证、API 响应和数据库操作等对类型安全至关重要的真实场景中,使用 === 尤其重要。

practical_usage.php
<?php

declare(strict_types=1);

// Form validation
$username = $_POST['username'] ?? '';
if ($username === '') {
    echo "Username is required\n";
}

// Database results
$user = ['id' => '42', 'active' => '1'];
if ($user['active'] === 1) {
    echo "User is active\n";
} else {
    echo "User is inactive (strict comparison)\n";
}

// API response handling
$response = json_decode('{"error": null}', true);
if ($response['error'] === null) {
    echo "No errors\n";
}

// Authentication check
$token = $_SESSION['token'] ?? null;
if ($token === null) {
    echo "Please login\n";
}

这些示例展示了 === 如何通过确保关键操作中完全匹配类型来防止可能与 == 相关的错误。

λ php practical_usage.php
Username is required
User is inactive (strict comparison)
No errors
Please login

最佳实践

遵循 === 的最佳实践有助于编写更可靠和可维护的 PHP 代码。

best_practices.php
<?php

declare(strict_types=1);

// 1. Default to === unless you specifically need type juggling
$input = "0";
if ($input === 0) {
    // Won't execute, which is usually what you want
}

// 2. Use === for form validation
$age = $_POST['age'] ?? '';
if ($age === '') {
    echo "Age is required\n";
}

// 3. Explicit null checks
$value = null;
if ($value === null) {
    echo "Value is null\n";
}

// 4. Strict return value checks
function findUser($id) {
    // Returns User object or null
    return ($id > 0) ? new User() : null;
}

$user = findUser(0);
if ($user === null) {
    echo "User not found\n";
}

// 5. Use === in switch statements
switch (true) {
    case $value === 0:
        echo "Exactly zero\n";
        break;
    case $value === false:
        echo "Exactly false\n";
        break;
}

// 6. Document expected types
/
 * @param int|string $id
 */
function processId($id) {
    if ($id === 0) {
        echo "Invalid ID\n";
    }
}

这些实践有助于避免常见的陷阱,并使代码行为更具可预测性。 关键原则是首选 ===,除非您有特定的理由使用 ==。

要记住的关键点

在本文中,我们探讨了 PHP 中的严格相等运算符。 我们讨论了它的行为,将其与宽松相等进行了比较,并提供了真实世界的例子。 我们还介绍了性能考虑因素和有效使用 === 的最佳实践。

作者

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

列出 所有 PHP 教程