View Full Version : تداخل کلاسها و توابع و متغیر های مشابه در دو فایل جدا با include کردن
alasht
جمعه 10 تیر 1390, 13:52 عصر
با سلام خدمت دوستان
من یه مشکلی دارم هنگام include کردن
من دو تا فایل php دارم که هر کدوم کار جدایی انجام میدن و حالا من میخوام کارایی این دو تا رو یکی کنم و هنگامی که میخوام include کنم مثلا دو تا فایل رو تو یه فایل index.php اینکلود کردم تا جایی که کدها با هم اشتراکی ندارن اجرا میشه اما یه جاهایی کلاسها و توابع و متغیر ها با هم تشابه اسمی دارند اونجا گیر میکنه و دیگه بقیه سایت لود نمیشه
می خواستم ببینم راه حلی وجود نداره که از این تداخل جلوگیری کنم
من از require و include و require_once و include_once استفاده کردم اما نتیجه همشون مشابه بود .
البته این دو فایل که گفتم مثال بود و کار خیلی بزرگتر از گفته ها ی منه بنابراین نمیتونم بشینم تک تک توابع و کلاسها اسمشون رو عوض کنم .
ممنون میشم یه راه حل ارایه بدین
با تشکر
A2D3D.ir
جمعه 10 تیر 1390, 16:09 عصر
فکر نکنم راهی باشه
زمانی که داره اجرا میکنه
مثلا کلاس a از فایل a رو اجرا کنه یا کلاس a از فایل b ؟
معلومه بیچاره هنگ میکنه
mtchabok
جمعه 10 تیر 1390, 16:17 عصر
تا اونجایی که من میدونم توابع و کلاسها نباید اسامی همسان داشته باشن ولی در مورد متغیر اینطور نیست .
فرقی نداره که با کدوم تابع اسکریپت رو وارد میکنید در هر صورت شرایطی که گفتم وجود داره .
alasht
جمعه 10 تیر 1390, 16:21 عصر
سلام
ممنون از پاسختون
بله در حالت عادی نمیشه
من یه چیز رو فراموش کردم بگم
مثلا فایل a.php لیست اخرین مطالب سایت رو نشون میده و فایل index.php لیست اخرین ارسالهای انجمن
من برای اینکه اخرین ارسالهای انجمن و سایت رو در یک جا نشون بدم گرفتم داخل فایل index.php یک تابع نوشتم مثلا به اسم تابع x
من فایل a.php رو فقط تو تابع اینکلود کردم اما بازم رو کل فایل تاثیر میزاره و تداخل ایجاد میکنه
من میخوام تابع طوری باشه که فقط نتیجه نهایی رو برگردونه و مجزا باشه و تداخلی تو مابقی کدها ایجاد نکنه
ایا راهی هست ؟
امیدوارم متوجه منظورم شده باشید
با تشکر
mtchabok
شنبه 11 تیر 1390, 11:49 صبح
عزیزم تنها راه حلی که وجود داره این هس که نام تابع رو عوض کنید .
مگر اینکه فایل a.php شما یه مقدار رو برگردونه یعنی اینکه در محتوای فایل return داشته باشین . از این طریق میتونید از تابع include یا require مقدار رو دریافت کنید . البته در این روش هم باید نام توابع منحصر به فرد باشه .
hosseintdk775
شنبه 11 تیر 1390, 18:06 عصر
بسم الله الرحمن الرحیم
سلام
ببین مشکلت با namespace حل می شه:
http://www.php.net/manual/en/language.namespaces.rationale.php
این امکان هم واسه حل مسئله تداخل اسامی کلاس و تابع و ثابت ها ایجاد شده
امیـرحسین
شنبه 11 تیر 1390, 23:22 عصر
شما در کل روش جالبی رو استفاده نکردید و هر راهحلی انتخاب کنید از سیستم نرمال فاصله دارید.
در هر صورت هم همونجور که فرمودند میتونید از Namespace استفاده کنید هم میتونید بجای include کدها رو eval کنید و هم میتونید یک تابع مثل تابع زیر تعریف کنید و فایلها رو بجای include در این تابع قرار بدید:
$string = get_include_contents('somefile.php');
function get_include_contents($filename) {
if (is_file($filename)) {
ob_start();
include $filename;
return ob_get_clean();
}
return false;
}
در حالت کلی Namespace منطقیترین گزینه است مگه اینکه شرایط متفاوت باشه.
پیشنهاد شخصی من اون کار مشکلست! یعنی کدها رو مرور و اصلاح کنید! نیازی نیست نام متغیرها رو تغییر بدید فقط کافیه متغیرها reset بشند. تعیین مقدار اولیه برای متغیرها در PHP خیلی اهمیت داره و سرعت رو افزایش میده. مثلا اینکه من یک متغیر counter داشته باشم که تعریف نشده باید مقدار صفر بهش بدم بجای اینکه تشخیص صفر بودن رو به عهدهی سیستم بذارم....
vBulletin® v4.2.5, Copyright ©2000-1403, Jelsoft Enterprises Ltd.