PHP найти, где класс создается - PullRequest
4 голосов
/ 07 июля 2011

У меня возникли некоторые проблемы в крупномасштабном проекте, и он сводится к тому, что конкретный класс каким-то образом создается несколько раз, что приводит к ненужной репликации / накладным расходам.

Есть ли способчтобы автоматически выяснить, с какого номера файла / строки он создается?

Я видел этот вопрос здесь - Найти, где был создан экземпляр класса , но я не получаю фатальную ошибку для негобыть объявленным повторно, так что я не думаю, что include / require - это проблема.

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

Ответы [ 7 ]

3 голосов
/ 07 июля 2011

debug_backtrace () сообщит всему, что случилось. get_class ($ this) даст верхний дочерний класс, если вам это нужно.

1 голос
/ 07 июля 2011

Вы можете сделать класс синглтоном.Затем обновите любое место, где вызывается класс, чтобы использовать шаблон синглтона.Вы также можете сделать __construct () частным или защищенным, чтобы его экземпляр создавался с помощью метода instance ().Это будет означать, что класс вызывается только один раз.

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

1 голос
/ 07 июля 2011

Вы можете импортировать проект в IDE и искать там. Например, в Netbeans, если щелкнуть правой кнопкой мыши имя класса и выбрать «Найти использование», вы получите список всех вызовов определенного класса (то же самое для функций и т. Д.).

1 голос
/ 07 июля 2011

Позвоните вашему конструктору debug_backtrace или debug_print_backtrace.

0 голосов
/ 29 июля 2015

Следующий фрагмент кода основан на использовании debug_backtrace () .

Обратная трассировка выбирается без аргументов и опций и ограничена 3 элементами массива; затем имя «класса» возвращается из второго элемента массива.

Демо

Код:

<?php

class MyClass
{
    // find out where $myClass->exec() was called
    static function getInstantiatingClass()
    {   
        return debug_backtrace(2, 3)[2]['class'];
    }

    function exec()
    {
        echo __METHOD__ . ' was called from Class ' . self::getInstantiatingClass();
    }
}

class Demo
{
    function test()
    {
        $myClass = new MyClass;
        $myClass->exec();
    }
}

$demo = new Demo;
$demo->test();

Результат:

MyClass::exec was called from Class Demo

0 голосов
/ 07 июля 2011

Для профилирования PHP-скриптов я использую расширение xdebug .Это вместе с KCachegrind или WinCacheGrind позволит вам увидеть, какие классы / функции вызывают рассматриваемый класс.

0 голосов
/ 07 июля 2011

Вы можете добавить параметр в объявление конструктора.Поскольку другие классы, которые его вызывают, не были отредактированы для этого параметра, должны быть ошибки для каждого экземпляра, который он пытается создать.

...