| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > PHP: Для профи > наследование и статические методы |
| Автор: MyDarkSide 9.12.2009, 12:59 | ||||
| Думаю сейчас над реализацией моделей в своем фреймворке MVC. Пришла в голову интересная идея: статические методы модели отвечают за выборку данных из множества. А обычные члены класса реализуют сам объект модели (т.е. сущность)
следующий шаг естественно вынести методы типа getById() в базовый класс
и тут я познал дзен - комменты в AbstractModel::getById() получается как в старом анекдоте: ни денег, ни топора и вроде все правильно. |
| Автор: awdev 9.12.2009, 14:51 |
| в чем вопрос? |
| Автор: NewDima 9.12.2009, 15:00 |
| Пространства имен абстрактных членов классов разных уровней наследования не совпадают |
| Автор: NewDima 9.12.2009, 16:47 | ||
я бы сделал как-то так
|
| Автор: awdev 9.12.2009, 20:22 |
| Вот так и создаются ### фрейморки По сабжу, автор не изобретай велосипед, посмотри как сделано удобно у других и сделай так же или поучись там где это работает уже хорошо. |
| Автор: NewDima 10.12.2009, 15:09 |
| awdev, комментируя чей-то код, выкладывай аргументы. Голые твои слова стоят ровным счетом ничего. Это на тему ### кода. Холеварить на тему "стоит ли писать самостоятельно велосипеды" не буду, потому что для меня здесь ответ очевиден. MyDarkSide, Зачем создавать тему, в которой потом не отписываешься? Нравится, когда пинают репутацию? |
| Автор: sTa1kEr 10.12.2009, 15:16 |
| Магический метод __callStatic() тоже только в PHP 5.3 доступен. А вообще это избитый вопрос. Ответ: никак нельзя, только переходить на PHP 5.3 |
| Автор: awdev 10.12.2009, 16:22 | ||||
Вся бизнес логика должна быть спрятана в модели. Моделями управляет контроллер, какой когда запустить, собрать данные и отправить в отображение. Отсюда следует что конструктор у моделей может быть разный. Во вторых этот способ не абстрагируется. Сегодня мне нужно из БД, завтра считать с XML файла послезавтра вообще передумаю и буду брать через SOAP, в классической постановке мы меняем одну модель на другую в контроллере. Или вместо new News(new XMLClient) написали new News(new SOAPClient) и все пашет. Все остальное - остается неизменным, ваш же код будет вызывать один и тот же класс. Например мне нужно получить Новость по ID: Будет вызвано: return NewsModel(array("ID"=>10)); Или вообще захочу игнорировать все запросы. Изменить в контролере вызов NewsModel на NewsModelBlackHole - все. А у вас надо будет модель перезаписывать. То есть если я передумаю использовать эту модель, и захочу другую - мне придется перезаписывать файл NewsModel. Что, как мне кажется, не очень красиво и правильно. |
| Автор: NewDima 10.12.2009, 17:18 |
| awdev, а ты не заметил, что перед кодом я написал "как то так"? Это значит что это только смысл кода, почти псевдокод. Это одно. Другое: я ответил на вопрос топикстартера так, как он был поставлен, остальное - его проблемы. sTa1kEr, а вы пишете для версий ниже?! Добавлено через 4 минуты и 25 секунд Вообще, создается впечатление, что большинство программистов пишут под четверку и даже горядтся этим... |
| Автор: awdev 10.12.2009, 17:36 |
| NewDima, я не понимаю почему Вы пишите сообщение на "ты"? Во вторых я не хотел доказывать или что-либо еще, я лишь написал видимые для меня недостатки Вашего кода. Если вы хотели написать это как псевдокод, то это не прочиталось. В любое случае, я надеюсь ответ ТС был дан. |
| Автор: sTa1kEr 10.12.2009, 18:05 |
Ну вопрос задал не я, а ТС и судя поон пишет на версии ниже. Добавлено через 1 минуту и 8 секунд Но в этом нет ничего плохого, т.к. версия 5.3 еще очень сырая. |
| Автор: NewDima 11.12.2009, 07:49 | ||
это при том, что в других ветках ты участвуешь, а в своей нет? |
| Автор: MyDarkSide 11.12.2009, 10:54 |
| по большому в данном случае версия 5.3 не сильно спасет потому что, использование get_called_class все равно похоже на какой-то костыль. Т.е. когда речь идет о простых классах и членах, то класс-потомок переопределяет одноименные члены класса-родителя, другие же наследует т.е. включает в себя. А со статическими членами - поведение почему то другое. И тут возникает вопрос - поведение от Zend'a (когда механизм наследования по сути не работает в статических членах ) - правильное и соответствует каким-то догмам ООП (может быть в других языках такая же ситуация), или это все-таки не доработки |
| Автор: awdev 11.12.2009, 14:56 | ||
Ну почему, работает, члены передаются потомкам, но получается их нельзя переопределить, и стат методы выполняются в контексте того класса, где они были объявлены изначально. |
| Автор: MyDarkSide 11.12.2009, 17:40 |
| awdev, если в базовом классе сделать debug_backtrace() то про класс-потомок там нет ни слова, даже если вызов метода идет из класса потомка. |
| Автор: awdev 11.12.2009, 18:50 | ||
Ну так и я про что
|
| Автор: nerezus 13.12.2009, 17:28 |
| Тему не читал, но почти наверняка подойдет фабрика ) Судя по другим прочитанным темам с таким вопросом. |
| Автор: MyDarkSide 14.12.2009, 10:43 | ||
| nerezus, сейчас именно так и сделал. завтра UML прикреплю, а в коде так: есть два класса User extends AbstractModel и UserCollection extends AbstractCollection (здесь и далее User для примера) есть функция-фабрика Collection($name) которая производит коллекции. А коллекции в результате поиска возвращают один или массив объектов User.
|
| Автор: nerezus 14.12.2009, 12:40 |
| Как сказал один уважаемый человек, static и наследование не совместимы. И при программировании стоит это помнить. Я не знал это и потратил 2 дня на казалось бы "мегакрутую" архитектуру. Переделал за полчаса потом за действительно норальную, т.к. не мог исправить многие косяки без кучи костылей. |
| Автор: MyDarkSide 14.12.2009, 14:09 |
| nerezus, именно ! та же х...я самое главное перечитал кучу манов и букварей, и нигде даже намека не было на такую "особенность" статики |
| Автор: NewDima 14.12.2009, 18:57 | ||||
| MyDarkSide, блин, да это логично вытекает из самой природы статичных методов. А по поводу фабрики, так мой код - тоже фабрика, если не заметили. Какая разница,
или
Кто скажет? Только не нужно говорить о непроизводительности магических методов и прочей чепухе. А, ну да, мы же пишем ниже 5.3.2, это главная причина |
| Автор: MyDarkSide 15.12.2009, 11:03 | ||||||
Вот когда разобъешь об это лоб - то да подумав, впринципе логично, но не мешало бы и хоть словом обмолвиться, про менее важные вещт трубят и разжёвывают, а тут какое то белое пятно, у того же Котерова про 5PHP половина книги посвящена XML, а тут хоть бы строчку... разница есть, в каждом классе модели могут быть определены свои специфические методы выборки, например для выборки сегодняшних именниников, в моем коде вызов останется прозрачным
в твоем коде
|
| Автор: nerezus 15.12.2009, 11:30 | ||
Так многие авторы делают, тот же Шилдт. |
| Автор: NewDima 16.12.2009, 07:58 | ||||||||||
Интересно, что возвращает метод getTodayIsBirthday? булево значение (судя по названию)? Что за пример ты привел? Бред какой-то Мой код будет примерно таким:
Еще раз говорю, всмотрись внимательно, между этим
и этим
разница минимальна, можно сказать, что только в записи. Первый способ: Collection('User') возвращает объект типа User, метод getById вызывается в контексте его же. Второй способ: Все намного прозрачнее |
| Автор: MyDarkSide 17.12.2009, 01:31 | ||||
прежде чем хамить надо внимательно прочитать пост: во-вторых это тема НЕ про названия методов, каждый волен называть как ему нравится.
т.е. у тебя метод getUserByBirthday() - будет определен в классе Collection ? и ещё 100 других методов типа: выбрать не прочтенные комментарии, посты за сегодня, не прочтенные ПМ, кто пинал мою карму и т.д. ? как-то не очень.. |
| Автор: NewDima 17.12.2009, 11:43 | ||
явное непонимание азов... читать азы http://php.net/manual/en/language.oop5.overloading.php. Если ты бы хоть взглянул на код, который я дал, то не ответил так, как ты это сделал. Присмотрись внимательней, можешь открыть экранную клавиатуру, если тебе без нее проблема прочитать код. В общем сделай что-нибудь, прежде чем говорить про код, который ты не прочитал. В нем даже НЕТ метода getUserById, представляешь? а он будет вызываться, вот так чудо! |
| Автор: MyDarkSide 18.12.2009, 12:10 | ||||
судя по твоему коду азам могут поучить тебя даже первокурсники. Аргументирую, твой код:
1. Регулярка в методе, которая определяет какой метод "перевызвать", необходимость её применения надо обосновать. 2. Вы Очень не внимательно читаете топик-старты: 2.1 Речь идет о PHP5, но более ранем чем 5.3, соответственно функции там __callStatic() - там нет, иначе бы и мой код можно было заставить работать более прозрачным способом. 2.2 Речь идет о нормальном механизме наследования, в твоем коде, вы решаете совсем другую задачу,а именно сделать так, чтобы вызов метода типа МодельByПоле - выбирало запись из таблицы по определенному полю и всё. А что вы будете делать если надо будет добавить пагинаторы сюда, сортировки, выборки из 2 или более связанных таблиц - лепить новые регулярки ? а если выборка вообще не с полем связана а например, нужно получить время последней модификации таблицы модели, как выкручиваться будете ? наверно опять регуляркой. 3. Как работает нормальное наследование: есть базовый класс, часто объявленный как абстрактный, содержащий общее поведение для объектов своего класса, и есть его потомки, конкретизирующие поведение для своего подкласса, создается экземпляр потомка и вызов происходит методов потомка, который имеет доступ к общим методом объявленным в базовом классе, ты предлагаешь вызывать метод базового класса, который делегирует его своему потомку - наследование здесь вообще не при чем, в классе userModel можно вообще убрать "extends abstractModel". это по вашему "прозрачном" коду. Посмотрел ваш профиль
"Вэбкод" - это не увлечение (для меня по-крайней мере), это ежедневная работа по 8 часов, в т.ч. и с заказчиками которые хотят получить, то что они хотят, а не ссылки на умные статьи. Если вы где-то работаете, я бы на месте начальства по внимательнее пригляделся к вам, если не работаете - не надо строить из себя супер-гуру, которым вы не являетесь, хамом - да, гуру - нет, это разные вещи. |
| Автор: Simpliest 18.12.2009, 15:02 | ||
| Безотносительно ко всему обсуждавшемуся в топике, а почему именно метод должен быть статическим? И работает такое даже в PHP<5.3
|
| Автор: NewDima 18.12.2009, 15:08 | ||||
Ну это уже твое восприятие кода, я тебе говорил только про саму идею. Реализовывай как хочешь. Добавлено через 3 минуты и 31 секунду
А ты не смотрел, когда я поставил такой текст? Время идет. И у меня тоже есть заказчики, которые довольны результатами моей работы. И я работаю на СЕБЯ. Больше не переходи на личности Добавлено через 4 минуты и 26 секунд О, кстати, я действительно хам, можешь отметить это в карме |
| Автор: MyDarkSide 18.12.2009, 16:15 |
я смотрел твой кармалог - это не только мое мнение. По сколько тема перешла во флуд предлагаю её закрыть. |