Только прошу не закидывать тухлыми помидорами за нубский вопрос, в ООП безбожно плаваю Разбираюсь с Yii RBAC. На входе Код (PHP): Yii::$app->authManager->add($role) , Код (PHP): Yii::$app->authManager -это объект класса Код (PHP): yii\rbac\DbManager (я выбрал конфиг с БД). Соответственно, вызов входного метода ищет в классе DbManager реализацию метода add(). Такого метода в этом классе нету, значит, инерпретатор ищет реализацию данного метода в родительском классе (это BaseManager). Там такой метод реализован, вот код: Код (PHP): abstract class BaseManager extends Component implements ManagerInterface public function add($object) { if ($object instanceof Item) { return $this->addItem($object); То есть за вызовом add() следует вызов метода addItem этого же класса (BaseManager), который описан как абстрактный и защищенный: Код (PHP): abstract protected function addItem($item); . Вот дальше не могу понять, каким образом затем вызывается метод addItem класса DbManager (а он вызывается,т.к. этот метод вставляет в таблицы БД заявленные входные данные)? Код (PHP): protected function addItem($item) { $time = time(); if ($item->createdAt === null) { $item->createdAt = $time; } if ($item->updatedAt === null) { $item->updatedAt = $time; } $this->db->createCommand() ->insert($this->itemTable, [ 'name' => $item->name, 'type' => $item->type, 'description' => $item->description, 'rule_name' => $item->ruleName, 'data' => $item->data === null ? null : serialize($item->data), 'created_at' => $item->createdAt, 'updated_at' => $item->updatedAt, ])->execute(); $this->invalidateCache(); return true; }
это про ооп и наследование надо обязательно почитать. вкратце конечный класс как пирог составлен из цепочки родителей. если какого-то метода нет в классе то идет подъем в сторону класса, который первым в цепочке наследования. нет в нем метода? ошибка. есть? вызов. а дальше внутри этого вызова если идет $this то это от контекста объекта. а объект у нас какого класса? правильно, того самого конечного. и в нем метод реализован и спокойно вызывается. утрированно этот вот так выглядит: Cx-->B--->Ax - метод определен в А и переопределен в Ц C--->B--->Ax - метод определен в А и не перееопределен (ваш случай) Cx-->Bx-->A - метод не определен в А но появился в Б и переопределился в Ц и в Б и в А (да и в Ц) использование $this для объекта класса Ц будет начинать поиск заново слева-направо.
Хм, я думал, что $this - это указатель на текущий класс. То есть, если в теле метода add() класса BaseManager идет вызов метода addItem() посредством $this, то это означает дословно - "вызови мне метод addItem() моего же класса". Или получается, что в моем случае $this имеет отношение к дочернему класу DbManager, то есть на самом деле вызов метода $this->addItem() вызывает этот метод уже в контексте класса Dbmanager, а не BaseManager? Если так, то тогда всё ясно и понятно
this указывает на экземпляр класса. вне зависимости от того где метод определен [в цепочке классов] - $this будет указывать именно на экземпляр класса. для вызова родительского контекста используется parent, для своего личного self (текущий класс в вашем понимании)
Вообще, браться изучать Yii2 с таким знанием ООП - это плохо. Но вот привычка читать исходник Yii - похвальна
Я не могу себя заставить учить ООП, что называется, академично, то есть начинаем от начала и заканчиваем. У меня как - то получается так, что я кусками выхватываю инфу, а потом собираю воедино Наверное, моя особенность, отрицательная, но по - другому не могу. Про ООП если сидеть просто тупо читать от и до без практики - жесточайшее занудство. Особенно, когда сами статьи написаны людьми, не особо понимающие всю суть ООП. Поэтому я смотрю исходники Yii, которые кодили явно люди с умом. Плюс чтение исходник даёт полноту картины, какие есть возможности фреймворка. Иначе будешь зажат в рамках стандартных шаблонов и малейшее отклонение в сторону вызовет ступор (это я называю шаблонное мышление, наподобии того, как учатся больш-во в универах. Объяснили материал, дали стандартную задачу - все справились, дали нестандартную - почти все затупили, решил только тот, кто копнет глубже). Да и как можно юзать те или иные методы, когда ты их знаешь лишь на уровне абстракции фрейма? Меня, например, гложет любопытство, каким образом авторы реализуют тот или иной метод.
всё ООП укладывается в то, что это во-первых инкапсуляция данных и методов - это основа и задумка всего ООП. А во-вторых удобно наследовать сообразно ситуации. Усё. Остальное частности.