PDA

View Full Version : بارگذرای اتوماتیک توابع



leaping
دوشنبه 13 مرداد 1393, 17:34 عصر
سلام
میخواستم بدونم چطوری میشه مثل کلاسها که از تابع spl_autoload_register() استفاده میکردیم و کلاسها به صورت اتوماتیک لود میشدن برای تابعها هم استفاده کرد یعنی اینکه اسم تابع نوشته بشه و خودش از مسیر مورد نظر فراخوانی بشه؟

tux-world
دوشنبه 13 مرداد 1393, 20:54 عصر
شما وقتی که توابع رو داخل کلاسی مثل Helper.php می نویسید و اون رو اینکلود میکنید خودش بارگزاری میشه اتومات ولی اگه منظورتون این هستش که توابع مانند کلاسها اتوکامپلت داشته باشه این رو باید خود IDE تشخیص بده به کد شما ربطی نداره

leaping
دوشنبه 13 مرداد 1393, 21:34 عصر
شما وقتی که توابع رو داخل کلاسی مثل Helper.php می نویسید و اون رو اینکلود میکنید خودش بارگزاری میشه اتومات ولی اگه منظورتون این هستش که توابع مانند کلاسها اتوکامپلت داشته باشه این رو باید خود IDE تشخیص بده به کد شما ربطی نداره
فک میکردم منظورم رو واضح گفتم
هیچکدوم از جوابهای شما مربوط به سوال من نبود
ببین دوست عزیز
منظورم اینه که وقتی اسم تابع نوشته میشه و اون تابع درون یک فایل همنام خودش هست در پوشه ای با نام مثلا inc خودش به صورت اتوماتیک اینکلود بشه
این عمل در مورد کلاسها انجام پذیر است اما در مورد تابع ها اطلاعاتی ندارم

Veteran
دوشنبه 13 مرداد 1393, 22:57 عصر
توی ی کلاس یه صورت استاتیک بزار

leaping
دوشنبه 13 مرداد 1393, 23:04 عصر
توی ی کلاس یه صورت استاتیک بزار
من نمیخوام درون کلاس تعریف باشه میخوام یک تابع خارجی باشه دوست عزیز
این مورد یک مقوله کاملا جداست و فک نمیکنم ربطی به سوال من داشته باشه دوست گرامی

Veteran
دوشنبه 13 مرداد 1393, 23:31 عصر
خب اینکاره شما درکل اشتباه هست که بخواد تابع رو درون یک فایل قرار بدید و با صدا زدن تابع، فایل مربوطه هم لود بشه!
حالا شما همش بگو ربطی نداره! یعنی چی ربطی نداره ؟ اینها راه حل هستند که به حل مسئله کمک میکنه
قرار نیست هر مسئله ایی راه مخصوص داشته باشه! گاهی الگوریتم کلا اشتباه هست
حالا ما باید پافشاری کنیم که نه من راه مخصوص همین سوالو میخوام ؟
فرض کنید 10 تابع دارید، با فرض وجود چنین امکانی که شما میخواید باید 10 تا فایل داشته باشید!!! حالا بنظرت این کار بهینه است ؟ بهتر نیست به صورت یک متد درون یک کلاس و یک فایل باشن؟

leaping
سه شنبه 14 مرداد 1393, 09:12 صبح
خب اینکاره شما درکل اشتباه هست که بخواد تابع رو درون یک فایل قرار بدید و با صدا زدن تابع، فایل مربوطه هم لود بشه!
حالا شما همش بگو ربطی نداره! یعنی چی ربطی نداره ؟ اینها راه حل هستند که به حل مسئله کمک میکنه
قرار نیست هر مسئله ایی راه مخصوص داشته باشه! گاهی الگوریتم کلا اشتباه هست
حالا ما باید پافشاری کنیم که نه من راه مخصوص همین سوالو میخوام ؟
فرض کنید 10 تابع دارید، با فرض وجود چنین امکانی که شما میخواید باید 10 تا فایل داشته باشید!!! حالا بنظرت این کار بهینه است ؟ بهتر نیست به صورت یک متد درون یک کلاس و یک فایل باشن؟
دوست گرامی که حرف از بهینه بودن میزنید
دارم بهتون میگم که با این کار فقط تابع مخصوص به کارت لود میشه و از بارگذاری مجدد توابع جلوگیری میشه و باید بگم تو خیلی از برنامه های حرفه ای هم این کار صورت میگیره که هر تابع تنها درون یک فایل قرار میگیره
اینکه الگوریتم من اشتباه است شما عفو کنید
ببخشید اما دوس دارم تا جایی که امکان داره جستجو کنم که راه حلی برای الگوریتم خودم پیدا کنم
خسته نباشید

