检查在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();
结果:
-
Function A time = 1.0307259559631
- 没有isset定义
-
Function B time = 0.72514510154724
- 未定义没有isset
-
Function C time = 1.3804969787598
- 使用isset定义
-
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
这是很容易解决的包装unset
在if(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); }
在处理物体时还有另外一个需要思考的问题,那就是能见度。
只是因为它存在并不意味着你有权修改它。