Php номер строки функции

Получить строку кода и файл, который выполняет текущую функцию в PHP?

Итак, любой способ получить имя файла и номер строки кода, выполняющего текущую функцию в PHP? EDIT для комментариев использования комментариев: Когда я использую backlog в моем объектно-ориентированном способе программирования, у меня есть следующая ситуация. Index.php

Этот пример будет возвращен как файл «Index.php», а как строка номер 4, здесь начинается класс. Тем не менее, предполагается вернуть файл TestClass.class.php и номер строки 6. Есть идея, как это исправить?

3 ответа

Вы можете использовать debug_backtrace(). http://us3.php.net/manual/en/function.debug-backtrace.php Итак, в вашей функции журнала вы сможете получить имя файла и номер строки, из которого была вызвана функция журнала. Я использую этот подход в своих классах ведения журнала, и он значительно сократил объем кода, необходимый для получения значимых данных журнала. Другим преимуществом будет читаемость. Магические константы, как правило, становятся довольно уродливыми, когда их смешивают со строками. Вот пример:

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

Вы должны быть более конкретным здесь. Можете ли вы показать мне, что вы получаете и что вместо этого вы ожидаете?

Здравствуйте, Лиор Коэн, не могли бы вы проверить мой отредактированный оригинальный пост? Я объяснил все подробно там. Спасибо!

Я только что скопировал и вставил ваш код, создал 3 файла и запустил их. Я получил именно те результаты, которые вы ожидали получить: TestClass.class.php, строка 6. Пожалуйста, убедитесь, что у вас точно такой же код, как в моем примере выше. Пройдите через 4 строки и убедитесь, что они точно такие же, как указано выше.

Я удивлен. Это работает. Я уверен, что проверил это вчера, и это, казалось, дало мне неправильные результаты. Ну, извините за это. Не уверен, что пошло не так, но теперь это работает.

$caller[«file»] возвращает весь путь! Возможно используйте basename($caller[«file»]) чтобы получить имя файла.

Начиная с PHP 5.4.0, вы можете отправить параметр с помощью debug_backtrace() чтобы ограничить количество возвращаемых кадров стека. Может быть хорошей идеей с точки зрения производительности использовать debug_backtrace(1) в этом случае использования.

Маленькая ошибка @Ivar, это должно быть: debug_backtrace (DEBUG_BACKTRACE_PROVIDE_OBJECT, 1). Первый параметр позволяет использовать битовую маску для следующих параметров: DEBUG_BACKTRACE_PROVIDE_OBJECT, DEBUG_BACKTRACE_IGNORE_ARGS.

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

Читайте также:  Popup forms in php

Если вы используете PHP 5.3, вы можете воспользоваться поздней статической привязкой и иметь метод базового класса log() и ваши дочерние классы могут вызывать его, но при этом сохранять статические ссылки на __FILE__ и __LINE__ .

Последний вариант будет просто передавать __FILE__ и __LINE__ в качестве параметров при вызове функции log() .

__FILE__ и __LINE__ могут быть более эффективными, хотя это добавляет беспорядок в коде. Кстати, возможно, правильная отладка могла бы заменить файловое / строковое журналирование, когда возникнет такая необходимость.

debug_backtrace() медленнее в 2 раза с __LINE__ , но это позволяет 100 вызовов в 1 мс для среднего компьютера или 1000 вызовов в 1 мс для мощного сервера. Так что это не так медленно, как может быть.

Это старый вопрос, но, видя, как мое решение не здесь, я предоставлю его для потомков

 try< throw new Exception(); >catch ( Exception $e )< $trace = $e->getTrace(); > $length = 0; foreach ($trace as $t) < if( $t['file'] != __FILE__ )< break; >++$length; > return array_slice( $trace, ($length - count( $trace ) )); 

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

Трассировка стека исключений практически такая же, как при выполнении debug_backtrace(true) .

