PDA

View Full Version : سوال: این تابع چیه؟ register_shutdown_function



naser_haji
جمعه 19 خرداد 1391, 17:17 عصر
سلام
من تو تابع از یه کلاس با این برخورد کردم


register_shutdown_function(array(&$this,'close'));

میشه توضیح بدین که منظورش چیه؟
ممنون

MMSHFE
جمعه 19 خرداد 1391, 18:55 عصر
این دستور باعث میشه هرموقع کار اسکریپت تمام شد (اعم از خاتمه عادی یا با استفاده از exit و die و...) تابع close رو صدا بزنه.

eshpilen
جمعه 19 خرداد 1391, 20:37 عصر
مطمئنید آقای MMSHFE (http://barnamenevis.org/member.php?55504-MMSHFE)؟
در منوال درمورد register_shutdown_function گفته:

Registers a callback to be executed after script execution finishes or exit() (http://www.php.net/manual/en/function.exit.php) is called

ترجمه: «یک تابع (callback) را تعیین میکند که پس از اینکه اجرای اسکریپت خاتمه یافت یا exit فراخوانی شد اجرا شود.»

ضمنا بنده هم در پروژم ازش استفاده کردم که به همین شکل کار میکنه.

ارتباطی به شیء و از بین رفتنش و این حرفا نداره. فقط بنظر میرسه تابعی که در اون برنامه برای اجرا در انتهای اجرای اسکریپت جاری رجیستر شده متد یک کلاسه. تابع رجیستر شده برای اجرا در پایان برنامه میتونه یک تابع عادی باشه و میتونه متد یک کلاس باشه. هر دو تابع هستن.
یک شیء ممکنه قبل از اینکه اجرای برنامه خاتمه پیدا کنه نابود بشه. ولی این تابع فقط موقع خاتمهء کل برنامه اجرا میشه.

MMSHFE
جمعه 19 خرداد 1391, 20:52 عصر
شرمنده یه جای دیگه داشتم توضیح destructor رو میگفتم، اشتباهی اینجا تایپ کردم. بله این دستور برای معرفی یک تابع جهت اجرا موقع خروج از اسکریپت (حالا یا با پایان یافتن عادی، یا با exit و die و...) به کار میره. توضیحاتم رو اصلاح کردم.

MMSHFE
جمعه 19 خرداد 1391, 20:54 عصر
راستشو بخواین درمورد die مطمئن نیستم. بد نیست امتحان کنیم ببینیم با die هم صدا زده میشه یا نه؟

eshpilen
جمعه 19 خرداد 1391, 21:04 عصر
die و exit دقیقا یک چیز هستن.
درواقع die یک alias برای exit است. یعنی یک نام جایگزین برای exit.

MMSHFE
جمعه 19 خرداد 1391, 21:12 عصر
اینطوری نیست. die پیغام خطا چاپ میکنه ولی exit کد خطا برمیگردونه. die بطور کلی به سیستم عامل کد خطای 1- برمیگردونه درحالی که exit کدی که بهش اعلام میکنید رو برمیگردونه که اگه صفر (یا خالی) باشه به معنای خاتمه عادی اسکریپت بدون خطا هست. درواقع میتونید توی سیستم عامل خروجی اسکریپت رو دریافت کنید و مثلاً بفهمید آیا با موفقیت تمام شد یا نه. مثلا توی Batch Fileها با کمک دستورات ErrorLevel و... میتونید پیغام خطای مناسب رو بعد از خاتمه اسکریپت با دریافت کدی که exit برگردونده نمایش بدین یا Log کنید.

eshpilen
شنبه 20 خرداد 1391, 13:00 عصر
بنده یکسری تستهایی انجام دادم.
اول اینو تست میکنیم:

<?php

die('msg');

?>
خروجی حاصل از اجرا از طریق مرورگر:

msg

اجرا توسط CLI:

php.exe test.php
خروجی مشاهده شده:

msg
مقدار برگشتی رو چک میکنیم:

echo %errorlevel%
نتیجه:

0

همین تست ها رو با جایگزین کردن exit بجای die هم انجام دادم و نتیجه یکسان بود.

حالا با این کد تست میکنیم:


<?php

die(101);

?>

خروجی حاصل از اجرا از طریق مرورگر: هیچ خروجی ای مشاهده نشد.

اجرا بصورت CLI:

php.exe test.php
خروجی مشاهده شده: خروجی ای مشاهده نشد.

مقدار برگشتی رو چک میکنیم:

echo %errorlevel%
نتیجه:

101

همین تستها رو با جایگزین کردن exit بجای die هم انجام دادم و نتیجه یکسان بود.

نسخهء PHP مورد استفاده: 5.3.9
سیستم عامل: Windows XP sp3

حالا شما بفرمایید مواردی که مطرح کردید چه منبع و دلیلی دارن یا چطوری میشه تست کرد تا موضوع رو بیشتر بررسی کنیم.

eshpilen
شنبه 20 خرداد 1391, 13:10 عصر
طبق تستهایی که بنده انجام دادم، die و exit هردو کاملا یکجور عمل میکنن.
با هر دو میشه پیام خطا چاپ کرد و با هر دو میشه کد خطا برگشت داد.
اگر آرگومانی که بهشون پاس میکنید یک رشته باشه، اون رشته رو چاپ میکنن و مقدار برگشتی هم صفر است.
اگر آرگومان یک عدد صحیح باشه، چیزی چاپ نمیشه و مقدار برگشتی برابر اون عدد خواهد بود.
درحالت بدون آرگومان هم هردو مقدار 0 رو برگشت میدن (طبیعتا بازم بدون اینکه چیزی چاپ بشه).

خلاصه در عمل هیچ تفاوتی مشاهده نشد و کنجکاو شدم بدونم منبع چیزهایی که گفتید چی بوده!
شاید هم در نسخه های قدیمی تر PHP اینطور که شما گفتید بوده. هرچند بنده تا یادم میاد منوال گفته این دوتا دستور یکی هستن، و شخصا همیشه با exit پیام خطا چاپ میکردم. به هیچ مطلب دیگر و تفاوت خاصی تاحالا برخورد نکردم!

MMSHFE
شنبه 20 خرداد 1391, 15:37 عصر
با سلام، گویا حق با شماست و ساختارش رو تغییر دادن چون قبلاً exit یک عدد بعنوان پارامتر میگرفت و اون رو بر میگردوند اما الآن صراحتاً گفته از نسخه 4.2 به بعد حتی اگه عدد بدین، نشونش هم نمیده! شرمنده چون از PHP 4 تا حالا باهاشون کار میکردم و شخصاً همیشه از die برای نمایش پیغام خروج استفاده میکردم، دیگه Manual رو نخونده بودم. ممنون که اطلاعاتم رو افزایش دادین. البته بحث ErrorLevel که گفتم درهرحال وجود داره (منتها برای هر دو تابع die و exit) :


If status is a string, this function prints the status just before exiting.
If status is an integer, that value will be used as the exit status and not printed. Exit statuses should be in the range 0 to 254, the exit status 255 is reserved by PHP and shall not be used. The status 0 is used to terminate the program successfully.

موفق باشید.