2008-10-11 20 views
24

W zespole, z którym pracuję, mamy starą bazę kodów wykorzystującą funkcje PHP ibase_ * na całym kodzie do komunikowania się z bazą danych. Stworzyliśmy dla niego wrapper, który wykonałby coś innego poza wywołaniem oryginalnej funkcji, a ja dokonałem masowego wyszukiwania-zamiany w całym kodzie, aby upewnić się, że zamiast tego używa się opakowania.Jak wycofać funkcję w PHP?

Teraz, w jaki sposób możemy zapobiec używaniu funkcji ibase_ * w przyszłości?

Najlepiej, chciałbym nadal mieć je dostępne, ale sprawić, aby rzucać NOTICE lub OSTRZEŻENIE, gdy jest używany.

Preferowane jest rozwiązanie w czystym PHP (bez potrzeby kompilowania niestandardowej wersji PHP).

Odpowiedz

12

Jeśli dobrze rozumiem, chcesz wywołać błąd, gdy używana jest wbudowana funkcja PHP? W takim przypadku spójrz na funkcję Override Function.

+0

Dziękuję, po opublikowaniu linku, znalazłem dokładnie to, czego potrzebowałem, tutaj: http://no.php.net/manual/en/function.override-function.php#50821 –

+0

Należy pamiętać, że to jest część rozszerzenia APD (debugger). Nie powinieneś używać go w środowisku produkcyjnym, a nawet na maszynie testowej, prawdopodobnie będzie on kolidował z innymi debuggerami (takimi jak Xdebug), więc możesz tego nie chcieć używać. – troelskn

+0

@troelskn: masz rację. Każdy inny pomysł? –

6

Nie sprawdzałem go przez siebie, ale okazało się to w moich zakładek: http://wiki.php.net/rfc/e-user-deprecated-warning

Edit: Dobra to nie działa jeszcze - więc zamiast E_USER_DEPRECATED wystarczy użyć coś jak E_USER_NOTICE:

<?php 
class Foo 
{ 
    public function __construct() 
    { 
     trigger_error('Use Bar instead', E_USER_NOTICE); 
    } 
} 

$foo = new Foo() 

to będzie koniec z tym:

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

To nie jest moja funkcja, ale PHP jest wbudowane w funkcje ibase_ *, na przykład ibase_query. –

+9

Możesz rozważyć użycie [E_USER_DEPRECATED] (http://php.net/manual/en/migration53.deprecated.php) dla PHP 5.3.x i nowszych wersji – emont01

2

Jeśli twoje funkcje są częścią klasy, możesz użyć w konstruktorze trigger_error, aby ostrzec o przestarzałości.

Ewentualnie, jeśli funkcje znajdują się w jednym pliku, wyświetlenie ostrzeżenia o wycofaniu w górnej części pliku spowoduje wyświetlenie błędu, gdy plik znajduje się w innym miejscu.

Wreszcie, możesz rzucić błąd w pierwszym wierszu dowolnej przestarzałej funkcji.

+0

To nie jest moja funkcja, ale wbudowane w PHP funkcje ibase_ * ibase_query na przykład. –

1

Zamiast podnosić ostrzeżenie o czasie pracy, można rozważyć napisanie skryptu, który może zeskanować bazę kodu w celu użycia tej funkcji, a następnie wygenerować raport dotyczący obraźliwego kodu. Raz na jakiś czas, przeprowadź to.

Jeśli używasz systemu kontroli wersji, możesz ustawić skrypt jako commit-hook. Najprawdopodobniej poleciłbym post-hook, który po prostu wysyła e-mail, gdy skrypt, zawierający nieaktualne funkcje, jest sprawdzany, ale jeśli naprawdę chcesz go wymusić, możesz mieć pre-hook całkowicie uniemożliwić komukolwiek sprawdzenie go

+1

Nazywa się GREP – Malfist

8

Ogólnie można zgłosić metodę jako wycofaną, aby dać użytkownikom ostrzeżenia o kodzie, który nie będzie działać w przyszłych wersjach. Myślę, że najlepszym sposobem jest użycie trigger_error wraz z niektórymi phpdoc.

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

    return $this; 
} 

@deprecated PHPDoc jest ważne, ponieważ wiele IDE jak PHPStorm rozpozna go i uderzyć nazwę metody, jeśli starają się go używać, więc można zauważyć, że jest przestarzałe, zanim faktycznie działa kod.

To będzie wyglądać mniej więcej tak:

jetbrains deprecated strikethrough

Obok PHPDoc można mieć pewność, użytkownik otrzymuje ostrzeżenie za wyzwalanie właściwej błąd przy starcie. Po prostu upewnij się, że używasz właściwej stałej (tj. E_USER_DEPRECATED).

E_DEPRECATED jest zamiast tego używany wewnętrznie przez PHP, więc powinieneś go używać jako , a nie. Więcej informacji: here.