Как отказаться от функции в PHP?

В команде, с которой я работаю, у нас есть старая кодовая база, использующая функции PHP ibase_* по всему коду для связи с базой данных. Мы создали для него оболочку, которая будет делать что-то еще, помимо простого вызова исходной функции, и я сделал массовый поиск-замену по всему коду, чтобы убедиться, что вместо этого используется оболочка.

Теперь, как мы можем предотвратить использование функций ibase_* в будущем?

Предпочтительно, я бы хотел, чтобы они по-прежнему были доступны, но чтобы они выдавали УВЕДОМЛЕНИЕ или ПРЕДУПРЕЖДЕНИЕ при их использовании.

Предпочтительно решение на чистом PHP (без компиляции пользовательской версии PHP).


person Milan Babuškov    schedule 11.10.2008    source источник


Ответы (6)


Если я правильно понимаю, вы хотите вызвать ошибку при использовании встроенной функции PHP? В этом случае взгляните на функцию Переопределить функцию.

person Community    schedule 11.10.2008
comment
Спасибо, перейдя по ссылке, которую вы разместили, я нашел именно то, что мне было нужно, здесь: no.php.net/manual/en/function.override-function.php#50821 - person Milan Babuškov; 11.10.2008
comment
Имейте в виду, что это часть расширения APD (отладчик). Вам не следует использовать это в производственной среде, и даже на тестовом компьютере он, вероятно, будет конфликтовать с другими отладчиками (такими как Xdebug), поэтому вы можете не захотеть его использовать. - person troelskn; 11.10.2008
comment
Не во время выполнения, я не. Я бы предложил статический анализ (для простых случаев подойдет preg) в вашей тестовой среде. - person troelskn; 19.10.2008

trigger_error()

function my_deprecated_function() {
    trigger_error("Deprecated function called.", E_USER_NOTICE);
    // do stuff.
}
person nickf    schedule 11.10.2008
comment
Это не моя функция, а встроенные в PHP функции ibase_*, такие как, например, ibase_query. - person Milan Babuškov; 11.10.2008
comment
Вы можете использовать E_USER_DEPRECATED для PHP 5.3.x и более поздних версий. - person emont01; 05.12.2014

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

/**
 * @deprecated
 *
 * @return $this
 */
public function oldMethod()
{
    trigger_error('Method ' . __METHOD__ . ' is deprecated', E_USER_DEPRECATED);

    return $this;
}

@deprecated phpdoc важен, потому что многие IDE, такие как PHPStorm, распознают его и удаляют имя метода, если вы пытаетесь использовать это, так что вы заметите, что это устарело, прежде чем фактически запустить свой код.

Это будет выглядеть примерно так:

jetbrains больше не рекомендуется зачеркивать

Помимо phpdoc вы можете убедиться, что пользователь получит предупреждение, вызвав правильную ошибку во время выполнения. Просто убедитесь, что вы используете правильную константу (например, E_USER_DEPRECATED).

Вместо этого E_DEPRECATED используется внутри PHP, поэтому вам не следует его использовать. Дополнительная информация здесь.

person Francesco Casula    schedule 27.07.2017

Я сам не проверял, но нашел это в своих закладках: 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
person unexist    schedule 11.10.2008

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

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

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

person Codebeef    schedule 11.10.2008
comment
Это не моя функция, а встроенные в PHP функции ibase_*, такие как, например, ibase_query. - person Milan Babuškov; 11.10.2008

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

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

person troelskn    schedule 11.10.2008