2008-10-11 14 views
24

Nel team con cui lavoro, abbiamo una vecchia base di codice che utilizza le funzioni ibase_ * di PHP in tutto il codice per comunicare con il database. Abbiamo creato un wrapper che avrebbe fatto qualcos'altro oltre a chiamare la funzione originale e ho fatto una ricerca di massa-replace nell'intero codice per assicurarmi che invece fosse usato il wrapper.Come deprecare una funzione in PHP?

Ora, come impedire l'utilizzo delle funzioni ibase_ * in futuro?

Preferibilmente, vorrei ancora averli disponibili, ma farlo lanciare un AVVISO o AVVISO quando viene utilizzato.

Una soluzione in puro PHP (non è necessario compilare una versione personalizzata di PHP) è preferibile.

risposta

12

Se ho capito bene, vuoi attivare un errore quando viene utilizzata una funzione PHP integrata? In tal caso, dai un'occhiata alla funzione Override Function.

+0

Grazie, seguendo il link che hai postato, ho trovato esattamente quello di cui avevo bisogno, qui: http://no.php.net/manual/en/function.override-function.php#50821 –

+0

Ricorda che questo è parte dell'estensione APD (debugger). Non dovresti usarlo nel tuo ambiente di produzione, e anche sul tuo computer di prova, probabilmente entrerà in conflitto con altri debugger (come Xdebug), quindi potresti non volerlo usare. – troelskn

+0

@troelskn: hai ragione. Qualche altra idea? –

6

Non ho controllato da me, ma ho trovato questo nei miei preferiti: http://wiki.php.net/rfc/e-user-deprecated-warning

Edit: Ok questo non funziona ancora - così invece di E_USER_DEPRECATED basta usare qualcosa come E_USER_NOTICE:

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

$foo = new Foo() 

questo finirà con questo:

Notice: Use Bar instead in /home/unexist/projects/ingame/svn/foo.php on line 6 
36
+1

Non è la mia funzione, ma PHP ha in ibase_ * funzioni come ibase_query per esempio. –

+9

Puoi prendere in considerazione l'utilizzo di [E_USER_DEPRECATED] (http://php.net/manual/en/migration53.deprecated.php) per PHP 5.3.xe versioni successive – emont01

2

Se le funzioni fanno parte di una classe, è possibile utilizzare trigger_error nel costruttore per avvisare della deprecazione.

In alternativa, se le funzioni si trovano in un singolo file, l'attivazione di un avviso di deprecazione nella parte superiore del file mostrerebbe l'errore ogni volta che il file viene incluso altrove.

Infine, è possibile inviare l'errore sulla prima riga di una qualsiasi delle funzioni deprecate.

+0

Non è la mia funzione, ma le funzioni integrate di ibase_ * di PHP come ibase_query per esempio. –

1

Invece di generare un avviso di runtime sull'utilizzo, è possibile prendere in considerazione la scrittura di uno script, che può eseguire la scansione del codice di base per l'utilizzo di questa funzione, quindi generare un rapporto di codice offensivo. Di tanto in tanto, eseguilo.

Se si utilizza un sistema di controllo della versione, è possibile impostare lo script come hook di commit. Suggerirei probabilmente un post-hook, che invia semplicemente una e-mail, quando viene eseguito il check-in di uno script, contenente funzioni deprecate, ma se vuoi veramente farla rispettare, potresti avere un pre-hook che impedisce completamente a chiunque di controllarlo

+1

Si chiama GREP – Malfist

8

In generale è possibile contrassegnare un metodo come deprecato per fornire agli utenti avvisi sul codice che non funzioneranno nelle versioni future. Penso che il modo migliore sia usare trigger_error insieme ad alcuni phpdoc.

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

    return $this; 
} 

Il @deprecated phpdoc è importante perché molti IDE come PHPStorm riconoscerlo e colpiscono il nome del metodo, se si tenta di utilizzare, in modo si nota che è deprecato prima di poter realmente in esecuzione il codice.

Si farà il punto più o meno così:

jetbrains deprecated strikethrough

Accanto alla phpdoc è possibile assicurarsi che l'utente riceve un avvertimento da innescare l'errore di diritto in fase di esecuzione. Assicurati di utilizzare la costante corretta (ad esempio E_USER_DEPRECATED).

E_DEPRECATED viene invece utilizzato internamente da PHP, pertanto è consigliabile utilizzare non. Maggiori informazioni here.

Problemi correlati