В команде, с которой я работаю, у нас есть старая кодовая база, использующая функции PHP ibase_ * по всему коду для связи с базой данных. Мы создали для него оболочку, которая будет делать что-то еще, помимо простого вызова исходной функции, и я произвел массовый поиск-замену во всем коде, чтобы убедиться, что вместо нее используется оболочка.
Теперь, как нам предотвратить использование функций ibase_ * в будущем?
Желательно, чтобы они оставались доступными, но при использовании они должны выдавать УВЕДОМЛЕНИЕ или ПРЕДУПРЕЖДЕНИЕ.
Предпочтительно решение на чистом PHP (не требующее компиляции специальной версии PHP).






Сам не проверял, но нашел в закладках: http://wiki.php.net/rfc/e-user-deprecated-warning
Обновлено: Хорошо, это еще не работает - поэтому вместо E_USER_DEPRECATED просто используйте что-то вроде E_USER_NOTICE:
<?php
class Foo
{
public function __construct()
{
trigger_error('Use Bar instead', E_USER_NOTICE);
}
}
$foo = new Foo()
Это закончится так:
Notice: Use Bar instead in /home/unexist/projects/ingame/svn/foo.php on line 6
function my_deprecated_function() {
trigger_error("Deprecated function called.", E_USER_NOTICE);
// do stuff.
}
Вы можете рассмотреть возможность использования E_USER_DEPRECATED для PHP 5.3.x и более поздних версий.
Если ваши функции являются частью класса, вы можете использовать trigger_error в конструкторе, чтобы предупредить об устаревании.
В качестве альтернативы, если функции находятся в одном файле, то запуск предупреждения об устаревании в верхней части файла будет показывать ошибку всякий раз, когда файл включен в другое место.
Наконец, вы можете выдать ошибку в первой строке любой из устаревших функций.
Это не моя функция, это встроенные в PHP функции ibase_ *, например, ibase_query.
Если я правильно понял, вы хотите вызвать ошибку при использовании встроенной функции PHP? В этом случае взгляните на функцию Функция переопределения.
Спасибо, по ссылке, которую вы разместили, я нашел именно то, что мне нужно, здесь: no.php.net/manual/en/function.override-function.php#50821
Имейте в виду, что это часть расширения APD (отладчик). Вы должны использовать нет в своей производственной среде, и даже на вашем тестовом компьютере он, вероятно, будет конфликтовать с другими отладчиками (такими как Xdebug), поэтому вы можете не захотеть это использовать.
Не во время выполнения, я не знаю. Я бы предложил статический анализ (preg должен делать в простых случаях) в вашей тестовой среде.
Вместо того, чтобы выдавать предупреждение во время выполнения об использовании, вы можете подумать о написании сценария, который может сканировать вашу базу кода на предмет использования этой функции, а затем генерировать отчет о нарушающем коде. Время от времени прогоняйте его.
Если вы используете систему контроля версий, вы можете установить скрипт как фиксацию. Я бы, вероятно, порекомендовал пост-ловушку, которая просто отправляет электронное письмо, когда проверяется скрипт, содержащий устаревшие функции, но если вы действительно хотите принудительно применить его, у вас может быть предварительный перехватчик, полностью предотвращающий его проверку кем-либо. .
Вообще говоря, вы можете пометить метод как устаревший, чтобы предупреждать пользователей о коде, который не будет работать в будущих версиях. Я думаю, что лучший способ - использовать trigger_error вместе с некоторым phpdoc.
/**
* @deprecated
*
* @return $this
*/
public function oldMethod()
{
trigger_error('Method ' . __METHOD__ . ' is deprecated', E_USER_DEPRECATED);
return $this;
}
@deprecated phpdoc важен, потому что многие IDE, такие как PHPStorm, распознают его и удаляют имя метода, если вы пытаетесь его использовать, поэтому вы замечаете, что он устарел, прежде чем запускать свой код.
Это будет выглядеть примерно так:
Помимо phpdoc вы можете убедиться, что пользователь получит предупреждение, вызвав правильную ошибку во время выполнения. Просто убедитесь, что вы используете правильную константу (например, E_USER_DEPRECATED).
E_DEPRECATED вместо этого используется внутри PHP, поэтому вы должны использовать его нет. Дополнительная информация здесь.
Это не моя функция, это встроенные в PHP функции ibase_ *, например, ibase_query.