Ещё вопросы

  • 1 Вычисление косинусного сходства между двумя тензорами в Керасе
  • 1 Android: чтение файлов — проблема OutOfMemory
  • 0 Получить имя класса документа
  • 1 Приложение магазина C #, получающее переменные данные Json
  • 1 Реализовать функцию Sliding Drawer как
  • 0 Сделайте верхнюю и нижнюю границу divs неровным краем
  • 1 ICAL Recurrence RULE Generation (RRULE)
  • 0 ошибка загрузки изображения с классом php и curl
  • 1 Извлекать числа по позиции в Пандах?
  • 1 Как можно использовать оператор равенства для байтовых массивов в Linq-to-Entities во время модульного тестирования?
  • 1 viewHolder.getAdapterPosition () в адаптере возвращает -1 позицию, и это вызвало IndexOutOfBoundException
  • 1 Обнаружение арабских символов в регулярных выражениях
  • 0 Загрузите файл, используя angularjs, asp.net
  • 1 Невозможно выполнить излучение в определенную комнату и клиента (Socket.io 2.0.2)
  • 0 Компиляция и использование OpenCV
  • 1 Недоступный файл
  • 0 MySQL: нужно выбрать список уникальных названий улиц из таблицы адресов
  • 1 Открытие JFrame из другого пакета в главном окне
  • 1 IQueryable в репозитории
  • 0 после закрытия окна оповещения кнопка отправки не активируется
  • 0 Считать значения списка радиокнопок
  • 1 Хеширование в Java отрицательных чисел
  • 0 Можно ли манипулировать выводом html элемента управления на страницу?
  • 1 Получить все несжатые байты из сжатого файла
  • 0 Использование JQuery для редактирования атрибутов данных на определенных элементах DOM
  • 0 Как получить preg_replace () для удаления текста между двумя тегами?
  • 0 Альтернатива многократному использованию if-else в базе кода
  • 1 Как добавить комментарий в ревизионную сущность?
  • 1 Ошибка выполнения на ACM-ICPC Live Archive 3242 — Криптекс Да Винчи
  • 0 cv :: putText в IplImages
  • 1 ItemRegister Iterator
  • 0 Нужно ли удалять этот объект? (если я не собираюсь когда-либо удаляться)
  • 0 Добавить значение даты и времени
  • 1 Javascript, имя функции с интерполяцией строк [дубликаты]
  • 1 C # x509Certificate2 не может быть создан
  • 0 Бесконечный цикл Date на одном сервере, но работает на другом и localhost
  • 0 Учебное пособие по Google Blobstore App Engine
  • 1 Как остановить масштабирование навигационной панели инструментов Matplotlib при обновлении графика?
  • 0 Бинарный столбец SQL, если пользователь играл
  • 0 PHP — определение даты в будущем
  • 1 Визуализация времени разработки пользовательских элементов управления в пользовательском Region / RegionManager
  • 1 Lwjgl, как упростить карту высот, чтобы получить более высокие fps?
  • 1 Задача «ConvertResourcesCases» неожиданно завершилась неудачей. Xamarin Android build
  • 1 Для чего используется метод queue.dequeue_up_to () в tenorflow.data_flow_ops?
  • 1 NetworkX: линейный график и его дополнение
  • 0 координаты мыши только с круглыми числами — функция jquery
  • 0 Обновите столбец, используя порядок запроса выбора по убыванию наибольшего значения
  • 1 Как проанализировать вывод Json из API Visistat с помощью Json.net
  • 0 Экспресс-проверка Paypal не отображается должным образом в Firefox
Читайте также:  Css grid horizontal scroll

Источник

Получить номер текущей строки в PHP

Для логгирования иногда важно не только записать какое то сообщение, но также указать — где именно произошло событие в скрипте. Давайте посмотрим, как можно получить номер строки и имя файла в PHP.

Данная информация может быть предоставлена php функцией debug_backtrace(), которая предоставляет информацию о состоянии стека вызова функций в виде массива.

