🎉 سال نو، مهارت نو، مشاوره رایگان نقشه راه برنامه نویسی (آفر ویژه ثبت نام قبل از افزایش قیمت 🔥)
۰ ثانیه
۰ دقیقه
۰ ساعت
۳ علیرضا دهکار
تغییر ناگهانی access modifie‌ها در متدهای کلاس
جامعه پی اچ پی ایجاد شده در ۰۱ مرداد ۱۳۹۹

سلام

شاید اشتباه باشه اما این مورد برام سوال شد:

مثال یک کلاس داریم به نام car و آبجکت‌های مختلفی در کل پروژه داریم و این کلاس یک متد داره با نام setModel که در پروژه استفاده شده و از نوع public هست و تا اینجا مشکلی در پروژه نیست و خطایی دریافت نمیشه

اما بنظرتون این مورد بوجود میاد که ما بخوایم مثلا این متد رو از جایی به بعد private کنیم؟ در چنین حالتی مطمئنن خطایی در کل پروژه بوجود میاد، چجوری باید این خطا رو برطرف کنیم؟

سلام و احترام

فکر کنم تو این مورد متد جادویی call__ خودشو نشون بده، اگه رسیده باشی به قسمت magic mathod‌ها قطعا می‌دونی که کاربرد این متد زمانیه که یک سری از متدها سطح دسترسی دارند و یا اصلا تعریف نشدند که میشه با این متد اینارو مدیریت کرد.

امیر صالحی ۰۱ مرداد ۱۳۹۹، ۰۷:۵۴

شما میتونید access modifire‌ها رو بدون هیچ مشکلی تغییر بدید و method‌ها و property هاتون رو override کنید و فقط در یک حالت به خطا میخورید و اون هم زمانیه که هنگام تغییر از access modifire قوی‌تر استفاده کنید که fatal error داده میشود اگر از access modifire مشابه یا ضعیف‌تر استفاده کنید ارور نمیده ..

به ترتیب قوی بودن access modifire‌ها : private > protected > public

به 2 مثال زیر توجه کنید :

در فرزند از access modifire  ضعیف‌تر استفاده شده و خطایی وجود ندارد

class person{
    private $number = 'one';
    public function getNumber(){
        return $this->number;
    }
}
class developer extends person {
   protected $number = 'two';
   public function getNumber(){
    return $this->number;
}
}
$ob = new developer();
echo $ob->getNumber();
#
#two

در فرزند از access modifire قویتر استفاده شده که ارور رخ داده :

class person{
    protected $number = 'one';
    public function getNumber(){
        return $this->number;
    }
}
class developer extends person {
   private $number = 'two';
   public function getNumber(){
    return $this->number;
}
}
$ob = new developer();
echo $ob->getNumber();
#
/* PHP Fatal error:  Access level to developer::$number must 
be protected (as in class person) or weaker */

البته بنده ادامه دوره رو ندیدم شاید اینطور که دوستمون گفتند بشه این مشکل رو رفع کرد ولی تا این جای دوره بنده به این نتیجه رسیدم که گفتم .

mahdi mortezaee ۰۹ مرداد ۱۳۹۹، ۱۲:۱۰

سلام دوست عزیز. از نظر منطقی و اصول برنامه نویسی درست نیست که سطح دسترسی یک ویژگی یا متد کلاس رو در حین برنامه تغییر بدید. اصول برنامه نویسی SOLID که در واقع استانداردی برای کد نویسی هست و برای کدنویسی OOP کاربرد داره تاکید میکنه که کلاس‌ها باید جوری نوشته بشه تا حین توسعه نرم افزار تغییری در پیاده سازی اون صورت نگیره و صرفا بشه با ارث بری (که در آینده مباحثش رو آموزش دادن استاد) به توسعه سیستم بپردازیم.

 

ولی حتی اگر مباحث SOLID رو هم نخوایم در نظر بگیریم باید طوری قبل از پیاده سازی سیستم برنامه تون رو طراحی کنید که نیازی به تغییر سطح دسترسی نداشته باشید.

 

حالا باز اگر سوال تون برطرف نشد مثالی بزنید که چرا نیاز دارید وسط برنامه سطح دسترسی رو عوض کنید تا راه درست برطرف کردن نیازتون رو بررسی کنیم.

فــــــــــــــــــــرزان ۱۳ مرداد ۱۳۹۹، ۲۰:۱۵