Откуда была вызвана функция php

php: определить, откуда была вызвана функция

Есть ли способ узнать, откуда была вызвана функция в PHP? пример:

function epic() < fail(); >function fail() < //at this point, how do i know, that epic() has called this function? >

8 ответов

Ты можешь использовать debug_backtrace() ,

 function fail( $string ) < $backtrace = debug_backtrace(); print_r( $backtrace ); >epic( 'Hello', 'World' ); 
Array ( [0] => Array ( [file] => /Users/romac/Desktop/test.php [line] => 5 [function] => fail [args] => Array ( [0] => Hello World ) ) [1] => Array ( [file] => /Users/romac/Desktop/test.php [line] => 15 [function] => epic [args] => Array ( [0] => Hello [1] => World ) ) ) 

Самое быстрое и простое решение, как я нашел

public function func() < //function whose call file you want to find $trace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 1); >$trace: Array ( [0] => Array ( [file] => C:\wamp\www\index.php [line] => 56 [function] => func [class] => (func Class namespace) [type] => -> ) ) 

Тестирую скорость на ноутбуке Lenovo: процессор Intel Pentiom N3530 2,16 ГГц, оперативная память 8 ГБ

global $times; $start = microtime(true); $trace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 1); $times[] = microtime(true) - $start; 
count($times): 97 min: 2.6941299438477E-5 max: 10.68115234375E-5 avg: 3.3095939872191E-5 median: 3.0517578125E-5 sum: 321.03061676025E-5 the same results with notation without E-5 count($times): 97 min: 0.000026941299438477 max: 0.0001068115234375 avg: 0.000033095939872191 median: 0.000030517578125 sum: 0.0032103061676025 

Так что, если вы все еще ДЕЙСТВИТЕЛЬНО не знаете как, то вот решение:

$backtrace = debug_backtrace(); echo 'Mu name is '.$backtrace[1]['function'].', and I have called him! Muahahah!'; 
foreach(debug_backtrace() as $t) < echo $t['file'] . ' line ' . $t['line'] . ' calls ' . $t['function'] . "()
"; >

Если вы хотите отследить точное происхождение вызова на вершине стека, вы можете использовать следующий код:

$call_origin = end(debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS)); 

Это будет игнорировать цепочечные функции и получать только наиболее релевантную информацию о вызовах (релевантно используется свободно, так как это зависит от того, что вы пытаетесь выполнить).

function findFunction($function, $inputDirectory="") < //version 0.1 $docRoot = getenv("DOCUMENT_ROOT"); $folderArray = null; $dirArray = null; // open directory $directory = opendir($docRoot.$inputDirectory); // get each entry while($entryName = readdir($directory)) < if(is_dir($entryName) && $entryName != "." && $entryName != "..")< $folderArray[] = str_replace($inputDirectory, "", $entryName); >$ext = explode(".", $entryName); if(!empty($ext[1])) < $dirArray[] = $docRoot.$inputDirectory."/".$entryName; >> // close directory closedir($directory); $found = false; if(is_array($dirArray))< foreach($dirArray as $current)< $myFile = file_get_contents($current); $myFile = str_replace("", "", $myFile); if(preg_match("/function ".$function."/", $myFile)) < $found = true; $foundLocation = $current; break; >> > if($found) < echo $foundLocation; exit; >else if(is_array($folderArray)) < foreach($folderArray as $folder)< if(!isset($return))< $return = findFunction($function, $inputDirectory."/".$folder); >else if($return == false) < $return = findFunction($function, $inputDirectory."/".$folder); >> > else < return false; >> findFunction("testFunction", "rootDirectory"); 

Надеюсь, это кому-нибудь поможет. Если фактическая функция находится за пределами httpdocs, ее нельзя найти, поскольку сервер будет настроен так, чтобы это не разрешалось. Только проверил его на глубину, но теоретически рекурсивная методология должна работать.

Читайте также:  Windows credential manager python

Это похоже на версию 0.1, но я не намерен продолжать ее разработку, поэтому, если кто-то обновит ее, не стесняйтесь перепечатывать ее.

Источник

php: определить, откуда была вызвана функция

есть ли способ узнать, откуда была вызвана функция в PHP? пример:

function epic() < fail(); >function fail() < //at this point, how do i know, that epic() has called this function? > 

Вы можете использовать debug_backtrace() .

 function fail( $string ) < $backtrace = debug_backtrace(); print_r( $backtrace ); >epic( 'Hello', 'World' ); 
Array ( [0] => Array ( [file] => /Users/romac/Desktop/test.php [line] => 5 [function] => fail [args] => Array ( [0] => Hello World ) ) [1] => Array ( [file] => /Users/romac/Desktop/test.php [line] => 15 [function] => epic [args] => Array ( [0] => Hello [1] => World ) ) ) 

Так что, если вы все еще ДЕЙСТВИТЕЛЬНО не знаете, как это, а вот решение:

$backtrace = debug_backtrace(); echo 'Mu name is '.$backtrace[1]['function'].', and I have called him! Muahahah!'; 