Пример массива, который возвращает debug_backtrace():

Здесь есть имя файла и номер строки, где была вызвана некая функция getInfo.

Оформим нашу идею в виде функции, которая возвращает описание места в скрипте, откуда она была вызвана в программе:

Т.е. если мы вызовем её где то в нашей программе, она вернет нам имя файла и номер строки.

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

Виртуальный лог

Оформим эту идею в виде виртуального класса.

Основная функция класса — log выводит сообщение просто на экран, поэтому я назвал класс виртуальным. А чтобы сообщение сохранялось в базу или в файл — требуется переписать эту функцию в дочернем классе.

Вторая особенность — функция log не добавляет имя файла и номер строки в сообщение, сохраняя возможность прямого вывода. Вместо этого реализованы еще два метода, которые это делают. Один из них error, принимает на входе объект Exception и использует его данные. А второй — message — использует уже знакомую функцию getInfo.

Пользоваться классом просто:

Источник

Получить строку кода и файл, который выполняет текущую функцию в PHP?

Я хочу изменить функцию журнала так, чтобы она создавала следующее:

test (файл: File1.php, номер строки: 3)

Итак, любой способ получить имя файла и номер строки кода, выполняющего текущую функцию в PHP?

Читайте также:  Create exception class in python

EDIT для комментариев использования комментариев: когда я использую backlog в моем объектно-ориентированном способе программирования, у меня есть следующая ситуация.

Этот пример будет возвращен как файл «Index.php», а как строка номер 4, здесь начинается класс. Тем не менее, предполагается вернуть файл TestClass.class.php и номер строки 6. Есть идеи, как это исправить?

Solutions Collecting From Web of «Получить строку кода и файл, который выполняет текущую функцию в PHP?»

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

Таким образом, в вашей функции журнала вы сможете получить имя файла и номер строки, с которого была вызвана функция журнала.

Я использую этот подход в своих классах ведения журнала, и он значительно сократил объем кода, необходимый для получения значимых данных журнала. Другим преимуществом будет читаемость. Магические константы, как правило, становятся довольно уродливыми, когда их смешивают со струнами.

debug_backtrace () может использоваться для трассировки в стек вызовов. Это может быть медленным, поэтому будьте осторожны с ним, если вы делаете много записей.

Если вы используете PHP 5.3, вы можете воспользоваться поздней статической привязкой и иметь метод базового класса log() , и ваши дочерние классы могли бы вызвать его, но при этом сохранять статические ссылки на __FILE__ и __LINE__ .

Окончательный вариант будет просто передавать __FILE__ и __LINE__ в качестве параметров при вызове функции log() .

Это старый вопрос, но, видя, как мое решение не здесь, я предоставлю его потомству

 try< throw new Exception(); >catch ( Exception $e )< $trace = $e->getTrace(); > $length = 0; foreach ($trace as $t) < if( $t['file'] != __FILE__ )< break; >++$length; > return array_slice( $trace, ($length - count( $trace ) )); 

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

Трассировка стека исключений почти такая же, как и debug_backtrace(true) .

  • Диаграммы Google – анимация графического графика не работает
  • как передать URL-адрес переменной на следующие страницы в разбивке на страницы php
  • Как я могу ввести доктрину в службу Symfony2
  • Почему curl_multi_exec () не выполняет мои скрипты вообще?
  • PHP money_format
  • Как увеличить числовую часть строки на единицу?
  • является ли определение типа mime лучшим способом для обнаружения своего рода файла?
  • Как безопасно записывать данные JSON в файл с помощью PHP
  • PHP и одновременный доступ к файлам
  • Плагин PHPExcel не импортирует файл в cakephp
  • Отправить письмо по электронной почте в Codeignign с помощью Gmail
  • Установите PEAR с Wamp 2.1
  • PHP getimagesize с переменной
  • Проблема Xdebug и Netbeans
  • PHP: неизменные поля публичных пользователей

Источник

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