ZetCode

PHP unset 关键字

最后修改于 2025 年 4 月 16 日

PHP unset 关键字用于销毁变量并释放内存。 它可以删除单个变量、数组元素或对象属性。 正确使用 unset 有助于在 PHP 应用程序中有效地管理内存。

基本定义

unset 结构从当前作用域中删除指定的变量。 取消设置后,变量将变为未定义。 尝试使用它将触发通知,除非使用 isset() 进行检查。

Unset 对不同变量类型的影响不同。 对于局部变量,它会立即删除它们。 对于全局变量,它仅从当前作用域中删除它们。

语法:unset($var1, $var2, ...)。 可以在一个语句中取消设置多个变量。 该函数不返回值,并通过引用工作。

基本变量取消设置

此示例演示了 unset 与单个变量的最简单用法。

basic_unset.php
<?php

declare(strict_types=1);

$name = "John Doe";
echo "Before unset: $name\n";

unset($name);

// This will cause a notice
echo "After unset: $name";

该代码创建一个变量,打印它,然后取消设置它。 第二个 echo 将触发一个通知,因为 $name 不再存在。 Unset 从内存中完全删除变量。

取消设置数组元素

此示例演示了如何使用 unset 从数组中删除特定元素。

array_unset.php
<?php

declare(strict_types=1);

$colors = ['red', 'green', 'blue', 'yellow'];
print_r($colors);

unset($colors[1]); // Remove 'green'
print_r($colors);

// Note: array keys are preserved

代码从数组中删除第二个元素(索引 1)。 与 array_splice 不同,unset 不会重新索引数组。 原始键保留,创建一个“间隙”。

取消设置多个变量

此示例演示了在一个语句中取消设置多个变量。

multiple_unset.php
<?php

declare(strict_types=1);

$var1 = "test";
$var2 = 42;
$var3 = [1, 2, 3];

unset($var1, $var2, $var3);

var_dump(isset($var1)); // bool(false)
var_dump(isset($var2)); // bool(false)
var_dump(isset($var3)); // bool(false)

该代码同时取消设置了三个不同的变量。 isset 检查确认所有变量都已成功删除。 这比多个 unset 调用更有效。

取消设置对象属性

此示例演示了如何从对象实例中删除属性。

object_unset.php
<?php

declare(strict_types=1);

class User {
    public $name = 'John';
    public $age = 30;
}

$user = new User();
var_dump($user);

unset($user->age);
var_dump($user);

代码创建一个 User 对象,然后删除其 age 属性。 第二个 var_dump 显示了没有 age 字段的对象。 请注意,这仅影响此实例,而不是类定义。

全局与局部作用域

此示例演示了 unset 在各种作用域中的行为方式不同。

scope_unset.php
<?php

declare(strict_types=1);

$globalVar = "I'm global";

function testUnset() {
    global $globalVar;
    $localVar = "I'm local";
    
    unset($globalVar); // Only removes from function scope
    unset($localVar);  // Completely removes local var
}

testUnset();
echo $globalVar; // Still exists

代码显示在函数内部取消设置全局变量仅从该作用域中删除它。 该变量在外部仍然可以访问。 当取消设置局部变量时,它们会被完全销毁。

Foreach 循环中的 Unset

此示例演示了如何使用 unset 在数组迭代期间释放内存。

foreach_unset.php
<?php

declare(strict_types=1);

$largeArray = range(1, 100000);

foreach ($largeArray as $key => $value) {
    // Process value
    processValue($value);
    
    // Free memory
    unset($largeArray[$key]);
}

function processValue($val) {
    // Some processing
}

代码处理一个大数组,并在使用后取消设置每个元素。 这种技术有助于管理大型数据集的内存。 数组随着元素的处理和删除而缩小。

Unset vs Null

此示例将 unset 与将变量设置为 null 进行比较。

unset_vs_null.php
<?php

declare(strict_types=1);

$var1 = "test";
$var2 = "test";

unset($var1);
$var2 = null;

var_dump(isset($var1)); // bool(false)
var_dump(isset($var2)); // bool(false)
var_dump(is_null($var2)); // bool(true)

这两种方法都使 isset 返回 false,但它们的内存影响不同。 Unset 完全删除变量,而 null 分配一个值。 当变量需要存在但为空时,Null 更好。

最佳实践

来源

PHP unset 文档

本教程介绍了 PHP 的 unset 关键字,并提供了实际示例,展示了它与变量、数组、对象以及不同作用域中的用法。

作者

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

列出 所有 PHP 教程