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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Замена функциональности класса 
:(
    Опции темы
NewDima
Дата 24.2.2009, 10:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Возможно ли изменять функциональность класса на ходу?
Я имею ввиду, когда код класса достаточно большой, но класс предоставляет (например)
два режима работы, примерно так:
Код

class TMyClass
{
    ...
    private $mode = -1;
    public function setMode($value)
    {
        if ($mode!==-1) return false;
        $mode = $value;
        switch ($mode)
        {
            case 0:
            case 1: require_once("./mode_".$mode.".php"); break;
//подключить достаточно большой по
//объему код с методами для реализуемого
//класса
            default : 
        }
        return true;
    }
}

но это видится мне как-то вообще нереально.
вот так уже по-ближе к правде:
Код

class TMyClass
{
    ...
    private $mode = 0;
    public function setMode($value)
    {
        if ($mode!==-1) return false;
        $mode = $value;
        switch ($mode)
        {
            case 0:
            case 1: require_once("./mode_".$mode.".php"); break;
//подключить достаточно большой по
//объему код с методами для реализуемого
//класса
            default : 
        }
        return true;
    }
    public function someFuncPseudo($params)
    {
        someFunc($this, $params); // функция из подключенного в setMode скрипта
    }
}

но такой метод мне не нравится по двум соображениям:
1. для каждой функции придется описывать псевдоним
2. функции не будут иметь доступа к private-членам класса
Что посоветуете?

Это сообщение отредактировал(а) NewDima - 24.2.2009, 10:56
PM ICQ   Вверх
skyboy
Дата 24.2.2009, 11:01 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

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



напиши два класса-наследника TmyClass. каждый реализует отдельный "режим".
для переноса данных при смене "режима" используй объект отдельного класса или же просто сериализацию. это будет "кошернее" использования classkit.
PM MAIL   Вверх
NewDima
Дата 24.2.2009, 11:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



В принципе это выход, но хотелось бы услышать еще чьи-нибудь мнения =)
PM ICQ   Вверх
Sanchezzz
  Дата 24.2.2009, 14:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1670
Регистрация: 19.11.2006
Где: Voronezh

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



можно 

лично я использую такой метод 


Код

class core {
public $class; 

 function core(){}

 function loadClass($name){
  require_once("$name.".php"); 
  $this->class[$name] = new $name;
 }

}


Использование 

Код

$core = new core();
$core->load('mail');
$mail = new $clone->class['mail']; //или clone
$mail->send();

ну премерно так.








--------------------
Понравился ответ "+" по репе, не забываем закрывать тему, заказы в LS.
PM MAIL Skype GTalk   Вверх
NewDima
Дата 24.2.2009, 17:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



ха, немного не в тему, но все-равно спасибо, я о таком не думал =)
PM ICQ   Вверх
ksnk
Дата 24.2.2009, 19:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

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



Вот еще одно извращение "не в тему" smile Только если "расширение" - функции, без дополнительных переменных.
Код

class TMyClass {
  var $mode='';
  var $MyVar = 12345;

  function setMode($mode){
    $this->mode=$mode;
  }

  function call($func){
    $x=array($this->mode,$func);
    if(!class_exists($this->mode)){ // ленивый инклуд...
       include($this->mode.'.class.php') ;
    }
    if(is_callable($x)) {
       call_user_func($x,$this);
    } else {
       echo 'opps! :-(<br>';
    }    
  }

  function someFuncPseudo(){
    $this->call('someFuncPseudo');
  }

}

// функционал 1
class TMyClass1  {
  function someFuncPseudo(&$_this){
    echo 'TMyClass1.someFuncPseudo MyVar ->'.$_this-> MyVar.'<br>';
  }
}
// функционал 2
class TMyClass2  {
  function someFuncPseudo(&$_this){
    echo 'TMyClass2.someFuncPseudo MyVar ->'.$_this-> MyVar.'<br>';
  }
}

$obj= new TMyClass ();

$obj->setMode('TMyClass2');
$obj->someFuncPseudo();

$obj->setMode('TMyClass1');
$obj->someFuncPseudo();

Конечно, приватных пременных не видать, как своих ушей... 

Можно поразвивать тему, добавив массив всех классов, которыми расширяется TMyClass, тогда можно заюзать "собственные" функции и переменные "объекта-расширения" но боюсь получится какой-нибудь паттерн стандартный... Фабрика там какая или еще какой зверь...


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
NewDima
Дата 24.2.2009, 19:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



интересно, мне нравится, приму к сведению =)
PM ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

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


 




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


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

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