Модераторы: skyboy, MoLeX, Aliance, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> наследование и статические методы 
V
    Опции темы
MyDarkSide
Дата 11.12.2009, 17:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 69
Регистрация: 21.3.2008

Репутация: -1
Всего: -1



awdev
если в базовом классе сделать debug_backtrace() то про класс-потомок там нет ни слова, даже если вызов метода идет из класса потомка.  
PM ICQ   Вверх
awdev
Дата 11.12.2009, 18:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 72
Регистрация: 22.11.2009

Репутация: нет
Всего: 1



Ну так и я про что
Цитата

и стат методы выполняются в контексте того класса, где они были объявлены изначально. 


PM MAIL   Вверх
nerezus
Дата 13.12.2009, 17:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вселенский отказник
****


Профиль
Группа: Участник
Сообщений: 3330
Регистрация: 15.6.2005

Репутация: нет
Всего: 43



Тему не читал, но почти наверняка подойдет фабрика )
Судя по другим прочитанным темам с таким вопросом.


--------------------
Сообщество художников Artsociety.ru
PM MAIL WWW   Вверх
MyDarkSide
Дата 14.12.2009, 10:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 69
Регистрация: 21.3.2008

Репутация: -1
Всего: -1



nerezus,  сейчас именно так и сделал. завтра UML прикреплю, а в коде так:

есть два класса User extends AbstractModel  и UserCollection extends AbstractCollection (здесь и далее User для примера)

есть функция-фабрика Collection($name) которая производит коллекции. А коллекции в результате поиска возвращают один или массив объектов User. 

Код

function Collection($name) {
  return new $name . 'Collection'; // упрощенно
}


$user = Collection('User')->getById(10);
echo  $user->isOnline();


PM ICQ   Вверх
nerezus
Дата 14.12.2009, 12:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вселенский отказник
****


Профиль
Группа: Участник
Сообщений: 3330
Регистрация: 15.6.2005

Репутация: нет
Всего: 43



Как сказал один уважаемый человек, static и наследование не совместимы.
И при программировании стоит это помнить.

Я не знал это и потратил 2 дня на казалось бы "мегакрутую" архитектуру. 
Переделал за полчаса потом за действительно норальную, т.к. не мог исправить многие косяки без кучи костылей.


--------------------
Сообщество художников Artsociety.ru
PM MAIL WWW   Вверх
MyDarkSide
Дата 14.12.2009, 14:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 69
Регистрация: 21.3.2008

Репутация: -1
Всего: -1



nerezus, именно ! та же х...я самое главное перечитал кучу манов и букварей, и нигде даже намека не было на такую "особенность" статики
PM ICQ   Вверх
NewDima
Дата 14.12.2009, 18:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 922
Регистрация: 20.2.2006
Где: <?here?>

Репутация: нет
Всего: 12



MyDarkSide, блин, да это логично вытекает из самой природы статичных методов.
А по поводу фабрики, так мой код - тоже фабрика, если не заметили. Какая разница,
Код

$user = Collection('User')->getById(10);

или
Код

$user = Collection::getUserById(10);

Кто скажет?
Только не нужно говорить о непроизводительности магических методов и прочей чепухе.
А, ну да, мы же пишем ниже 5.3.2, это главная причина
PM ICQ   Вверх
MyDarkSide
Дата 15.12.2009, 11:03 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 69
Регистрация: 21.3.2008

Репутация: -1
Всего: -1



Цитата(NewDima @  14.12.2009,  18:57 Найти цитируемый пост)
MyDarkSide, блин, да это логично вытекает из самой природы статичных методов.

Вот когда разобъешь об это лоб - то да подумав, впринципе логично, но не мешало бы и хоть словом обмолвиться, про менее важные вещт трубят и разжёвывают, а тут какое то белое пятно, у того же Котерова про 5PHP половина книги посвящена XML, а тут хоть бы строчку...
 

Цитата(NewDima @  14.12.2009,  18:57 Найти цитируемый пост)
1:
    
$user = Collection::getUserById(10);


разница есть, в каждом классе модели могут быть определены свои специфические методы выборки, например для выборки сегодняшних именниников, в моем коде вызов останется прозрачным
Код

$user = Collection('User')->getTodayIsBirthday();

в твоем коде
Код

$user = User::getTodayIsBirthday();



