检查在PHP中不存在之前是否存在var?

有了错误报告,甚至是最好的做法,当在PHP中取消设置variables时,是否应该先检查它是否存在(在这种情况下,它不总是存在)并取消设置,或者取消设置?

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

只要取消它,如果它不存在,什么都不会做。

从PHP手册 :

关于这些注意事项中的一些混淆,关于unset()在未设置不存在的variables时触发通知的原因。

取消设置不存在的variables,如

 <?php unset($undefinedVariable); ?> 

不会触发“未定义的variables”通知。 但

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

触发两个通知,因为这个代码是用于取消设置一个数组的元素; $ undefinedArray和$ undefinedKey都没有被设置,他们只是被用来定位什么应该是未设置的。 毕竟,如果他们确实存在的话,你仍然期望他们都会在事后。 你不希望你的整个数组因为你unset()的一个元素而消失!

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

因此,唯一需要考虑的是最有效的方法。 正如我的testing所显示的,不用'isset'testing更有效率。

testing:

 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
    • 未定义没有isset
  3. Function C time = 1.3804969787598
    • 使用isset定义
  4. Function D time = 0.86475610733032
    • 未定义使用isset

结论:

使用isset总是效率较低,更不用说写less量额外的时间。 尝试unset未定义的variables比检查是否可以unset更快。

如果你想取消设置一个variables,那么你可以使用unset

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

当试图取消设置variables时,检查它的存在没有任何好处。

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

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

这是很容易解决的包装unsetif(isset($var)){ ... }块。

 if(isset($undefined_array)){ unset($undefined_array['undefined_element_key']); } if(isset($undefined_object)){ unset($undefined_object->undefined_prop_name); } 

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

 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)){ ... } 

这是不言而喻的,但在获取,设置和取消设置元素或属性时,知道variables的type也是至关重要的。 使用错误的语法会引发错误。

当试图取消multidimensional array或对象的值时,它是一样的。 您必须确保父键/名称存在。

 if(isset($variable['undefined_key'])){ unset($variable['undefined_key']['another_undefined_key']); } if(isset($variable->undefined_prop)){ unset($variable->undefined_prop->another_undefined_prop); } 

在处理物体时还有另外一个需要思考的问题,那就是能见度。

只是因为它存在并不意味着你有权修改它。