Самое быстрое и простое решение, которое я нашел

public function func() < //function whose call file you want to find $trace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 1); >$trace: Array ( [0] => Array ( [file] => C:\wamp\www\index.php [line] => 56 [function] => func [class] => (func Class namespace) [type] => -> ) ) 

Я тестирую скорость на ноутбуке Lenovo: процессор Intel Pentium N3530 2,16 ГГц, оперативная память 8 ГБ

global $times; $start = microtime(true); $trace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 1); $times[] = microtime(true) - $start; 
count($times): 97 min: 2.6941299438477E-5 max: 10.68115234375E-5 avg: 3.3095939872191E-5 median: 3.0517578125E-5 sum: 321.03061676025E-5 the same results with notation without E-5 count($times): 97 min: 0.000026941299438477 max: 0.0001068115234375 avg: 0.000033095939872191 median: 0.000030517578125 sum: 0.0032103061676025 

Попробуйте ввести код ниже.

foreach(debug_backtrace() as $t) < echo $t['file'] . ' line ' . $t['line'] . ' calls ' . $t['function'] . "()
"; >
function findFunction($function, $inputDirectory="") < //version 0.1 $docRoot = getenv("DOCUMENT_ROOT"); $folderArray = null; $dirArray = null; // open directory $directory = opendir($docRoot.$inputDirectory); // get each entry while($entryName = readdir($directory)) < if(is_dir($entryName) && $entryName != "." && $entryName != "..")< $folderArray[] = str_replace($inputDirectory, "", $entryName); >$ext = explode(".", $entryName); if(!empty($ext[1])) < $dirArray[] = $docRoot.$inputDirectory."/".$entryName; >> // close directory closedir($directory); $found = false; if(is_array($dirArray))< foreach($dirArray as $current)< $myFile = file_get_contents($current); $myFile = str_replace("", "", $myFile); if(preg_match("/function ".$function."/", $myFile)) < $found = true; $foundLocation = $current; break; >> > if($found) < echo $foundLocation; exit; >else if(is_array($folderArray)) < foreach($folderArray as $folder)< if(!isset($return))< $return = findFunction($function, $inputDirectory."/".$folder); >else if($return == false) < $return = findFunction($function, $inputDirectory."/".$folder); >> > else < return false; >> findFunction("testFunction", "rootDirectory"); 

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

Это похоже на версию 0.1, но я не намерен продолжать ее разработку, поэтому, если кто-то обновляет ее, он может перепроверить ее.

Читайте также:  Контрольная работа питон массивы

Источник

php: определить, откуда была вызвана функция

Это определенно делает то, что вы хотите. Но будьте осторожны, debug_backtrace() — дорогой вызов. Не привыкать использовать его для определения цепочек вызовов. Если вы хотите «защитить» эти функции, проверьте ООП и защищенные методы.

Итак, если вы все еще ДЕЙСТВИТЕЛЬНО не знаете, как это сделать, то вот решение:

$backtrace = debug_backtrace(); echo 'Mu name is '.$backtrace[1]['function'].', and I have called him! Muahahah!'; 

Да, но не надо! Во всяком случае, не в постоянном коде приложения. Используйте параметры. debug_backtrace () выглядит как довольно тяжелая операция.

Самое быстрое и простое решение, которое я нашел

public function func() < //function whose call file you want to find $trace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 1); >$trace: Array ( [0] => Array ( [file] => C:\wamp\www\index.php [line] => 56 [function] => func [class] => (func Class namespace) [type] => -> ) ) 

Я тестирую скорость на ноутбуке Lenovo: процессор Intel Pentiom N3530 2,16 ГГц, оперативная память 8 ГБ

global $times; $start = microtime(true); $trace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 1); $times[] = microtime(true) - $start; 
count($times): 97 min: 2.6941299438477E-5 max: 10.68115234375E-5 avg: 3.3095939872191E-5 median: 3.0517578125E-5 sum: 321.03061676025E-5 the same results with notation without E-5 count($times): 97 min: 0.000026941299438477 max: 0.0001068115234375 avg: 0.000033095939872191 median: 0.000030517578125 sum: 0.0032103061676025 
foreach(debug_backtrace() as $t) < echo $t['file'] . ' line ' . $t['line'] . ' calls ' . $t['function'] . "()
"; >

Хорошее и прямое решение, чтобы получить обратную трассировку всех файлов, из которых вызывается определенная функция.

function findFunction($function, $inputDirectory="") < //version 0.1 $docRoot = getenv("DOCUMENT_ROOT"); $folderArray = null; $dirArray = null; // open directory $directory = opendir($docRoot.$inputDirectory); // get each entry while($entryName = readdir($directory)) < if(is_dir($entryName) && $entryName != "." && $entryName != "..")< $folderArray[] = str_replace($inputDirectory, "", $entryName); >$ext = explode(".", $entryName); if(!empty($ext[1])) < $dirArray[] = $docRoot.$inputDirectory."/".$entryName; >> // close directory closedir($directory); $found = false; if(is_array($dirArray))< foreach($dirArray as $current)< $myFile = file_get_contents($current); $myFile = str_replace("", "", $myFile); if(preg_match("/function ".$function."/", $myFile)) < $found = true; $foundLocation = $current; break; >> > if($found) < echo $foundLocation; exit; >else if(is_array($folderArray)) < foreach($folderArray as $folder)< if(!isset($return))< $return = findFunction($function, $inputDirectory."/".$folder); >else if($return == false) < $return = findFunction($function, $inputDirectory."/".$folder); >> > else < return false; >> findFunction("testFunction", "rootDirectory"); 

