У меня есть класс (пусть myclass1) и есть класс myclass2. Мне необходимо менять один метод класса myclass1, но осложняется все тем, что в классе mycalss2 используется экземпляр myclass1.. Подскажите, как стоит поступать? ps В ООП новичок, сильно не бейте.
жизненный пример велик, поэтому приведу такой PHP: class myclass1 { function say () { echo "mooo\n"; } .......... } class myclass2 { .......... function foo(){ .......... $say = new myclass1; $say->say(); } } myclass2::foo(); Тут метод say в зависимости от ситуации должен быть разным
Вариант PHP: class myclass3 extands myclass1 { function say () { echo "rakatika!\n"; } } могу бы подойти, если бы не 11 строка предыдущего примера..
Это ищешь? PHP: <?php class myclass2 { functin foo() { $say = new myclass1(); $situation = 'say'; $say->$situation(); } } /* второй вариант */ class myclass2 { functin foo() { $situation = Singletoon::instance('SituationFactory'); $situation->say(); } } ?>
free опиши ситуацию словами, если не можешь дать ясный пример. В зависимости от какой ситуации метод должен меняться?
У меня есть класс который получает и обрабатывает различные данные. Получение их всегда одинаково, обработка различна. Метод который обрабатывает данные мне нужно уметь заменять. Я мог бы *не знаю как правильно называется* воспользоваться оператором extends, создавая копию класса с измененным методом. При этом имя класса изменится. Мне нельзя этого допускать потому что это класс используется внутри другого класса.. То есть мне нужен некий универсальный метод создания класса-шаблона. ps Чувствую опять что-то не так объяснил.
Посмотри на __call(). В зависимости от имени метода можно в классе подменять функциями. Типа такого: Сам класс: Код (Text): class myclass2 { //... function __call($method, $args){ array_unshift($args, $this); call_user_func_array($method, $args); } //... } Переопределение на месте: Код (Text): function lolipop($self, $param1, $param2){ echo 'Say: "'.$self->say.'". Param1: "'.$param1.'". Param2: "'.$param2.'".'; } $myclass2 = new myclass2; $myclass2->say = 'Ы, лол.'; $myclass2->lolipop('Превед', 'Медвед'); Кошерно?
Это называется шаблон фабрика. Его примерно topas показал. Поглядеть еще тут - http://www.php.net/manual/ru/language.oop5.patterns.php
PHP: <?php abstract class DataProc { protected $data; public function __construct() { $this->data = 'Hello!'; } abstract public function process() {} } class Creator { public static function createProc($what) { if ($what == 1) { return new Proc1(); } else { return new Proc2(); } } } class Proc1 extends DataProc { public function process() { print '<em>' . $this->data . '</em>'; } } class Proc2 extends DataProc { public function process() { print '<strong>' . $this->data . '</strong>'; } } class MyClass { public function test() { $proc = Creator::createProc(1); // $proc = $dp->createProc(2); // и т.д. $proc->process(); } }
для этого существуют патерны локаторы которые развязывают отношения приемника/передатчика. и незачем мудрить тут. грубо говоря ты устанавливаешь связь между write->read и далее run. и все. p.s. ИМХО когда гачинаются извращения типа $myclass-.$mymethod()->Foo() то скорей всего не правильно спроектирована ООП модель. Это просто от незнания и неумения работать именно в ООП. Чаще всего такое происходит когда классы воспринимают как инкапсуляторы функций. =)
Все большое спасибо. Я пошел читать мануалы Посто не знал даже в какую сторону смотреть. Похоже, что Patterns - это как раз то, что нужно. Будут вопросы, я еще вернусь )