有了错误报告,甚至是最佳实践,当在PHP中取消设置变量时,你应该检查它是否存在(在这种情况下它并不总是存在)并取消设置,或者只是取消设置?
<?PHP
if (isset($_SESSION['signup_errors'])){
unset($_SESSION['signup_errors']);
}
// OR
unset($_SESSION['signup_errors']);
?>
答案 0 :(得分:139)
只是取消设置,如果它不存在,将不会做任何事情。
答案 1 :(得分:46)
关于早些时候的一些混乱 关于导致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();
<强>结果:强>
Function A time = 1.0307259559631
Function B time = 0.72514510154724
Function C time = 1.3804969787598
Function D time = 0.86475610733032
<强>结论:强>
使用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的情况。