PDA

View Full Version : تداخل کلاسها و توابع و متغیر های مشابه در دو فایل جدا با include کردن



alasht
جمعه 10 تیر 1390, 12:52 عصر
با سلام خدمت دوستان
من یه مشکلی دارم هنگام include کردن
من دو تا فایل php دارم که هر کدوم کار جدایی انجام میدن و حالا من میخوام کارایی این دو تا رو یکی کنم و هنگامی که میخوام include کنم مثلا دو تا فایل رو تو یه فایل index.php اینکلود کردم تا جایی که کدها با هم اشتراکی ندارن اجرا میشه اما یه جاهایی کلاسها و توابع و متغیر ها با هم تشابه اسمی دارند اونجا گیر میکنه و دیگه بقیه سایت لود نمیشه
می خواستم ببینم راه حلی وجود نداره که از این تداخل جلوگیری کنم
من از require و include و require_once و include_once استفاده کردم اما نتیجه همشون مشابه بود .
البته این دو فایل که گفتم مثال بود و کار خیلی بزرگتر از گفته ها ی منه بنابراین نمیتونم بشینم تک تک توابع و کلاسها اسمشون رو عوض کنم .
ممنون میشم یه راه حل ارایه بدین
با تشکر

A2D3D.ir
جمعه 10 تیر 1390, 15:09 عصر
فکر نکنم راهی باشه
زمانی که داره اجرا میکنه
مثلا کلاس a از فایل a رو اجرا کنه یا کلاس a از فایل b ؟
معلومه بیچاره هنگ میکنه

mtchabok
جمعه 10 تیر 1390, 15:17 عصر
تا اونجایی که من میدونم توابع و کلاسها نباید اسامی همسان داشته باشن ولی در مورد متغیر اینطور نیست .
فرقی نداره که با کدوم تابع اسکریپت رو وارد میکنید در هر صورت شرایطی که گفتم وجود داره .

alasht
جمعه 10 تیر 1390, 15:21 عصر
سلام
ممنون از پاسختون
بله در حالت عادی نمیشه
من یه چیز رو فراموش کردم بگم
مثلا فایل a.php لیست اخرین مطالب سایت رو نشون میده و فایل index.php لیست اخرین ارسالهای انجمن
من برای اینکه اخرین ارسالهای انجمن و سایت رو در یک جا نشون بدم گرفتم داخل فایل index.php یک تابع نوشتم مثلا به اسم تابع x
من فایل a.php رو فقط تو تابع اینکلود کردم اما بازم رو کل فایل تاثیر میزاره و تداخل ایجاد میکنه
من میخوام تابع طوری باشه که فقط نتیجه نهایی رو برگردونه و مجزا باشه و تداخلی تو مابقی کدها ایجاد نکنه
ایا راهی هست ؟
امیدوارم متوجه منظورم شده باشید
با تشکر

mtchabok
شنبه 11 تیر 1390, 10:49 صبح
عزیزم تنها راه حلی که وجود داره این هس که نام تابع رو عوض کنید .
مگر اینکه فایل a.php شما یه مقدار رو برگردونه یعنی اینکه در محتوای فایل return داشته باشین . از این طریق میتونید از تابع include یا require مقدار رو دریافت کنید . البته در این روش هم باید نام توابع منحصر به فرد باشه .

hosseintdk775
شنبه 11 تیر 1390, 17:06 عصر
بسم الله الرحمن الرحیم
سلام
ببین مشکلت با namespace حل می شه:
http://www.php.net/manual/en/language.namespaces.rationale.php

این امکان هم واسه حل مسئله تداخل اسامی کلاس و تابع و ثابت ها ایجاد شده

امیـرحسین
شنبه 11 تیر 1390, 22: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 داشته باشم که تعریف نشده باید مقدار صفر بهش بدم بجای اینکه تشخیص صفر بودن رو به عهده‌ی سیستم بذارم....