Veteran
سه شنبه 14 مرداد 1393, 10:24 صبح
بله،مثه اینکه بنده شمارو نمیتونم متقاعد کنم و شما همچنان روی مسئله خودت پافشاری میکنی.
به هرحال بهینه بودن همیشه به این معنی نیست که حافظه کمتری درگیر بشه ! چه بسا که توی کلاس های استاتیک هم مشکلی بابت حافظه نیست ! و مدیریت حافظه میکنه!
اما خب برای مسئله شما تابعی رو نمیشناسم که اینکارو بکنه ! ولی خودتون به راحتی میتونید پیاده سازی بکنید !
روشی که به ذهن بنده میرسه اینه




<?php
class autoFileLoader{
public function __call($function,$params){
$file="functions/{$function}.php";
if(file_exists($file)){
require_once $file;
return call_user_func_array($function, $params);
}
}
}
$obj=new autoFileLoader();
echo $obj->sum(1,2);

leaping
سه شنبه 14 مرداد 1393, 11:09 صبح
بله،مثه اینکه بنده شمارو نمیتونم متقاعد کنم و شما همچنان روی مسئله خودت پافشاری میکنی.
به هرحال بهینه بودن همیشه به این معنی نیست که حافظه کمتری درگیر بشه ! چه بسا که توی کلاس های استاتیک هم مشکلی بابت حافظه نیست ! و مدیریت حافظه میکنه!
اما خب برای مسئله شما تابعی رو نمیشناسم که اینکارو بکنه ! ولی خودتون به راحتی میتونید پیاده سازی بکنید !
روشی که به ذهن بنده میرسه اینه




<?php
class autoFileLoader{
public function __call($function,$params){
$file="functions/{$function}.php";
if(file_exists($file)){
require_once $file;
return call_user_func_array($function, $params);
}
}
}
$obj=new autoFileLoader();
echo $obj->sum(1,2);

ممنون دوست عزیز ولی کلا راه رو بی راهه رفتین و همچنان منظور بنده رو متوجه نشدین
موفق باشید دوست من

Mohammadsgh
سه شنبه 14 مرداد 1393, 11:18 صبح
دوست گرامی اگر اشتباه نکنم منظور ایشون کلاس نبود:لبخندساده:منظورشون auoload تابع هست:لبخندساده:

Veteran
سه شنبه 14 مرداد 1393, 11:24 صبح
متوجه مسئله هستم! اما تابعی برای اینکار ندیدم! حالا اومدم با این پیاده ساازیش کردم! دیگه باقیش با شما!

leaping
سه شنبه 14 مرداد 1393, 11:41 صبح
متوجه مسئله هستم! اما تابعی برای اینکار ندیدم! حالا اومدم با این پیاده ساازیش کردم! دیگه باقیش با شما!
دوست عزیز من وقتی با کلاس پیاده سازی بشه فوقش من باید این تابع رو به کلاس شما که طراحی کردین معرفی بکنم درسته؟
خب در این حالت بدون کلاس با یک تابع ساده هم میشه این کار رو کرد
من منظورم این هست که وقتی اسم تابع نوشته بشه خودش به صورت اتوماتیک تابع مورد نظر رو از فایل مورد نظر بارگذاری بکنه

Veteran
سه شنبه 14 مرداد 1393, 11:58 صبح
شما نیازی نیست تابع رو توی کلاس تعریف بکنید! فقط به صورت یک متد صداش بزنید! کلاس میره فایلی همنام با متد صدا زده شما به صورت اتومات لود میکنه و بعد از اجرا خروجی تابع رو برگشت میده
دیدیگه از این اتومات تر نمیشه.
حالا اگر روش های دیگه ایی هم هست، خوشحال میشیم بما هم یاد بدید

leaping
سه شنبه 14 مرداد 1393, 12:23 عصر
شما نیازی نیست تابع رو توی کلاس تعریف بکنید! فقط به صورت یک متد صداش بزنید! کلاس میره فایلی همنام با متد صدا زده شما به صورت اتومات لود میکنه و بعد از اجرا خروجی تابع رو برگشت میده
دیدیگه از این اتومات تر نمیشه.
حالا اگر روش های دیگه ایی هم هست، خوشحال میشیم بما هم یاد بدید
خب میدونم با تابع هم میشه همچین کاری کرد.
اما فرض کنید یه اسکریپت گنده طراحی کردید.حال میخواید سوییچ کنید
خب این منطقیه که بشینی و این همه تابع رو با آبجکت صدا بزنی؟
خب نمیشه
منم واسه همین دارم دنبال اون راه حل دوم میگردم اگه پیدا بشه و البته خوشحال میشم اگر چیزی دستگیرم شد انتقال بدم