• 0 رای - 0 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
یک سوال مهم
#1
Question 
سلام دوستان. این اولین پست من هست تو این انجمن Big Grin
من روی پروژه ای کار میکنم و الان به مشکل خوردم .

ّبزارید اول توضیح بدم

من چندتا lib دارم که هر کدوم در واقع یک کلاس هستن
Security
Mysql
Interface
Modules


هر کدوم از اینها یه کلاس هستن با چندتا متد.
مثلا Modules میتونه بر اساس URL Request و pars کردن اون ، ماژول مورد نظر رو از پوشه ماژول ها لود کنه و ...
حالا من یه فایل core.php هم دارم که میخوام توش تمام فایل های بالا رو اینکلود کنم توش و یه شی از هرکدوم بسازم.

بعد تو ماژول ها راحت از اینا استفاده کنم ( رواقه بشن tools )
مثلا من یه کلاس دارم به اسم Mysql و اون تو یه متد داره به نام Select :

کد پی‌اچ‌پی:
[align=left]
public function 
Select ($Table $Condition )
{     
    
$this->Table     =  $Table                                                                                                 ;
    
$this->Condition =  $Condition                                                                                             ;
    
    if   ( isset       (
$this->Condition)   ) 
    {
    
$this->Query(" SELECT * FROM ".$this->Table."  WHERE ".$this->Condition." ")                                               ;         
    }
    else 
    {
    
$this->Query(" SELECT * FROM ".$this->Table."                             ")                                               ;       
    }

[/align

و متد $this->Query هم همون mysql_query هست .
حالا میخوام تو کلاس core یه شی از کلاس mysql و باقی کلاس ها ایجاد کنم و تو ماژول ها به راحتی بهشون دسترسی داشته باشم
مثلا وقتی یه ماژول news مینویسم ،

کد پی‌اچ‌پی:
$news $System->Select('news'); 

بتونم توشون از اون شی استفاده کنم.
آیا این درسته و شدنیه ؟
و سوال دیگه اینکه مثلا تو کلاس Security من برای چک کردن perm داشتن طرف ( که میتونه این ماژول رو ببینه یا خیر ) یه جایی رو باید از Db چک کنم. حالا میخوام از همین شی mysql استفاده کنم توش. با Extended میشه ولی اگه مثلا 5 lib های من ، بخوام همشون بتونن از متد های اون یکی استفاده کنند ، یعنی 5 تا lib جدا ولی هر کدوم به متد های دیگری دسترسی داشته باشن ( با فرض اینکه همه تو Core.php اینکلود شدن و هر کدوم هم یه شی ازشون ساختم ) چی کار باید بکنم ؟ و اینکه نام گذازی اونها چه طور میشه .
یعنی اگه مثلا mysql رو به نام $mysql=new mysql ساختم ، تو ماژول ها و lib های دیگه باید با $this صدا بزنمش یا با $ mysql ؟

با تشکر از دوستان عزیز
  پاسخ
تشکر شده توسط :
#2
نقل قول:اگه مثلا mysql رو به نام $mysql=new mysql ساختم ، تو ماژول ها و lib های دیگه باید با $this صدا بزنمش یا با $ mysql ؟
وقتی از this استفاده می کنن که بخوای یک متد یا پراپرتی رو از همون کلاس بخونی. در غیر اینصورت از نام همون شیء باید استفاده کنی.

نقل قول:حالا میخوام تو کلاس core یه شی از کلاس mysql و باقی کلاس ها ایجاد کنم و تو ماژول ها به راحتی بهشون دسترسی داشته باشم
درست متوجه منظورت نشدم ولی اینی که من فهمیدم اینه که شما میخوای از یک کلاس دیگه در کلاس دیگری استفاده کنید. خب اولین راه اینه که اینکلود کنید و بعد یک شیء از همون کلاس رو در کلاس دومتون بسازید و خلاص یا شیء اون کلاس رو شبیه سازی (clone) کنید.

بهتره صبر کنی ببینی دوستان دیگه چی میگن ... Angel
غایب
  پاسخ
تشکر شده توسط : Armin
#3
Exclamation 
مرسی از پاسختون. من هم به فکرم رسید مه که مثلا تو LIB دیگه اینطوری استفاده کنم : ( همه اینها تو CORE با هم INCLUDE میشن.
یه نمودار درختی هم میشه :
  • security
  • mysql
  • interface
  • core

یعنی همه تو یه پوشه هستن. حالا همه تو core ، اینکلود میشن.
من میخوام از یه متد از کلاس mysql مثلا Select تو کلاس security استفاده کنم و بلعکس. میتونم با extends کار کنم ولی چون میخوام همزمان به چند تا کلاس دسترسی داشته باشم ( مثلا تو کلاس interface به mysql و security و ... )
نمیشه با extends کار کنم. + اینکه عملکرد عکس هم میخوام یعنی وقتی کلاس A از b مشتق میشه - هم a به b دسترسی داشته باشه ، هم b به a دسترسی داشته باشه.

راهی که شما گفتید این هست که مثلا تو security که یه دستور Select میخوام با فرض اینکلود بودن کلاس mysql ، تو کلاس Security یه آبجکت جدید بسازم.
مثلا برای کوئری و ریختن تو متغیر :

کد پی‌اچ‌پی:
[align=left]$armin mysql::select 'ip' ) ;[/align

منظورتون اینه ؟ خوب اینجوری تعدد آبجکت ها باعث کند شدن برنامه نمیشه ؟ چون برای یک سایت پر بازدید هست و سکشن های زیادی داره.
از طرفی از فریمورک های آماده نمیخوام استفاده کنم
با تشکر HeartHeartHeartHeart
  پاسخ
تشکر شده توسط :
#4
بسم الله الرحمن الرحیم
سلام
برو دنبال MVC / جواب سوالت توش هست
تو همین انجمن هم یه تاپیکی در این مورد هست

-> یه کلاسی ایجاد می کنه به سبک singleton و توش پروپرتی ای قرار می دی به شکل آرایه و بعد از بقیه کلاس هات یه شی می سازی و تو این کلاسه و تو پروپرتی مربوطه ذخیرش می کنه
بعد هر کجا خواستی شی کلاس ( مثلا mysql )رو صدا بزنی اینطوری صدا می زنی:
(فرض کن اون کلاسی که شی ها رو تو خودش نگه می داره Registry هست):
کد پی‌اچ‌پی:
$registry->mysql->select() 
این $registy می شه یه شی از همون کلاسی که شی باقی کلاس ها رو توش نگه می داره

بعد این mysql هم می شه شی کلاس mysql ات :
تا اینجاش:
کد پی‌اچ‌پی:
$registry->mysql 
باقیش هم که متد توی mysql رو صدا می زنه

(توجه کن که شی های هر کلاس رو می تونی انتقال بدی که می تونی یه کلاس جامع ای داشته باشی که همه این شی ها رو تو خودش داشته باشه و ازش می تونی شی باقی کلاس هاتو صدا بزنی و استفاده کنی)

نمی دونم تونستم منظورمو برسونم یا نه
  پاسخ
تشکر شده توسط : Armin payam


پرش به انجمن:


کاربران در حال بازدید این موضوع: 1 مهمان