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

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: debug_backtrace() наоборот - возможно?

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Без описания
arimanecro
Отправлено: 16 Марта, 2018 - 09:25:16
Post Id



Частый гость


Покинул форум
Сообщений всего: 209
Дата рег-ции: Май 2014  


Помог: 0 раз(а)




Привет.

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



Метод one, знает что за ним есть ещё метод two, а метод two, знает о существовании three
Ну или на крайняк, хотябы узнать кол-во методов в цепочке.
=====
Не я один тут ищу ответ на этот вопрос ) но автору так никто и не ответил:
https://stackoverflow.com/questions/48536852/is-there-a-php-function-opposite-to-debug-backtrace-get-the-next-function-name

(Отредактировано автором: 16 Марта, 2018 - 09:28:42)

 
 Top
andrewkard
Отправлено: 16 Марта, 2018 - 10:08:48
Post Id


Участник


Покинул форум
Сообщений всего: 1372
Дата рег-ции: Нояб. 2014  


Помог: 30 раз(а)




arimanecro пишет:
Не я один тут ищу ответ на этот вопрос ) но автору так никто и не ответил:

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



Частый гость


Покинул форум
Сообщений всего: 209
Дата рег-ции: Май 2014  


Помог: 0 раз(а)




andrewkard пишет:
Возможно поможет вызвать debug-backtrace в самом конце?


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

Может это где-то "завалялось" при парсинге, в синтксическом дереве или что-то в этом роде? туда как-то можно попасть? Ниндзя

(Отредактировано автором: 16 Марта, 2018 - 10:21:41)

 
 Top
andrewkard
Отправлено: 16 Марта, 2018 - 10:44:14
Post Id


Участник


Покинул форум
Сообщений всего: 1372
Дата рег-ции: Нояб. 2014  


Помог: 30 раз(а)




arimanecro пишет:
$app->one()

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

method_exists — Checks if the class method exists
 
 Top
arimanecro
Отправлено: 16 Марта, 2018 - 11:16:28
Post Id



Частый гость


Покинул форум
Сообщений всего: 209
Дата рег-ции: Май 2014  


Помог: 0 раз(а)




andrewkard пишет:
method_exists — Checks if the class method exists


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

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

итд

Это получается тот же шаблон Билдер, но только там каждая функция возвращает this, а я хочу это контролировать.

(Отредактировано автором: 16 Марта, 2018 - 11:18:09)

 
 Top
andrewkard
Отправлено: 16 Марта, 2018 - 11:24:38
Post Id


Участник


Покинул форум
Сообщений всего: 1372
Дата рег-ции: Нояб. 2014  


Помог: 30 раз(а)




arimanecro пишет:
оппа...я один

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



Частый гость


Покинул форум
Сообщений всего: 209
Дата рег-ции: Май 2014  


Помог: 0 раз(а)




andrewkard пишет:
т.е. значит что у него нет методов? Это же по факту объект.


как это нету? One это же и есть метод, когда я говорил "оппа я один" это я говорил от имени One, а не от $app ))
 
 Top
andrewkard
Отправлено: 16 Марта, 2018 - 12:01:33
Post Id


Участник


Покинул форум
Сообщений всего: 1372
Дата рег-ции: Нояб. 2014  


Помог: 30 раз(а)




Так?
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.  
 
 Top
arimanecro
Отправлено: 16 Марта, 2018 - 12:11:06
Post Id



Частый гость


Покинул форум
Сообщений всего: 209
Дата рег-ции: Май 2014  


Помог: 0 раз(а)




нет, вообще не то )
мне кажется в моем первом посте самое понятное объяснение.
===
вот как $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 ?
 
 Top
andrewkard
Отправлено: 16 Марта, 2018 - 12:47:48
Post Id


Участник


Покинул форум
Сообщений всего: 1372
Дата рег-ции: Нояб. 2014  


Помог: 30 раз(а)




Абракадабра какая то, зачем это? Уверен что есть нормальные способы решения задачи без этого.

Ну да ладно, вызываем в методе someFunction debug_backtrace, берем линию, откуда он вызван, и файл, берем его содержимое, ищем эту строку, берем ее содержимое и смотрим что идет после вызова этого метода...
Не понял
 
 Top
arimanecro
Отправлено: 16 Марта, 2018 - 13:44:10
Post Id



Частый гость


Покинул форум
Сообщений всего: 209
Дата рег-ции: Май 2014  


Помог: 0 раз(а)




оооо..вот это уже идея, спс должно прокатить Здорово
===
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.  
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB