Как отказаться от функции в PHP? - PullRequest
28 голосов
/ 11 октября 2008

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

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

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

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

Ответы [ 6 ]

42 голосов
/ 11 октября 2008

trigger_error ()

function my_deprecated_function() {
    trigger_error("Deprecated function called.", E_USER_NOTICE);
    // do stuff.
}
20 голосов
/ 27 июля 2017

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

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

    return $this;
}

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

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

jetbrains deprecated strikethrough

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

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

16 голосов
/ 11 октября 2008

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

6 голосов
/ 11 октября 2008

Я не проверял это сам, но нашел это в своих закладках: 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
2 голосов
/ 11 октября 2008

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

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

2 голосов
/ 11 октября 2008

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

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

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

...