PDA

View Full Version : حرفه ای: پاک کردن یک تابع در PHP (حل شد)



abolfazl-z
سه شنبه 23 مهر 1392, 21:18 عصر
سلام دوستان :لبخندساده:

دوستان من توی نت گشتم ولی چیزی پیدا نکردم !

چطوری میتونیم یک تابع رو پاک کنیم ؟

MMSHFE
چهارشنبه 24 مهر 1392, 07:49 صبح
اگه بخواین واقعاً پاک کنید که باید توی سورس PHP دست ببرین ولی بجای این کار، میتونید غیرفعالش کنید. توی php.ini دنبال disable_functions بگردین و جلوش اسم توابع موردنظرتون رو بنویسید و با کاما از هم جدا کنید. فقط دقت کنید که ini_set رو هم ببندین چون اگه اینکار رو نکنید، با ini_set دوباره میتونن disable_functions رو خالی کنن و توابع مجدداً کار خواهند کرد.

abolfazl-z
چهارشنبه 24 مهر 1392, 10:20 صبح
نه بنده از اون لحاظ عرض نکردم.
به مثال ذیل توجه کنید :


function a(){echo 'a';};
#برفرض مثال : => unset(a())
a(); # Then --> Fatal error: Call to undefined function a()

البته یک تابع به نام runkit_function_remove (http://php.net/runkit_function_remove) وجود دارد که کار نمی کنه.
راهی دیگری نیست ؟

MMSHFE
چهارشنبه 24 مهر 1392, 10:45 صبح
$fn = create_function('$name', 'echo "<p>Hello {$name}.</p>" . PHP_EOL;');
call_user_func($fn, 'ali'); // output: Hello ali.
unset($fn);
call_user_func($fn, 'reza'); // output: Notice (call to undefined function)

MMSHFE
چهارشنبه 24 مهر 1392, 10:47 صبح
$fn = function($name) {
echo "<p>Hello {$name}.</p>" . PHP_EOL;
};
$fn('ali');
unset($fn);
$fn('reza');

abolfazl-z
چهارشنبه 24 مهر 1392, 12:35 عصر
مرسی آقای شهرکی.
ولی جای تعجب هست که چرا PHP چنین امکانی نداره که بشه با یک دستور یک تابع تعریف شده توسط کاربر رو پاک کند !
ولی باز هم ممنون.

MMSHFE
چهارشنبه 24 مهر 1392, 13:14 عصر
بطور کلی هدف از تعریف توابع این نیست که بعداً بخواین اونها رو از بین ببرین و اگه چنین کاری بخواد به شکل اصولی انجام بشه، باید یک کلاس ایجاد کنید و متدها رو توش تعریف کنید و هرزمان نیاز داشتین، یک شئ ازش ایجاد کنید و وقتی کارتون تمام شد، شئ رو حذف کنید ولی با این حال، PHP چنین قابلیتی رو به شما با امکان نامگذاری توابع بصورت متغیر و صدا زدن با کمک همون متغیر و حذف متغیر (درصورت لزوم) میده. چنین قابلیتی توی خیلی از زبانهای دیگه نیست.

AliRezaPro
چهارشنبه 24 مهر 1392, 13:29 عصر
مرسی آقای شهرکی.
ولی جای تعجب هست که چرا PHP چنین امکانی نداره که بشه با یک دستور یک تابع تعریف شده توسط کاربر رو پاک کند !
ولی باز هم ممنون.
زبانی که این قابلیت در آن گنجانده شده است را نام ببرید . توضیح بنده هم پست بالا است

MMSHFE
چهارشنبه 24 مهر 1392, 13:38 عصر
واقعاً هدف از حذف توابع رو درک نمیکنم. اگه بهش نیازی ندارین، خوب دیگه صداش نزنید! فقط یکجا این کار معنا پیدا میکنه و اونهم اینه که برای کارهای داخلی کد خودتون توی پروژه های تیمی نیاز به تابعی دارین که نمیخواین بقیه بتونن صداش بزنن که اونهم راه اصولیش رو گفتم (شئ گرایی و درصورت لزوم، private کردن متد مخصوص خودتون) و راه غیر اصولیش هم در PHP ممکنه (توابع بدون نام - Unnamed Functions - یا توابع متغیر Variable Functions). نمیدونم چرا میگین PHP چنین قابلیتی نداره.

abolfazl-z
چهارشنبه 24 مهر 1392, 15:25 عصر
واقعاً هدف از حذف توابع رو درک نمیکنم.خوب به مثال ذیل توجه کنید :

ما یک فایل داریم به نام index.php که با استفاده از این فایل، فایل index2.php را اینکلود می کنیم.
حالا در چند خط اول فایل index.php یعنی قبل از اینکه فایل index2.php را اینکلود کنیم یک تابع داریم به نام a() .
خوب حالا فایل index2.php میتونه هر چی باشه، حالا فرض را بر این می گیریم که یک تابع a() در این فایل وجود داشته باشه. خوب حالا با چه خطایی رو به رو میشیم ؟


Cannot redeclare a() previously declared

اینجا باید چکار کنیم ؟

البته میشه یک کار کرد !

خوب ما باید فایل index2.php را در داخل یک تابع دیگر فراخوانی کنیم، اینطوری کمی بهتر هست.

البته شاید راه دیگر هم وجود داشته باشه.

abolfazl-z
چهارشنبه 24 مهر 1392, 15:28 عصر
نمیدونم چرا میگین PHP چنین قابلیتی نداره.

اگر PHP اینقدر قشنگ نبود من تا به حال بین c++.net و PHP ، پی اچ پی رو انتخاب نمی کردم.

MMSHFE
چهارشنبه 24 مهر 1392, 15:58 عصر
خوب به مثال ذیل توجه کنید...
و خداوند namespace را آفرید!
لینک 1 (http://php.net/manual/en/language.namespaces.php)
لینک 2 (http://php.net/manual/en/language.namespaces.basics.php)

abolfazl-z
چهارشنبه 24 مهر 1392, 18:32 عصر
و خداوند namespace را آفرید!:لبخندساده:

عالی هست.

در واقع namespace ها در PHP به این معنی هست که میشه از توابع و کلاس های هم نام و یا غیر همنام چند فایل بصورت آدرس دهی استفاده کرد.

البته با پکیج های ران کیت میشه مدیریت بیشتری روی توابع داشته باشیم ولی روی اکثر هاست ها نصب که نیست !