تغییر ناگهانی access modifie ها در متدهای کلاس

پرسیده شده
فعالیت 1369 روز پیش
دیده شده 541 بار
0

سلام

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

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

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

فایل پیوست

علیرضا دهکار
علیرضا دهکار

1 مرداد 99

0
حذف شده

سلام و احترام

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

فایل پیوست

امیر صالحی

توسط

امیر صالحی

1 مرداد 99

3
حذف شده

شما میتونید 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

توسط

mahdi mortezaee

9 مرداد 99

1
حذف شده

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

 

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

 

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

فایل پیوست