За последние 24 часа нас посетили 18564 программиста и 1599 роботов. Сейчас ищут 934 программиста ...

Yii2 Rbac

Тема в разделе "PHP для новичков", создана пользователем kakadyi, 30 сен 2015.

  1. kakadyi

    kakadyi Новичок

    С нами с:
    9 сен 2015
    Сообщения:
    25
    Симпатии:
    0
    Только прошу не закидывать тухлыми помидорами за нубский вопрос, в ООП безбожно плаваю:)
    Разбираюсь с Yii RBAC. На входе
    Код (PHP):
    1. Yii::$app->authManager->add($role) 
    ,
    Код (PHP):
    1. Yii::$app->authManager
    -это объект класса
    Код (PHP):
    1. yii\rbac\DbManager
    (я выбрал конфиг с БД).
    Соответственно, вызов входного метода ищет в классе DbManager реализацию метода add(). Такого метода в этом классе нету, значит, инерпретатор ищет реализацию данного метода в родительском классе (это BaseManager). Там такой метод реализован, вот код:
    Код (PHP):
    1. abstract class BaseManager extends Component implements ManagerInterface
    2.     public function add($object)
    3.     {
    4.         if ($object instanceof Item) {
    5.             return $this->addItem($object); 
    То есть за вызовом add() следует вызов метода addItem этого же класса (BaseManager), который описан как абстрактный и защищенный:
    Код (PHP):
    1. abstract protected function addItem($item); 
    .
    Вот дальше не могу понять, каким образом затем вызывается метод addItem класса DbManager (а он вызывается,т.к. этот метод вставляет в таблицы БД заявленные входные данные)?
    Код (PHP):
    1. protected function addItem($item)
    2.     {
    3.         $time = time();
    4.         if ($item->createdAt === null) {
    5.             $item->createdAt = $time;
    6.         }
    7.         if ($item->updatedAt === null) {
    8.             $item->updatedAt = $time;
    9.         }
    10.         $this->db->createCommand()
    11.             ->insert($this->itemTable, [
    12.                 'name' => $item->name,
    13.                 'type' => $item->type,
    14.                 'description' => $item->description,
    15.                 'rule_name' => $item->ruleName,
    16.                 'data' => $item->data === null ? null : serialize($item->data),
    17.                 'created_at' => $item->createdAt,
    18.                 'updated_at' => $item->updatedAt,
    19.             ])->execute();
    20.  
    21.         $this->invalidateCache();
    22.  
    23.         return true;
    24.     }
     
  2. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    это про ооп и наследование надо обязательно почитать. вкратце конечный класс как пирог составлен из цепочки родителей. если какого-то метода нет в классе то идет подъем в сторону класса, который первым в цепочке наследования. нет в нем метода? ошибка. есть? вызов. а дальше внутри этого вызова если идет $this то это от контекста объекта. а объект у нас какого класса? правильно, того самого конечного. и в нем метод реализован и спокойно вызывается.

    утрированно этот вот так выглядит:
    Cx-->B--->Ax - метод определен в А и переопределен в Ц
    C--->B--->Ax - метод определен в А и не перееопределен (ваш случай)
    Cx-->Bx-->A - метод не определен в А но появился в Б и переопределился в Ц
    и в Б и в А (да и в Ц) использование $this для объекта класса Ц будет начинать поиск заново слева-направо.
     
  3. kakadyi

    kakadyi Новичок

    С нами с:
    9 сен 2015
    Сообщения:
    25
    Симпатии:
    0
    Хм, я думал, что $this - это указатель на текущий класс. То есть, если в теле метода add() класса BaseManager идет вызов метода addItem() посредством $this, то это означает дословно - "вызови мне метод addItem() моего же класса". Или получается, что в моем случае $this имеет отношение к дочернему класу DbManager, то есть на самом деле вызов метода $this->addItem() вызывает этот метод уже в контексте класса Dbmanager, а не BaseManager? Если так, то тогда всё ясно и понятно:)
     
  4. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    this указывает на экземпляр класса. вне зависимости от того где метод определен [в цепочке классов] - $this будет указывать именно на экземпляр класса. для вызова родительского контекста используется parent, для своего личного self (текущий класс в вашем понимании)
     
  5. kakadyi

    kakadyi Новичок

    С нами с:
    9 сен 2015
    Сообщения:
    25
    Симпатии:
    0
    Ganzal, я понял:) По идее, можно самому поупражняться и проверить:) Спасибо Вам!
     
  6. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Вообще, браться изучать Yii2 с таким знанием ООП - это плохо. Но вот привычка читать исходник Yii - похвальна
     
  7. kakadyi

    kakadyi Новичок

    С нами с:
    9 сен 2015
    Сообщения:
    25
    Симпатии:
    0
    Я не могу себя заставить учить ООП, что называется, академично, то есть начинаем от начала и заканчиваем. У меня как - то получается так, что я кусками выхватываю инфу, а потом собираю воедино:) Наверное, моя особенность, отрицательная, но по - другому не могу. Про ООП если сидеть просто тупо читать от и до без практики - жесточайшее занудство. Особенно, когда сами статьи написаны людьми, не особо понимающие всю суть ООП. Поэтому я смотрю исходники Yii, которые кодили явно люди с умом. Плюс чтение исходник даёт полноту картины, какие есть возможности фреймворка. Иначе будешь зажат в рамках стандартных шаблонов и малейшее отклонение в сторону вызовет ступор (это я называю шаблонное мышление, наподобии того, как учатся больш-во в универах. Объяснили материал, дали стандартную задачу - все справились, дали нестандартную - почти все затупили, решил только тот, кто копнет глубже). Да и как можно юзать те или иные методы, когда ты их знаешь лишь на уровне абстракции фрейма? Меня, например, гложет любопытство, каким образом авторы реализуют тот или иной метод.
     
  8. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    всё ООП укладывается в то, что это во-первых инкапсуляция данных и методов - это основа и задумка всего ООП. А во-вторых удобно наследовать сообразно ситуации. Усё. Остальное частности.
     
  9. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    kakadyi а что мешает при чтении теории применять её на практике?