PM ICQ   Вверх
nerezus
Дата 15.12.2009, 11:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вселенский отказник
****


Профиль
Группа: Участник
Сообщений: 3330
Регистрация: 15.6.2005

Репутация: нет
Всего: 43



Цитата

у того же Котерова про 5PHP половина книги посвящена XML
 Да ему просто влом было писать - вот мануал и пересказывает.
Так многие авторы делают, тот же Шилдт.


--------------------
Сообщество художников Artsociety.ru
PM MAIL WWW   Вверх
NewDima
Дата 16.12.2009, 07:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 922
Регистрация: 20.2.2006
Где: <?here?>

Репутация: нет
Всего: 12



Цитата(MyDarkSide @ 15.12.2009,  18:03)
Код

$user = Collection('User')->getTodayIsBirthday();

Интересно, что возвращает метод getTodayIsBirthday? булево значение (судя по названию)?
Что за пример ты привел? Бред какой-то
Мой код будет примерно таким:
Код

$user = Collection::getUserByBirthday($data)

Еще раз говорю, всмотрись внимательно, между этим
Код

$user = Collection('User')->getById(10);

и этим
Код

$user = Collection::getUserById(10);

разница минимальна, можно сказать, что только в записи.
Первый способ:
Collection('User') возвращает объект типа User, метод getById вызывается в контексте его же.
Второй способ:
Все намного прозрачнее
PM ICQ   Вверх
MyDarkSide
Дата 17.12.2009, 01:31 (ссылка)    | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 69
Регистрация: 21.3.2008

Репутация: -1
Всего: -1



Цитата(NewDima @  16.12.2009,  07:58 Найти цитируемый пост)
Интересно, что возвращает метод getTodayIsBirthday? булево значение (судя по названию)?
Что за пример ты привел? Бред какой-то

 прежде чем хамить надо внимательно прочитать пост:
  
Цитата(MyDarkSide @  15.12.2009,  11:03 Найти цитируемый пост)
например для выборки сегодняшних именниников


во-вторых это тема НЕ про названия методов, каждый волен называть как ему нравится.

Цитата(NewDima @  16.12.2009,  07:58 Найти цитируемый пост)
разница минимальна, можно сказать, что только в записи.


Цитата(NewDima @  16.12.2009,  07:58 Найти цитируемый пост)
Мой код будет примерно таким:
$user = Collection::getUserByBirthday($data)


т.е. у тебя метод getUserByBirthday() - будет определен в классе Collection ? и ещё 100 других методов  типа: выбрать не прочтенные комментарии, посты за сегодня, не прочтенные ПМ, кто пинал мою карму и т.д. ? как-то не очень..  

PM ICQ   Вверх
NewDima
Дата 17.12.2009, 11:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 922
Регистрация: 20.2.2006
Где: <?here?>

Репутация: нет
Всего: 12



Цитата(MyDarkSide @ 17.12.2009,  08:31)
т.е. у тебя метод getUserByBirthday() - будет определен в классе Collection ? и ещё 100 других методов  типа: выбрать не прочтенные комментарии, посты за сегодня, не прочтенные ПМ, кто пинал мою карму и т.д. ? как-то не очень..

явное непонимание азов...
читать азы здесь.
Если ты бы хоть взглянул на код, который я дал, то не ответил так, как ты это сделал. Присмотрись внимательней, можешь открыть экранную клавиатуру, если тебе без нее проблема прочитать код. В общем сделай что-нибудь, прежде чем говорить про код, который ты не прочитал. В нем даже НЕТ метода getUserById, представляешь? а он будет вызываться, вот так чудо!
PM ICQ   Вверх
MyDarkSide
Дата 18.12.2009, 12:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 69
Регистрация: 21.3.2008

Репутация: -1
Всего: -1



Цитата(NewDima @  17.12.2009,  11:43 Найти цитируемый пост)
явное непонимание азов...
читать азы здесь.

судя по твоему коду азам могут поучить тебя даже первокурсники.
Аргументирую, твой код:
Код

