PHP函数用于取消传递的引用变量

15

目前我正在使用这个PHP函数:

function if_exist(&$argument, $default = '')
{
    if (isset ($argument))
    {
        echo $argument;
    }
    else
    {
        echo $default;
    }
}
我希望这个函数在输出$argument(传引用)和$default的值后将其取消设置,我该怎么做? 提前致谢。
4个回答

21
根据unset的手册:
如果在函数内部对一个按引用传递的变量使用unset()函数,只有局部变量会被销毁。调用环境中的变量将保留unset()调用之前的值。
我猜这就是你遇到的问题。所以,我的建议是将$argument简单地设置为NULL。根据NULL文档的说明,这将"删除变量并取消其值"。
例如: $argument = NULL;

我写了这个代码: function if_exist(&$argument, $default = '') { if (isset ($argument)) { echo $argument; } else { echo $default; } $argument = NULL; } 但是还是没有成功,结果和之前一样。:( - Pawan Choudhary
@Pawan:在你的情况下可能是可行的,但是如果直接将其设为“空白”(即$argument = '';),然后不是检查它是否被设置,而是检查它是否为空,这也是一种方法。当然,这取决于空字符串是否是一个有效的值。 - Richard Marskell - Drackir

2

$default 是按值传递的,因此它不能被取消设置(除非在本地范围内)。

正如你无疑发现的那样,unset() 只是取消对 $argument 的引用。你可以通过以下方式(有点)取消设置 $argument

$argument = null; 

将null赋值给变量并不完全等同于取消设置它,尽管这样做意味着isset()无论哪种方式都会得到相同的结果。但我猜这样就足够了,因为你无论如何都不能通过调用unset()来实现相同的效果。 - BoltClock
我也做了,但仍然没有成功,无论是$argument还是$default都没有被取消设置。 :( - Pawan Choudhary
@Pawan Choudhary:你能在原始帖子中展示你的新代码,并展示你如何检查变量是否已设置吗? - George Cummins
函数 if_exist(&$argument, $default = '') { 如果 (isset ($argument)) { echo $argument; } else { echo $default; } $argument = NULL; }而我是这样使用该函数的: $select = 'something'; if_exist($select, ''); - Pawan Choudhary
@Pawan Choudhary:在评论中阅读代码非常困难,因此我建议您编辑原帖以展示您的新代码。其次,您没有展示如何确定运行 if_exists() 后 $select 是否未设置。您应该添加一行代码,如 if isset( $select) { // 做某事 } - George Cummins
您好,通常情况下它是可以工作的,但我正在使用CodeIgniter框架,而在其视图部分,这段代码无法正常工作。:( - Pawan Choudhary

1

使用函数实现此操作的唯一方法是使用全局变量。

//To unset() a global variable inside of a function,
// then use the $GLOBALS array to do so: 

<?php
function foo() 
{
    unset($GLOBALS['bar']);
}

$bar = "something";
foo();
?>

0
如果变量不是数组,并且通过引用传递,则unset实际上会取消设置指针,因此它不会影响原始数据。
但是,如果变量是一个数组,您可以取消设置其键。例如:
$arr = [
    'a' => 1, 
    'b' => ['c' => 3],
];

function del($key, &$arr) {
    $key = explode('.', $key);
    $end = array_pop($key);
    foreach ($key as $k) {
        if (is_array($arr[$k]) {
            $arr = &$arr[$k];
        } else {
            return; // Error - invalid key -- doing nothing
        }
    }
    unset($arr[$end]);
}

del('b.c', $arr); // $arr = ['a' => 1, 'b' => []]
del('b',   $arr); // $arr = ['a' => 1]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接