можно расширить функцию php? - PullRequest
4 голосов
/ 16 сентября 2011

У меня вопрос, возможно ли расширить объявленную функцию.

Я хочу расширить функцию mysql_, чтобы добавить запрос mysql, который вставит в таблицу несколько журналов: 'query' - параметр mysql_query, date, page ... etc

Ответы [ 6 ]

6 голосов
/ 16 сентября 2011

У меня вопрос, возможно ли расширить объявленную функцию.

Нет.

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

Существуют некоторые эзотерические расширения PHP, которые позволяют переопределять функции, но я предполагаю, что это не то, что вам нужно, и их использование редко практично.

То, что вы, вероятно, хотитеdo создает новую функцию и вызывает в ней существующую функцию.

2 голосов
/ 16 сентября 2011

Нет, вы не можете этого сделать. Либо включите MySql Query Logs , либо оберните код, выполняющий запросы, в Logging Decorator , либо используйте абстракцию типа Zend_Db, которая может принимать Profiler , или используйте прозрачный плагин регистрации для mysqlnd

0 голосов
/ 31 мая 2013

из http://php.net/manual/en/function.rename-function.php

bool rename_function (строка $ original_name, строка $ new_name)

Переименовывает orig_name в new_name в таблице глобальных функций.Полезно для временного переопределения встроенных функций.

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

Существует также встроенная функция php, называемая override_function (упомянутая ChrisH).Он не полностью документирован на странице руководства php, но пользовательские комментарии под документом дают вам информацию, которая вам необходима, если вы предпочитаете ее функции rename_function.Была дискуссия о том, чтобы ограничиться одним переопределением, если вам нужно было вызвать исходную функцию из замены.Использование функции rename_function вместо функции переопределения устраняет это потенциальное ограничение.

0 голосов
/ 16 сентября 2011

Хорошо .. PHP говорит это: http://php.net/manual/en/function.override-function.php

0 голосов
/ 16 сентября 2011

Это невозможно.

Вы должны были создать свой собственный API (или использовать существующий) для доступа к БД, чтобы при необходимости регистрации вы могли просто улучшить свою собственную функцию API.Это также очень удобно, если вам нужна пользовательская функция обработки ошибок.Рефакторинг кода.

0 голосов
/ 16 сентября 2011

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

* 1003 например *

<?php

function mysql_query_log($sql)
{
    mysql_query('insert into .... values ...');

    $r = mysql_query($sql);
    $results;
    //do the normal thing you do with mysql here
    return $results;

}

Это не расширение функции, но вы можете расширить только класс

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...