abstract class abstractModel {
    static protected $__prefix = 'tbl_';
    static public function __callStatic($method, $params) {
        if (!preg_match('#^get(\w+)By(\w+)$#', $method, $matches) || !count($params)) {
            throw new exception('dwad');
        }
        $tb_name = self::$__prefix . ($name = strtolower($matches[1])) . 's';
        $tb_by   = strtolower($matches[2]);
        $data    = self::loadData($tb_name, $tb_by, $params[0]);
        $class   = $name.'Model';
        return new $class($data);
    }
    static protected function loadData($table, $domain, $where) {
        return array($domain => $where);
    }
}
class userModel extends abstractModel {
    protected $data = null;
    public function __construct($data) {
        $this->data = $data;
    }
}
$user = abstractModel::getUserById();

1. Регулярка в методе, которая определяет какой метод "перевызвать",  необходимость её применения надо обосновать.
2. Вы Очень не внимательно читаете топик-старты:
    2.1 Речь идет о PHP5, но более ранем чем 5.3, соответственно функции там __callStatic() - там нет, иначе бы и мой код можно было заставить работать более прозрачным способом.
    2.2 Речь идет о нормальном механизме наследования, в твоем коде, вы решаете совсем другую задачу,а именно сделать так, чтобы вызов метода типа МодельByПоле - выбирало запись из таблицы по определенному полю и всё. А что вы будете делать если надо будет добавить пагинаторы сюда, сортировки, выборки из 2 или более связанных таблиц - лепить новые регулярки ? а если выборка вообще не с полем связана а например, нужно получить время последней модификации таблицы модели, как выкручиваться будете ? наверно опять регуляркой.
3. Как работает нормальное наследование: есть базовый класс, часто объявленный как абстрактный, содержащий общее поведение для объектов своего класса,  и есть его потомки, конкретизирующие поведение для своего подкласса, создается экземпляр потомка и вызов происходит методов потомка, который имеет доступ к общим методом объявленным в базовом классе, ты предлагаешь вызывать метод базового класса, который делегирует его своему потомку - наследование здесь вообще не при чем, в классе userModel можно вообще убрать "extends abstractModel". 

это по вашему "прозрачном" коду. 

Посмотрел ваш профиль 
Цитата
Увлечения 
Вэбкод
        
"Вэбкод" - это не увлечение (для меня по-крайней мере), это ежедневная работа по 8 часов, в т.ч. и с заказчиками которые хотят получить, то что они хотят, а не ссылки на умные статьи. Если вы где-то работаете, я бы на месте начальства по внимательнее пригляделся к вам, если не работаете - не надо строить из себя супер-гуру, которым вы не являетесь, хамом - да, гуру - нет, это разные вещи.  
PM ICQ   Вверх
Simpliest
Дата 18.12.2009, 15:02 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 625
Регистрация: 1.9.2009

Репутация: нет
Всего: 3



Безотносительно ко всему обсуждавшемуся в топике, а почему именно метод должен быть статическим?

И работает такое даже в PHP<5.3
Код

<?php
abstract class ParentClass {
    public function method1() {
        $this->method2();
    }

    public function method2() {
        echo 'Hey, i\'m Parent';
    }
}

class Child extends ParentClass {
    public function method2() {
        echo 'Hey, i\'m Child';
    }
}

$c = new Child();

$c->method1();



--------------------
user posted image
PM   Вверх
NewDima
Дата 18.12.2009, 15:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 922
Регистрация: 20.2.2006
Где: <?here?>

Репутация: нет
Всего: 12



Цитата(MyDarkSide @ 18.12.2009,  19:10)
в твоем коде, вы решаете совсем другую задачу,а именно сделать так, чтобы вызов метода типа МодельByПоле - выбирало запись из таблицы по определенному полю и всё. 

Ну это уже твое восприятие кода, я тебе говорил только про саму идею. Реализовывай как хочешь.

Добавлено через 3 минуты и 31 секунду
Цитата(MyDarkSide @ 18.12.2009,  19:10)
"Вэбкод" - это не увлечение (для меня по-крайней мере), это ежедневная работа по 8 часов, в т.ч. и с заказчиками которые хотят получить, то что они хотят, а не ссылки на умные статьи.

А ты не смотрел, когда я поставил такой текст? Время идет. И у меня тоже есть заказчики, которые довольны результатами моей работы. И я работаю на СЕБЯ. Больше не переходи на личности

Добавлено через 4 минуты и 26 секунд
О, кстати, я действительно хам, можешь отметить это в карме
PM ICQ   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса

Внимание: данный раздел предназначен для решения сложных, нестандартных задач.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Для профи | Следующая тема »


 




[ Время генерации скрипта: 0.1369 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.