Надеюсь, это поможет кому-то. Если фактическая функция находится за пределами httpdocs, она не может быть найдена, потому что сервер будет настроен так, чтобы не разрешать ее. Тестировал только одну папку, но рекурсивная методология должна работать теоретически.

Это похоже на версию 0.1, но я не намерен продолжать его разработку, поэтому, если кто-то обновляет его, он может перепроверить его.

Слишком много работы: добавьте это в .bashrc function ff() < grep "function $1" $(find ./ -name "*.php") >затем вызовите ff fail или ff epic . см .: github.com/MaerF0x0/VimSetup/blob/master/bashrc#L122

Читайте также:  Twig php с extension

Ещё вопросы

  • 0 C ++ скопировать #define в массив символов
  • 1 Как добавить ‘-‘ в YAML, используя словарь / JSON?
  • 0 C ++ == перегрузка операторов (имплементации)
  • 1 какой тип лучше всего подходит для трех радиокнопок?
  • 1 Как это сделать, если вы не хотите читать всю строку?
  • 0 Проверьте соединение для URL — загрузка изображения
  • 1 как показать и скрыть слово в поле пароля, нажав на кнопку
  • 1 C # WPF. Как динамически добавлять эллипсы в холст?
  • 1 Ошибка Android при загрузке неправильных цветов в ночном режиме
  • 0 Строка C ++, присваивающая значения функции at (int)
  • 1 Большие проблемы с памятью матрицы
  • 3 Добавление нескольких перехватчиков в OkHttpClient
  • 1 Можно ли выполнить стартовый код в службе WCF до того, как кто-то подключится?
  • 1 Volley parrams, как отправить значение 95, чтобы сервер не получил «95», но он получит 95
  • 0 $ window.open все еще открывает URL в приложении phonegap (угловой)
  • 1 Часто неправильно используется: аутентификация — фортификация
  • 1 Развертывание таблиц базы данных в порядке взаимосвязи с ограничениями
  • 0 Вложенная директива в ngView не работает Angular JS
  • 0 Как установить Qwidget внутри QGraphicsWidget?
  • 1 Как разделить длинную сопрограмму без использования await?
  • 0 Как показать элемент из массива json один за другим в Angular JS
  • 1 Ansible: изменить интерпретатор python при делегировании
  • 1 Как получить размер итератора без зацикливания?
  • 0 Регулярное выражение для добавления кавычек в столбцы CSV без кавычек
  • 0 MySQLi_fetch_Array пропускает первый ряд
  • 0 $ (). attr (). html ();
  • 0 Плагин Firebreath не может быть загружен на Mac OS 10.7
  • 0 изменить первое и последнее значение строки PHP
  • 1 Использование заполнителя в StringBuilder
  • 1 Как BigInteger интерпретирует байты из строки?
  • 1 Как сопоставить элементы JAXB в CIM / RDF?
  • 1 На уровне модели, это хорошая идея для составления типов с идентификаторами, в отличие от прямых ссылок?
  • 1 Build.gradle Не удалось разрешить com.android.support
  • 0 функция slideToggle работает отдельно
  • 1 Потери Keras постоянно низкие, но точность начинается с высокой, а затем падает
  • 1 Подсчет Овец (Беатрикс Троттер) Javascript
  • 0 Как настроить вывод с помощью регулярного выражения в текстовой области
  • 0 Как посчитать, сколько раз был выполнен цикл? C ++
  • 1 Vue.js + Require.js расширяющий родительский
  • 1 чтение структуры каталогов и преобразование ее в объект JSON в Java
  • 1 WebView внутри ViewPager внутри NestedScrollView без вертикальной прокрутки
  • 0 Относительный путь 2 уровня вверх в JavaScript
  • 0 Почтовый штемпель в PHP 5: проверьте, была ли почта отклонена или была успешной
  • 0 C ++ возможные комбинации монет с использованием цикла while
  • 1 Как добавить заголовок лицензии Netbeans в старые файлы Java?
  • 0 phpmailer занимает 5 секунд .. пока php mail () занимает меньше 1
  • 0 Как получить метку времени из строки даты с часовым поясом, PHP?
  • 0 Центрирование растрового текста в прямоугольнике с помощью OpenGL
  • 1 Назначение «name» и «defaults» в config.Routes.MapHttpRoute
  • 0 Ionic $ scope.function срабатывает только один раз, затем выдает ошибку при новых кликах

Источник

Оцените статью