在PHP中取消设置之前检查var是否存在?

时间:2009-09-03 17:03:42

标签: php

有了错误报告,甚至是最佳实践,当在PHP中取消设置变量时,你应该检查它是否存在(在这种情况下它并不总是存在)并取消设置,或者只是取消设置?

<?PHP
if (isset($_SESSION['signup_errors'])){
    unset($_SESSION['signup_errors']);
}

// OR

unset($_SESSION['signup_errors']);
?>

5 个答案:

答案 0 :(得分:139)

只是取消设置,如果它不存在,将不会做任何事情。

答案 1 :(得分:46)

From the PHP Manual

  

关于早些时候的一些混乱   关于导致unset()的原因的这些注释   在取消设置时触发通知   不存在的变量......

     

取消设置不存在的变量,   如在

<?php
unset($undefinedVariable);
?>
     

不会触发“未定义   变量“通知。但是

<?php
unset($undefinedArray[$undefinedKey]);
?>
     

触发两个通知,因为这个   代码用于取消设置元素   阵列;既不是$ undefinedArray也不是   $ undefinedKey本身就是   没有设置,他们只是习惯了   找到应该取消的东西。后   所有,如果他们确实存在,你仍然会   期待他们两个都在身边   然后。你不会想要你的   整个数组只是因为消失了   你取消了()其中一个元素!

答案 2 :(得分:13)

对未定义的变量使用unset不会导致任何错误(除非变量是不存在的数组(或对象)的索引)。

因此,您唯一需要考虑的是最有效的方法。使用'isset'进行测试效率更高,正如我的测试所示。

<强>测试

function A()
{
    for ($i = 0; $i < 10000000; $i++)
    {
        $defined = 1;
        unset($defined);
    }
}

function B()
{
    for ($i = 0; $i < 10000000; $i++)
    {
        $defined = 1;
        unset($undefined);
    }
}

function C()
{
    for ($i = 0; $i < 10000000; $i++)
    {
        $defined = 1;
        if (isset($defined))
            unset($defined);
    }
}

function D()
{
    for ($i = 0; $i < 10000000; $i++)
    {
        $defined = 1;
        if (isset($undefined))
            unset($undefined);
    }
}

$time_pre = microtime(true);
A();
$time_post = microtime(true);
$exec_time = $time_post - $time_pre;
echo "Function A time = $exec_time ";

$time_pre = microtime(true);
B();
$time_post = microtime(true);
$exec_time = $time_post - $time_pre;
echo "Function B time = $exec_time ";

$time_pre = microtime(true);
C();
$time_post = microtime(true);
$exec_time = $time_post - $time_pre;
echo "Function C time = $exec_time ";

$time_pre = microtime(true);
D();
$time_post = microtime(true);
$exec_time = $time_post - $time_pre;
echo "Function D time = $exec_time";
exit();

<强>结果:

  1. Function A time = 1.0307259559631
    • 定义没有isset
  2. Function B time = 0.72514510154724
    • 未定义的未定义
  3. Function C time = 1.3804969787598
    • 使用isset
    • 定义
  4. Function D time = 0.86475610733032
    • 使用isset
    • 未定义
  5. <强>结论:

    使用isset总是效率低下,更不用说写入时需要的少量额外时间。尝试unset未定义的变量比检查它是否unset更快。

答案 3 :(得分:2)

如果您想取消设置变量,则可以使用unset

unset($any_variable); // bool, object, int, string etc

尝试取消设置变量时,检查它的存在没有任何好处。

如果变量是一个数组并且您希望取消设置元素,则必须确保 parent 首先存在,这也适用于对象属性。

unset($undefined_array['undefined_element_key']); // error - Undefined variable: undefined_array

unset($undefined_object->undefined_prop_name); // error - Undefined variable: undefined_object

通过将unset封装在if(isset($var)){ ... }块中,可以轻松解决此问题。

if(isset($undefined_array)){
    unset($undefined_array['undefined_element_key']); 
}

if(isset($undefined_object)){
    unset($undefined_object->undefined_prop_name); 
}

我们只检查变量( parent )的原因很简单,因为我们不需要检查属性/元素,这样写入和计算会慢很多,因为它会添加额外检查。

if(isset($array)){
...
}

if(isset($object)){
...
}

.vs

$object->prop_name = null;
$array['element_key'] = null;

// This way elements/properties with the value of `null` can still be unset.

if(isset($array) && array_key_exists('element_key', $array)){
...
}

if(isset($object) && property_exists($object, 'prop_name')){
...
}

// or 

// This way elements/properties with `null` values wont be unset.

if(isset($array) && $array['element_key'])){
...
}

if(isset($object) && $object->prop_name)){
...
}

这是不言而喻的,但在获取,设置和取消设置元素或属性时,了解变量的type也是至关重要的;使用错误的语法将引发错误。

尝试取消设置多维数组或对象的值时也一样。您必须确保父键/名称存在。

if(isset($variable['undefined_key'])){
    unset($variable['undefined_key']['another_undefined_key']);
}

if(isset($variable->undefined_prop)){
    unset($variable->undefined_prop->another_undefined_prop);
}

在处理对象时,需要考虑另一件事,那就是可见性。

仅因为它存在并不意味着您有权修改它。

答案 4 :(得分:0)

检查此链接 https://3v4l.org/hPAto

在线工具显示了不同版本PHP的代码兼容性

根据此工具的代码

Main.compactDisc

在不提供任何通知/警告/错误的情况下,适用于PHP> = 5.4.0的情况。