ارسالها: 368
موضوعها: 142
تاریخ عضویت: اردیبهشت 1394
اعتبار:
3
تشکرها: 252
85 بار تشکر شده در 53 پست
تو اموزش yii برای فیلتر ایجاد کردن متد loadProject رو ایجاد کردید ولی بصورت protected
سوالم اینه که چه زمانی از متدهای protected و private استفاده میشه چرا اونجا public تعریف نکردید؟
ارسالها: 3,701
موضوعها: 140
تاریخ عضویت: اردیبهشت 1394
اعتبار:
134
تشکرها: 195
3447 بار تشکر شده در 2120 پست
این موضوعات مربوط به بحث شئ گرایی میشن. هروقت خواستین یک متد فقط توی خود کلاس استفاده بشه و نه فرزندان و نه اشیاء اون کلاس نتونن اون متد رو ببینن، private مینویسید. هروقت خواستین برای اشیاء غیرقابل دسترس باشه ولی کلاسهای فرزند بتونن باهاش کار کنن و صداش بزنن (داخل خود بدنه کلاسشون)، protected میگذارین. public هم که دیگه در دسترس همه هست.
ارسالها: 3,701
موضوعها: 140
تاریخ عضویت: اردیبهشت 1394
اعتبار:
134
تشکرها: 195
3447 بار تشکر شده در 2120 پست
کلاً هر متدی که یا لازم نیست یا به صلاح نیست که از بیرون صدا زده بشه رو به این شکل تعریف میکنیم. مثلاً اگه یه متد داریم که اسامی برندگان قرعه کشی رو از دیتابیس استخراج میکنه و این متد باید در زمان دلخواه توی یکی از متدهای دیگه کلاس صدا زده بشه و اگه در خارج از زمان مناسبش دستی صداش بزنیم باعث بشه نتایج اشتباه تولید بشه، میایم از دسترسیش توی بیرون از کلاس با private کردن جلوگیری میکنیم. حالا اگه دسترسی بهش توی کلاسهای مشتق شده مشکلی ایجاد نکنه، میتونیم اون رو protected تعریف کنیم. اما دقت کنید اگه یک کلاس، متدی رو protected تعریف کنه، کلاسهای فرزندش حق ندارن اون متد رو با سطح دسترسی پایینتری (مثلاً private) تعریف کنن و فقط میتونن اونها هم protected یا public بازنویسیش کنن. اگه public باشه هم فقط اجازه دارن public تعریف کنن.
ارسالها: 3,701
موضوعها: 140
تاریخ عضویت: اردیبهشت 1394
اعتبار:
134
تشکرها: 195
3447 بار تشکر شده در 2120 پست
بحث چندریختی توی پکیج پایه رو نگاه کنید.
ارسالها: 3,701
موضوعها: 140
تاریخ عضویت: اردیبهشت 1394
اعتبار:
134
تشکرها: 195
3447 بار تشکر شده در 2120 پست
توی مثال بالا اگه متد getClass رو توی کلاس B صدا بزنیم خطا دریافت میکنیم چون بهش ارث نرسیده. اگه متد escape رو روی a$ صدا بزنیم هم خطا میگیریم چون protected هست ولی همین متد رو روی b$ میتونیم صدا بزنیم چون توی کلاسش، اون متد رو بازنویسی و سطح دسترسیش رو public کرده.