Имя вызванного метода

tz-lom

Продвинутый новичок
Собственно сабж , о существовании __METHOD__ я в курсе, но он превращается в строку ещё на этапе синтаксического анализа, а не в рантайме. Мне хочется что то аналогичное get_called_class() только для метода, чтобы делать например такие штуки:

PHP:
class A {
  public function get(){ return rand(0,100); }
  public function get2(){ return rand(-100,0); }
  public function get3(){ return rand(100,200); }
}

trait Cache {
  public function cache(){
        static $cache = NULL;
        if($cache===NULL)
        {
          $cache = call_user_func_array(['parent',get_called_method()],func_get_args());
        }
        return $cache;
  }
}

class B extends A {
  use Cache { cache as get; cache as get2;}
}

$c = new B();

echo $c->get(),"\t",$c->get2(),"\t",$c->get3(),"\n";
echo $c->get(),"\t",$c->get2(),"\t",$c->get3(),"\n";
echo $c->get(),"\t",$c->get2(),"\t",$c->get3(),"\n";
но вот как реализовать get_called_method я не особенно представляю.
Есть конечно вариант через debug_backtrace , но получилось "слегка" медленно(даже с ограничением разворачивания стека).
ПоэтомуОт нефиг делать был накорябан патч реализующий эту операцию быстро.
Собственно вопрос в том можно ли это делать как то ещё, а если нет, то кто мог бы посмотреть патч на наличие в нём ошибок (зенд вижу в первый раз).
 

tz-lom

Продвинутый новичок
Не подойдёт, такая же история как и с __METHOD__
 

Вурдалак

Продвинутый новичок
BTW, хоть в мануале вроде и не сказано, но можно использовать свойства, а не только методы в traits (просто мысли вслух). Т.е. всякие singleton'ы, если кому нужны, очень хорошо через traits теперь решать.
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
tz-lom
На ум приходит только __call(); Но это реализация через чужую жопу...
 

tz-lom

Продвинутый новичок
Ага, причём примерчик работать всё равно не будет
 

tony2001

TeaM PHPClub
расскажите мне - зачем всё сначала оборачивать во всякие синтаксические сахары, чтобы потом вынимать оттуда информацию типа "так что же всё-таки мы вызвали?" ?
может быть это можно сделать, а может и нет, надо смотреть код, но мне интересно в первую очередь не "как?", а "зачем?".
 

tz-lom

Продвинутый новичок
Пример в топике - можно было бы делать трейты которые модифицируют поведение методов, но тогда нужно им как то дать понять а какой же метод они модифицируют.
Вообще это не из серии "ааа,спасите помогите,ничего не работает"
Просто я смотрю что можно было бы делать с трейтами, и такая возможность мне кажется полезной.
 

AmdY

Пью пиво
Команда форума
tz-lom
проксировать можно и через магические __get __set __call, причём делать это будет удобнее и гибче, даже рантайм можно плагины подключать.
Трейтсами можно заменять множественное наследование.

Использование подобным образом считаю неудачным, особенно переназначая имеющиеся методы.
 

tz-lom

Продвинутый новичок
Можно конечно делать декоратор, но не всегда есть абстрактный класс/интерфейс чтобы остался тайп хинтинг (а переделывать чужой код не всегда уместно)

С тем что так использовать - это грабли я согласен, но всё таки, такая возможность есть (переименовывать и дублировать методы трейта) , и при этом не понятно когда она нужна если нет никакого способа узнать во что же переименовались
 
Сверху