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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Для какого класса вызван static-метод? Как это узнать в PHP5 
:(
    Опции темы
be_nt_all
  Дата 27.3.2008, 11:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 27.2.2007
Где: Ростов-на-Дону

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



По ходу написания микро-ORM для использования c FrogCMS Framework возник один вопрос... Функции поиска для моделей в этом фреймворке реализуются как static-методы в которые передаётся имя класса.  Однако, хотелось бы писать не AsRecord::Find('Agents',array(...параметры поиска...)), а Agents::Find(array(...параметры поиска...)), заодно оставив возможность переопределения метода Find для AgentsМассив с описаниями связей таблицы хранится в виде static свойства модели

Пока сделал это с помощью грубой заглушки, определяю в каждом классе метод 
Код

  public static function find($args = null)
  {
    self::findForClass(__CLASS__,$args);
  }

однако в версии, которую я хотел бы показать сообществу желательно обойтись без такого "костыля". 
PM MAIL WWW   Вверх
IZ@TOP
Дата 27.3.2008, 13:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Панда-бир!
****


Профиль
Группа: Участник
Сообщений: 4795
Регистрация: 3.2.2003
Где: Бамбуковый лес

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



Могу предложить более красивый вариант:

Код

<?php

class AsRecord // extends ...
{
    protected static $className = null;
    // ...
    public static function Find($args)
    {
        if(!self::$factoryName) {
            throw new Exception('Error: not defined class name.');
        }
        // ...
        self::findForClass(self::$className, $args);
    }
}

class Agents extends AsRecord 
{
    protected static $className = 'Agents';
}

?>


Правда я не думаю, что подобная реализация идеологически правильна с точки зрения паттерна Factory. Но, по крайней мере, методы не дублируем.


--------------------
Один из розовых плюшевых-всадников апокалипсиса... очень злой...

Семь кругов ада для новых элементов языка
Мои разрозненные мысли
PM MAIL WWW ICQ Skype GTalk   Вверх
be_nt_all
  Дата 27.3.2008, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 27.2.2007
Где: Ростов-на-Дону

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



Цитата(IZ@TOP @  27.3.2008,  11:05 Найти цитируемый пост)
Могу предложить более красивый вариант:

К сожалению, не работает
Код

   self::$className

в статическом методе возвращает именно self::$className (для класса, в к-м метод определён) - т.е. null.

зы. или я не правильно понял строчку
Цитата(IZ@TOP @  27.3.2008,  11:05 Найти цитируемый пост)
if(!self::$factoryName) {

заменив !self::$factoryName на !self::$className


Это сообщение отредактировал(а) be_nt_all - 27.3.2008, 15:44
PM MAIL WWW   Вверх
IZ@TOP
Дата 27.3.2008, 16:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Панда-бир!
****


Профиль
Группа: Участник
Сообщений: 4795
Регистрация: 3.2.2003
Где: Бамбуковый лес

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



Цитата(be_nt_all @  27.3.2008,  15:23 Найти цитируемый пост)
сожалению, не работает
Выделить всёкод PHP
1:
    
   self::$className

в статическом методе возвращает именно self::$className (для класса, в к-м метод определён) - т.е. null.


Сорри, да, я опечатался. Нет factoryName, есть className. Ты его переопределяешь в классе потомке и используешь в factory методе унаследованном от родителя. Если ты его не определил, будет вызвано исключение.


Гы. Большой и жирный кол мне.

Так сделать не получится ибо статичные проперти и методы базового класса не видят наследников. На php.net где-то об этом сказано было.

Добавлено @ 16:50
Кстати. На одном из проектов, на котором я работаю, переписывали одну компоненту, где использовалась абстрактная фабрика. Подобный вопрос тогда так же стоял, в итоге решили использовать Name::factory(Name[, args]).

Это сообщение отредактировал(а) IZ@TOP - 27.3.2008, 16:52


--------------------
Один из розовых плюшевых-всадников апокалипсиса... очень злой...

Семь кругов ада для новых элементов языка
Мои разрозненные мысли
PM MAIL WWW ICQ Skype GTalk   Вверх
be_nt_all
Дата 27.3.2008, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 27.2.2007
Где: Ростов-на-Дону

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



Цитата(IZ@TOP @  27.3.2008,  14:42 Найти цитируемый пост)
Так сделать не получится ибо статичные проперти и методы базового класса не видят наследников. На php.net где-то об этом сказано было.

Ну, я уже в этом убедился экспериментально  smile  smile 
Цитата(IZ@TOP @  27.3.2008,  14:42 Найти цитируемый пост)
Кстати. Припоминаю что на одном из проектов на котором я работаю, так же нужна была абстрактная фабрика, и именно через Name::factory(Name[, args]) мы ее решили.

Хотелось бы немножко больше "синтаксического сахара", но, видимо, в PHP это невозможно... 

Спасибо за попытку помочь  smile .

PM MAIL WWW   Вверх
IZ@TOP
Дата 2.4.2008, 11:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Панда-бир!
****


Профиль
Группа: Участник
Сообщений: 4795
Регистрация: 3.2.2003
Где: Бамбуковый лес

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



be_nt_all, совершенно случайно наткнулся на статейку по теме http://blog.felho.hu/what-is-new-in-php-53...ic-binding.html. Может будет полезно.


--------------------
Один из розовых плюшевых-всадников апокалипсиса... очень злой...

Семь кругов ада для новых элементов языка
Мои разрозненные мысли
PM MAIL WWW ICQ Skype GTalk   Вверх
  
Ответ в темуСоздание новой темы Создание опроса

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

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


 




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


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

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