Доступ к функции в классе из других классов - PullRequest
0 голосов
/ 21 декабря 2009

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

Макет у меня сейчас такой:

                Global
     -----------------------------
     |                           |
database class          application class
                                 |
                           program class

Когда класс базы данных запускается, он подключается к базе данных и выполняет некоторые запросы. В следующий раз он понадобится в классе программы.

Мне нужно сохранить переменные querycount и totaltime и добавить их. Я также хотел бы простой вызов функции, я не хочу запускать класс для каждой программы. Он выглядит так, как будто должен быть способ вызвать его на уровне класса приложения и иметь возможность использовать функцию запроса на уровне программы, а также подключаться и закрываться на глобальном уровне.

Надеюсь, это имеет смысл, я знаю, чего хочу, но у меня проблемы с изложением слов ...

Ответы [ 5 ]

1 голос
/ 21 декабря 2009

Я не уверен, правильно ли я понял вашу проблему, но я бы посоветовал вам ввести в класс базы данных статические переменные, которые затем используются для хранения данных, которые вы хотите, чтобы класс "запомнил". Как это:

class Database
{
public static $queryCount = 0;
public static $queryDuration = 0;

/*
  ... the rest of your database stuff
*/
}

Эти две переменные доступны через Database :: $ queryCount и Database :: $ queryDuration и будут хранить свои значения в классе, а не в экземплярах объектов.

Внутри ваших методов запроса вы можете обновить их значения, например:

Database::$queryCount++;

и в конце вашего скрипта вы можете прочитать их содержимое.

0 голосов
/ 21 декабря 2009

Я думаю, вы могли бы взглянуть на шаблон Factory (также упрощает создание подклассов для разных типов баз данных.

Позвольте мне предоставить его модифицированную версию ниже:

class Database
{
    protected static $instance = NULL;

    public static function factory($type = '')
    {
        $type = strtolower($type);

        if (self::$instance == NULL)
        {
            $className = 'Database_'.ucfirst($type);

            // Include the class and do some checks here

            self::$instance = new $className;
        }

        return self::$instance;
    }

Вы можете создать свою базу данных, где бы вы ее ни создавали, с помощью этого фрагмента кода:

$db = Database::factory('mysql');

После этого вы можете получить глобальный доступ к вашему объекту базы данных следующим образом:

$db = Database::factory();

Ваши подклассы должны храниться в классах, названных как Database_Mysql или Database_Postgresql.

0 голосов
/ 21 декабря 2009

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

Если бы мне пришлось делать это самостоятельно, я бы, вероятно, написал бы Profiler Decorator для класса базы данных, который собирает статистику запросов для меня каждый раз, когда выполняется запрос.

Другой вариант - использовать класс DB и класс Profiler для Subject / Observer , где класс DB уведомляет профилировщик при каждом запуске запроса.

Или вы можете просто внедрить экземпляр Profiler в класс DB и делегировать коллекцию из класса DB профилировщику.

Однако я бы не решил бы коллекцию как таковую в классе DB со статическими свойствами, так как этот сбор статистики не имеет значения для класса.

Кроме того, я предлагаю вам отложить фактические вызовы подключения к базе данных, когда они необходимы. Не подключайтесь, когда вы впервые создаете экземпляр класса DB, но поместите этот код в метод connect. Затем, когда кто-то вызывает ваш метод запроса, проверьте, был ли вызван connect, а если нет, запустите connect (). Нет необходимости устанавливать соединение, если ничего не запрашивается.

0 голосов
/ 21 декабря 2009

Один из способов - сделать функции ваших классов статичными, которые вы можете использовать сразу. Другая возможность - расширить класс, содержащий функцию, которую вы хотите вызвать. Вы также можете использовать функцию call_user_func_array для вызова функции из любого класса.

В любом случае, это видео - ответ на ваш вопрос, я думаю:

http://www.killerphp.com/videos/calling_functions_from_another_class.php

0 голосов
/ 21 декабря 2009

Статическое ключевое слово PHP - это то, на что вам нужно обратить внимание.

http://php.net/manual/en/language.oop5.static.php

Но будьте осторожны, если многие классы вызывают ваши статические методы, возможно, вам придется подумать о проблемах с многопоточностью.

...