این یک باگ نیست

۳ سال پیش(به روز شده در ۳ سال پیش) پی اچ پی(PHP) ۰(غیر فعال)

چند سال پیش بطور اتفاقی به کدی برخورد کردیم که به نظر باگ بود اما در واقع باگ نبود. ما حتی این نکته رو هم برای وب سایت php فرستادیم و آنها به ما پاسخ کاملا قانع کنندهای دادند که در ادامه عنوان خواهیم ساخت.

$b = array( 1, 2, 3 );
function b( &$array )
{
unset( $array ); // <=====
}
b( $b );
print_r( $b );

شاید در بخش بالا انتظار داشته باشید که تابع هیچ مقداری برای نمایش نداشته باشد اما باید گفت که تابع print_r تمامی مقادیر آرایه b رانمایش می دهد این نکته را باید در نظر گرفت که تابع unset فقط به متغیرهای محلی دسترسی دارد و فقط متغیرهای محلی را از بین می ببرد.

خروجی:

نکته: تابع unset تابعی است که متغیر مورد نظر را از حافظه آزاد یا به اصطلاح از بین می برد.

Array
(
    [0] => 1
    [1] => 2
    [2] => 3
)

متن ارسالی ما و پاسخ php.net(جهت آشنایی بیشتر):

:Error in unset var for when used in function


Description:
------------
$b = array(1, 2, 3);
function b(&$array)
{
  $array[0] = 1000; 
  
       unset($array);   // <===== we think this bug!!!! --- but don't bug
  
  $array    = array();   
  $array[1] = 2000;   
}
  b($b);
  print_r($b);

Test script:
---------------
Array
(
    [0] => 1000
    [1] => 2
    [2] => 3
)

php.net Reply:

Unset deletes the function local variable $array, not the global $b, despite $array and $b being in the same reference set. This is by design. When $array is recreated it already lost its connection to $b.

Note that $array and $b point to the same data, but $array doesn't "know" which other variables (in this case,the global $b) point to this same data its pointing, so it cannot really unset $b.

آدرس گزارش: https://bugs.php.net/bug.php?id=53525&edit=2

برچسبها

هیچ برچسبی موجود نیست.

صفحات پیشنهادی

بدست آوردن بازه دقیقه به نسبت یک دقیقه خاص به همراه یونیکس تایم در php...

گاهی دقایق را به بازه های منظمی تبدیل میکنیم. مثلا بازه 5 دقیقه ای: 0، 5، 10، 15 تا ... 60. حال لازم است مثلا با ورودی 4 بازه شروع و پایان زمان را بدست آورد......

کلاس ایجاد کلاس(class generation)...

گاهی به کلاسهای ساده ای نیاز پیدا می کنیم تا در پروژه ها و برنامه های خود از آنها استفاده نماییم. در واقع این کلاسها تا حد امکان از وظایف ساده ای برخوردار بوده و در جهت توسعه و خوانایی بهتر برنامه و ج...

ایجاد تابع is_unicode برای php نسخه 5...

تابع is_unicode در php نسخه 6 به بعد پشتیبانی میشود و برای اینکه برای نسخه های قبلتر داشته باشیم از کد زیر استفاده میشود......