2008-10-11 8 views
24

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

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

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

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

ответ

12

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

+0

Спасибо, после ссылки, которую вы опубликовали, я нашел именно то, что мне было нужно, здесь: http://no.php.net/manual/en/function.override-function.php#50821 –

+0

Имейте в виду, что это часть расширения APD (отладчика). Вы не должны использовать это в своей производственной среде, и даже на тестовой машине она, вероятно, будет конфликтовать с другими отладчиками (такими как Xdebug), поэтому вы не захотите ее использовать. – troelskn

+0

@troelskn: вы правы. Любая другая идея? –

6

Я не проверял это сам, но нашел это в мои закладки: http://wiki.php.net/rfc/e-user-deprecated-warning

Edit: Хорошо это еще не работает - так что вместо 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 
36

trigger_error()

function my_deprecated_function() { 
    trigger_error("Deprecated function called.", E_USER_NOTICE); 
    // do stuff. 
} 
+1

Это не моя функция, но PHP, встроенный в ibase_ *, функционирует, например, как ibase_query. –

+9

Вы можете использовать [E_USER_DEPRECATED] (http://php.net/manual/en/migration53.deprecated.php) для PHP 5.3.x и более поздних версий – emont01

2

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

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

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

+0

Это не моя функция, но встроенные в PHP функции ibase_ * Например, ibase_query. –

1

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

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

+1

Это называется GREP – Malfist

8

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

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

    return $this; 
} 

@deprecated PHPDoc важно, потому что многие Иды как PHPStorm распознать его и ударить имя метода, если вы пытаетесь использовать его, так что вы обратите внимание, что не рекомендуется, прежде чем на самом деле работает ваш код.

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

jetbrains deprecated strikethrough

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

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