Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 是否可以从方法中删除传递给方法的值_Php - Fatal编程技术网

Php 是否可以从方法中删除传递给方法的值

Php 是否可以从方法中删除传递给方法的值,php,Php,假设我有一个方法(在这个特殊情况下是一个静态方法),这个方法在给定的值上工作。一旦完成,我就可以在代码中自动删除变量(而不是函数副本) 从我所读到的所有信息来看,我怀疑这是不可能的,但我的搜索并没有发现明确的声明 示例案例: 静态方法: public static function checkKey($keyValue = null) { if(!is_null($keyValue) && !empty($keyValue)) { if($_SESSION

假设我有一个方法(在这个特殊情况下是一个静态方法),这个方法在给定的值上工作。一旦完成,我就可以在代码中自动删除变量(而不是函数副本)

从我所读到的所有信息来看,我怀疑这是不可能的,但我的搜索并没有发现明确的声明

示例案例:

静态方法:

public static function checkKey($keyValue = null)
{
    if(!is_null($keyValue) && !empty($keyValue)) {
        if($_SESSION['keyValue'] == $keyValue) {
            unset($keyValue,$_SESSION['keyValue']);
            return true;
        }
        unset($keyValue,$_SESSION['keyValue']);
        return false;
    }
    return false;
}
用法:

$valueToBeChecked = "I want this value unset from within the function"
//PHP page code 
AbstractClass::checkKey($valueToBeChecked);
是否有一种方法可以让上面的方法
checkKey
从方法
checkKey
中删除
$valueToBeChecked
的值

事实上,它是一个静态方法不应该太关键,它更重要的是函数的形状。当变量作为参数传递时,函数是否有办法删除函数/方法外部设置的值

我意识到如果整个事情都包装在一个类中,并且变量保存为类级变量(
unset(var)
),这是可能的,但是我很好奇是否有能力从范围之外“访问”变量,例如

public static function checkKey($keyValue = null)
{
    unset(\$keyValue);
}
我只有有限的使用名称空间的经验,但这是我最好的猜测,如果这是可能的,如何去做

简化等效结果:

我试图达到的是这一行动,完全在方法之内:

$valueToBeChecked = "something"
AbstractClass::checkKey($valueToBeChecked);
unset($valueToBeChecked);

不能从函数中取消设置变量并传播该效果。根据:

如果通过引用传递的变量在函数内部为unset(),则只销毁局部变量。调用环境中的变量将保留与调用unset()之前相同的值

但是,您可以通过传递引用并将其设置为null来获得等效行为:

function kill(&$value) {
    $value = null;
}

var_dump($x); // NULL
$x = 'foo';
var_dump($x); // 'foo'
kill($x);
var_dump($x); // NULL

这是因为,在PHP中,不存在的符号和具有
NULL
值的符号之间没有区别。

那么您想知道函数是否可以修改其调用方的堆栈帧吗?@bishop是的,听起来很像。我想如果通过引用传递变量,可能会起作用。我认为实际上这是不可能的,你不应该这样做。选择一种新的设计模式。你永远不应该这样做。你检查一把钥匙,然后,作为一种副作用,取下钥匙。避免副作用。如果必须存在副作用,则应使副作用明显。方法名为
checkKey
,但它的实际行为和副作用是
checkKey和moveifvaluedoesnotmatch
。如果一个函数需要一个长名称来描述它正在做什么,那么它就会感觉到这个函数做得太多了。与其在函数中进行整理,不如在父函数中根据返回值进行整理
if(!AbstractClass::checkKey($value)){unset($value,$\u SESSION['keyValue']);}
应该不惜一切代价避免这种编程。@self我同意。这是一个熊陷阱的副作用。这个答案足以涵盖我想要的,谢谢。