PHP에서 변수를 설정 해제 할 때 오류보고를 설정했거나 모범 사례를 위해 먼저 변수가 존재하는지 (이 경우 항상 존재하지는 않음) 확인하고 설정 해제해야합니까, 아니면 설정 해제해야합니까?
<?PHP
if (isset($_SESSION['signup_errors'])){
unset($_SESSION['signup_errors']);
}
// OR
unset($_SESSION['signup_errors']);
?>
답변
설정을 해제하십시오. 존재하지 않으면 아무것도 수행되지 않습니다.
답변
존재하지 않는 변수를 설정 해제 할 때 unset ()이 알림을 트리거하는 원인에 대한이 노트의 앞부분에서 약간의 혼동과 관련하여 ….
존재하지 않는 변수 설정 해제
<?php unset($undefinedVariable); ?>
“정의되지 않은 변수”알림을 트리거하지 않습니다. 그러나
<?php unset($undefinedArray[$undefinedKey]); ?>
이 코드는 배열의 요소를 설정 해제하기위한 것이므로 두 개의 알림을 트리거합니다. $ undefinedArray 또는 $ undefinedKey 자체가 설정 해제되지 않고 설정 해제되어야하는 항목을 찾는 데 사용됩니다. 어쨌든 그들이 존재했다면, 둘 다 나중에 둘 다있을 것이라고 기대할 것입니다. 요소 중 하나를 unset ()했다고해서 전체 배열이 사라지는 것을 원하지 않습니다!
답변
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
- isset없이 정의 됨
Function B time = 0.72514510154724
- isset없이 정의되지 않음
Function C time = 1.3804969787598
- isset을 사용하여 정의
Function D time = 0.86475610733032
- isset을 사용하여 정의되지 않음
결론:
isset
작성하는 데 걸리는 약간의 추가 시간은 말할 것도없고 항상 사용하는 것이 덜 효율적 입니다. unset
정의되지 않은 변수 를 시도하는 것이 가능한지 확인하는 것보다 더 빠릅니다 unset
.
답변
변수 설정을 해제하려면 다음을 사용할 수 있습니다. unset
unset($any_variable); // bool, object, int, string etc
변수를 설정 해제하려고 할 때 그 존재를 확인하는 것은 아무런 이점이 없습니다.
변수가 배열이고 요소 설정을 해제하려면 먼저 부모 가 존재 하는지 확인해야합니다 . 이는 객체 속성에도 적용됩니다.
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);
}
물체를 다룰 때 고려해야 할 또 다른 것이 있습니다. 바로 가시성입니다.
존재한다고해서 수정할 수있는 권한이있는 것은 아닙니다.
답변
이 링크 확인
https://3v4l.org/hPAto
온라인 도구는 다양한 버전의 PHP에 대한 코드 호환성을 보여줍니다.
이 도구에 따르면 코드
unset($_SESSION['signup_errors']);
통지 / 경고 / 오류없이 PHP> = 5.4.0에서 작동합니다.