Покинул форум
Сообщений всего: 41
Дата рег-ции: Авг. 2013
Помог: 1 раз(а)
[+]
Здравствуйте. Есть класс, в нем есть некий функционал. Можно ли класс дополнить (расширить), добавить к нему пару методов. Но именно добавить к этому классу, не создавая классов наследников, т.е. так, чтобы я мог дальше к нему обращаться по его имени, а не по имени класса наследника.
Например:
Возможно ли это как-то сделать?
Спасибо. (Добавление)
Придумал хороший пример. Как добавить к mysqli метод __destruct() ?
То что можно создать class Db extends mysqli{} , к нему добавить __destruct и пользоваться классом Db - это понятно. Но можно ли как-то __destruct добавить именно к mysqli классу?
caballero
Отправлено: 02 Августа, 2013 - 17:37:43
Активный участник
Покинул форум
Сообщений всего: 5998
Дата рег-ции: Сент. 2011 Откуда: Харьков
Помог: 126 раз(а)
если нигде нельзя меняь код ни в самом классе ни в месте его вызова то наверно никак
вообще какая то странная задача
Покинул форум
Сообщений всего: 41
Дата рег-ции: Авг. 2013
Помог: 1 раз(а)
[+]
Расширить сам класс естественно надо ДО работы с ним (создания объектов). Т.е. есть класс, если выполняется определенное условие, расширяем класс - добавляем к нему все что хочется, и потом начинаем с классом работать.
Такое осуществить можно?
- но не нужно.
Заметьте, что речь идёт о "расширении" в контексте экземпляра, но не класса. Если нужно расширить сам класс, то Вам нужна библиотека RunKit и её runkit_method_add - но это очень плохая практика.
Ещё альтернатива:
- без runkit. Используйте это только если понимаете, для чего это нужно и что Вы делаете.
----- Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
stifard
Отправлено: 02 Августа, 2013 - 17:52:28
Новичок
Покинул форум
Сообщений всего: 40
Дата рег-ции: Май 2013
Помог: 1 раз(а)
EuGen пишет:
addMethod
наверное такого метода нет в mysqli
Цитата:
можно создать class Db extends mysqli{} , к нему добавить __destruct и пользоваться классом Db - это понятно. Но можно ли как-то __destruct добавить именно к mysqli классу?
scarzie
Отправлено: 02 Августа, 2013 - 17:58:36
Новичок
Покинул форум
Сообщений всего: 41
Дата рег-ции: Авг. 2013
Помог: 1 раз(а)
[+]
EuGen, большое спасибо.
Насчет того что так делать не правильно - Вы правы. Но мне кажется что это иногда просто необходимо. Причем надо расширить именно класс, а не экземпляр. В первом сообщении, как мне кажется, привел очень наглядный пример.
Как добавить к классу mysqli метод __destruct() не создавая классов потомков? В него к примеру можно было б добавить закрытие соединения.
Покинул форум
Сообщений всего: 41
Дата рег-ции: Авг. 2013
Помог: 1 раз(а)
[+]
DeepVarvar, это конечно само собой. Имелось ввиду что класс не заблокирован для наследования.
Я так понял что расширить/дополнить класс - нельзя.
Дальше оффтоп и ИМХО:
Допустим есть класс Forum который выводит темы, сообщения, категории и т.д.
Админ может редактировать сообщения, удалять темы, банить ну администрировать в общем. Зачем делать класс потомок, и придумывать ему имя что-то на подобии "Forum_admin", если можно было б просто дополнить класс Forum и обращаться к нему, а не к Forum_admin?
Ну или взять и просто дополнить какой-то класс методами (тот-же mysqli, к примеру)...
Разве я не прав?
Мелкий
Отправлено: 02 Августа, 2013 - 19:05:20
Активный участник
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Помог: 618 раз(а)
scarzie пишет:
Разве я не прав?
Задумайтесь над тем, как вы это будете сопровождать. ООП и так имеет достаточно средств основательно запутать исходный код. А если за одним именем класса будет скрываться десяток разных реализаций? А если ещё и одновременно?
scarzie пишет:
и обращаться к нему, а не к Forum_admin?
Решается фабрикой. (паттерн Factory)
Но если у классов и API разный - то так вы только запутаете код.
----- PostgreSQL DBA
IllusionMH
Отправлено: 02 Августа, 2013 - 19:06:42
Активный участник
Покинул форум
Сообщений всего: 4254
Дата рег-ции: Февр. 2011 Откуда: .kh.ua
Помог: 242 раз(а)
scarzie, ИМХО в методе можно проверять права доступа и давать соответствующий ответ.
Покинул форум
Сообщений всего: 41
Дата рег-ции: Авг. 2013
Помог: 1 раз(а)
[+]
IllusionMH, это понятно, костылей можно много прикрутить. Речь идет (точнее шла) именно об расширении класса, но увы, штатными способами этого сделать нельзя.
Мелкий пишет:
Задумайтесь над тем, как вы это будете сопровождать. ООП и так имеет достаточно средств основательно запутать исходный код. А если за одним именем класса будет скрываться десяток разных реализаций? А если ещё и одновременно?
да, Вы правы, не думал с этой точки зрения)
Если у кого-то еще есть что интересного сказать на эту тему - было б интересно услышать.
DelphinPRO
Отправлено: 03 Августа, 2013 - 02:08:47
Активный участник
Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012
зы. класс-наследник конечно же присутствует, но мы можем вызывать его по имени базового класса. что и требовалось топикстартеру.
зыы. согласен с Мелким - так делать не стоит.
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.