Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: debug_backtrace() наоборот - возможно?
Форумы портала PHP.SU » » Вопросы новичков » debug_backtrace() наоборот - возможно?

Страниц (1): [1]
 

1. arimanecro - 16 Марта, 2018 - 09:25:16 - перейти к сообщению
Привет.

Можно ли как-то узнать, какие функции(методы) будут вызваны, то есть:



Метод one, знает что за ним есть ещё метод two, а метод two, знает о существовании three
Ну или на крайняк, хотябы узнать кол-во методов в цепочке.
=====
Не я один тут ищу ответ на этот вопрос ) но автору так никто и не ответил:
https://stackoverflow[dot]com/questi[dot][dot][dot]xt-function-name
2. andrewkard - 16 Марта, 2018 - 10:08:48 - перейти к сообщению
arimanecro пишет:
Не я один тут ищу ответ на этот вопрос ) но автору так никто и не ответил:

никто не знает будущего, в зависимости от конкретной задачи код может пойти по одним методам, в другой - по другим.
Теоретически наверное можно написать анализатор файлов и искать вызовы, но не все так прозрачно.
Возможно поможет вызвать debug-backtrace в самом конце?
3. arimanecro - 16 Марта, 2018 - 10:21:01 - перейти к сообщению
andrewkard пишет:
Возможно поможет вызвать debug-backtrace в самом конце?


Нет не поможет, потому что первая функция должна знать, если за ней идет другая ф-ия, то возвращает одно, если нет, то другое.

Может это где-то "завалялось" при парсинге, в синтксическом дереве или что-то в этом роде? туда как-то можно попасть? Ниндзя
4. andrewkard - 16 Марта, 2018 - 10:44:14 - перейти к сообщению
arimanecro пишет:
$app->one()

возвращает объект, может это поможет?
Цитата:

method_exists — Checks if the class method exists
5. arimanecro - 16 Марта, 2018 - 11:16:28 - перейти к сообщению
andrewkard пишет:
method_exists — Checks if the class method exists


неее )
меня не интересует есть метод или нет, мне нужно знать, находится ли он в цепочке.
Ну я думаю и так понятно что я имею в виду, но все же, ещё немного уточню:

$app->one() -- оппа...я один значит верну только результат
$app->one()->two() -- оппа я не один, значит я не только отработаю, но и верну this

итд

Это получается тот же шаблон Билдер, но только там каждая функция возвращает this, а я хочу это контролировать.
6. andrewkard - 16 Марта, 2018 - 11:24:38 - перейти к сообщению
arimanecro пишет:
оппа...я один

т.е. значит что у него нет методов? Это же по факту объект.
Может это:
http://php.net/manual/ru/reflect...s.getmethods.php
(Добавление)
или
7. arimanecro - 16 Марта, 2018 - 11:52:35 - перейти к сообщению
andrewkard пишет:
т.е. значит что у него нет методов? Это же по факту объект.


как это нету? One это же и есть метод, когда я говорил "оппа я один" это я говорил от имени One, а не от $app ))
8. andrewkard - 16 Марта, 2018 - 12:01:33 - перейти к сообщению
Так?
PHP:
скопировать код в буфер обмена
  1.  
  2. class Object{
  3.     public function one(){
  4.         $methods = get_class_methods(new $this);
  5.  
  6.         if(count($methods) == 1){
  7.             return 123;
  8.         } else {
  9.             return $this;
  10.         }
  11.     }
  12. }
  13.  
  14. $app = new Object();
  15.  
  16. $result = $app->one();
  17.  
9. arimanecro - 16 Марта, 2018 - 12:11:06 - перейти к сообщению
нет, вообще не то )
мне кажется в моем первом посте самое понятное объяснение.
===
вот как $app->one() поймет, идет за ним в стеке вызовов ещё один метод или он один в цепочке?

может на англ.яз будет понятливее,..из той ссылки, что я выше указал:

Цитата:
For instance, if I was to:

$Class->someFunction()->anotherFunction();

In anotherFunction() I can know what previous function was called using debug_backtrace(), but in my case, how can I know from someFunction() that anotherFunction() is going to be called next ? Is this possible in PHP ?
10. andrewkard - 16 Марта, 2018 - 12:47:48 - перейти к сообщению
Абракадабра какая то, зачем это? Уверен что есть нормальные способы решения задачи без этого.

Ну да ладно, вызываем в методе someFunction debug_backtrace, берем линию, откуда он вызван, и файл, берем его содержимое, ищем эту строку, берем ее содержимое и смотрим что идет после вызова этого метода...
Не понял
11. arimanecro - 16 Марта, 2018 - 13:44:10 - перейти к сообщению
оооо..вот это уже идея, спс должно прокатить Здорово
===
andrewkard пишет:
зачем это?


ну это себе для удобства делаю вы*бон )

Например:



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

А что если сделать так, чтобы в каждом методе не прописывать this и не зависеть от последовательности вызовов, то есть, в случае, если каждый метод возвращал this, то:

PHP:
скопировать код в буфер обмена
  1. var_dump($app->one()); // object
  2.  
  3. var_dump($app->one()->two()); // object


Тупо и неудобно на самом деле же...А вот что я предлагаю, чтобы синтаксис был "умным":

PHP:
скопировать код в буфер обмена
  1.  
  2. var_dump($app->one()); // результат функции, например будет строка, а не возврат this, как выше
  3.  
  4. var_dump($app->one()->two()); // ага, теперь one понимает, что он должен отработать, а также вернуть this(чего он не делал во второй строчке), чтобы запустился two. Далее two смотрит, если за ним идет three, то кроме отработки он вернет this и т.д по всей цепочке.
  5.  

 

Powered by ExBB FM 1.0 RC1