تالار گفتمان nCIS.ir

نسخه‌ی کامل: متدهای protected
شما در حال مشاهده نسخه آرشیو هستید. برای مشاهده نسخه کامل کلیک کنید.
تو اموزش yii برای فیلتر ایجاد کردن متد loadProject رو ایجاد کردید ولی بصورت protected
سوالم اینه که چه زمانی از متدهای protected و private استفاده میشه چرا اونجا public تعریف نکردید؟
این موضوعات مربوط به بحث شئ گرایی میشن. هروقت خواستین یک متد فقط توی خود کلاس استفاده بشه و نه فرزندان و نه اشیاء اون کلاس نتونن اون متد رو ببینن، private مینویسید. هروقت خواستین برای اشیاء غیرقابل دسترس باشه ولی کلاسهای فرزند بتونن باهاش کار کنن و صداش بزنن (داخل خود بدنه کلاسشون)، protected میگذارین. public هم که دیگه در دسترس همه هست.
(27-02-1394، 04:52 ب.ظ)ADMIN نوشته: [ -> ]این موضوعات مربوط به بحث شئ گرایی میشن. هروقت خواستین یک متد فقط توی خود کلاس استفاده بشه و نه فرزندان و نه اشیاء اون کلاس نتونن اون متد رو ببینن، private مینویسید. هروقت خواستین برای اشیاء غیرقابل دسترس باشه ولی کلاسهای فرزند بتونن باهاش کار کنن و صداش بزنن (داخل خود بدنه کلاسشون)، protected میگذارین. public هم که دیگه در دسترس همه هست.

این مسائل رو میدونم اما میخواستم بدونم دلیل امنیتی داره یا چیز دیگه ای یا کلا هر متدی که نیازی نیست از بیرون در دسترس باشه به این حالت تعریف میشه
کلاً هر متدی که یا لازم نیست یا به صلاح نیست که از بیرون صدا زده بشه رو به این شکل تعریف میکنیم. مثلاً اگه یه متد داریم که اسامی برندگان قرعه کشی رو از دیتابیس استخراج میکنه و این متد باید در زمان دلخواه توی یکی از متدهای دیگه کلاس صدا زده بشه و اگه در خارج از زمان مناسبش دستی صداش بزنیم باعث بشه نتایج اشتباه تولید بشه، میایم از دسترسیش توی بیرون از کلاس با private کردن جلوگیری میکنیم. حالا اگه دسترسی بهش توی کلاسهای مشتق شده مشکلی ایجاد نکنه، میتونیم اون رو protected تعریف کنیم. اما دقت کنید اگه یک کلاس، متدی رو protected تعریف کنه، کلاسهای فرزندش حق ندارن اون متد رو با سطح دسترسی پایینتری (مثلاً private) تعریف کنن و فقط میتونن اونها هم protected یا public بازنویسیش کنن. اگه public باشه هم فقط اجازه دارن public تعریف کنن.
(27-02-1394، 05:04 ب.ظ)ADMIN نوشته: [ -> ]اما دقت کنید اگه یک کلاس، متدی رو protected تعریف کنه، کلاسهای فرزندش حق ندارن اون متد رو با سطح دسترسی پایینتری (مثلاً private) تعریف کنن و فقط میتونن اونها هم protected یا public بازنویسیش کنن. اگه public باشه هم فقط اجازه دارن public تعریف کنن.

سلام. منظورتون از این قسمت که گفتید چی هستش؟ میشه با کد توضیح بدید؟ مثلا شما یک کلاس دارید و توش یک متود رو protected تعریف میکنید، یک کلاس دیگه هم میاد این کلاس رو ارث میبره و میتونه اون متود کلاس اصلی رو صدا بزنه، حالا این بحثی که شما گفتید یعنی بازنویسی کجای این جریان قرار میگیره؟ و منظورتون از بازنویسی چیه؟
بحث چندریختی توی پکیج پایه رو نگاه کنید.
جلسه چندم میشه؟
جلسه 13 ولی برای اون دسته از عزیزانی که پکیج پایه رو تهیه نکردن یه مثال میزنم:
class A
{
    // this will NOT be inherited to child classes
    // also is NOT available via class objects
    private function getClass()
    {
        return 'A';
    }

    // this will be inherited to chlid classes
    // but is NOT available via class objects
    protected function getRealClass()
    {
        return get_class($this);
    }

    // this will be inherited to chlid classes
    // but is NOT available via class objects
    protected function escape($value)
    {
        return htmlentities($value, ENT_QUOTES, 'utf-8');
    }

    public function hello($name)
    {
        $class = $this->getClass();
        echo "<p>Hello From {$class} to {$name}</p>";
    }

    public function bye($name)
    {
        $class = $this->getClass();
        echo "<p>Goodbye From {$class} to {$name}</p>";
    }
}

class B extends A
{
    // we are overriding the escape method
    // and change it to public so it can be accessed via B class objects (not A)
    // we CANNOT change it to private (i.e. decreasing accessibility)
    public function escape($value)
    {
        return htmlentities($value, ENT_QUOTES, 'utf-8');
    }

    // we are overriding the hello method
    // we CANNOT change it to protected or private (i.e. decreasing accessibility)
    public function hello($name)
    {
        $class = $this->getRealClass();
        echo "<p>Hello From {$class} to {$name}</p>";
    }

    // we are overriding the hello method
    // we CANNOT change it to protected or private (i.e. decreasing accessibility)
    public function bye($name)
    {
        $class = $this->getRealClass();
        echo "<p>Goodbye From {$class} to {$name}</p>";
    }
}
$a = new A;
$b = new B;
$a->hello('PHP');
$b->hello('PHP');
$a->bye('PHP');
$b->bye('PHP');

خروجی:
کد:
Hello From A to PHP
Hello From B to PHP
Goodbye From A to PHP
Goodbye From B to PHP
توی مثال بالا اگه متد getClass رو توی کلاس B صدا بزنیم خطا دریافت میکنیم چون بهش ارث نرسیده. اگه متد escape رو روی a$ صدا بزنیم هم خطا میگیریم چون protected هست ولی همین متد رو روی b$ میتونیم صدا بزنیم چون توی کلاسش، اون متد رو بازنویسی و سطح دسترسیش رو public کرده.