2010-02-24 8 views
19

Vorrei ridefinire determinate funzioni in PHP già create ad esempio, echo() o time() - Non è necessario definire queste funzioni globalmente, solo all'interno di un singolo script per il test .Ridefinite funzioni PHP integrate

Penso che questo possa essere fatto in Perl ma in PHP - È possibile?

+1

possibile duplicato di [? E 'possibile sostituire una funzione in PHP (come ad esempio la posta) e farlo fare qualcos'altro] (http://stackoverflow.com/ domande/1837184/is-it-possible-to-replace-a-function-in-php-come-mail-e-make-it-do-someth) – outis

+1

... [È possibile sostituire (monkeypatch) Funzioni PHP?] (Http: // stackoverflow.it/q/530649 /), [Php ridefinire i metodi di classe O classe] (http://stackoverflow.com/q/137006/) – outis

+0

... perché qualcuno dovrebbe farlo? –

risposta

17

runkit_function_redefine - Sostituire una definizione di funzione con una nuova implementazione

Nota: Per impostazione predefinita, solo le funzioni dello spazio utente può essere rimosso, rinominato o modificati. Per ignorare le funzioni interne di , è necessario abilitare l'impostazione runkit.internal_override in php.ini.

+0

Questo ha un effetto globale su tutti gli script PHP o è specifico per uno specifico script? – Abs

+0

Dipende dall'ambito del file php.ini che stai modificando. – Dolph

+4

La modifica del file php.ini interesserà tutti gli script PHP in esecuzione su quella particolare installazione di PHP. La funzione redifinition stessa, tuttavia, è esclusiva degli script che chiamano 'runkit_function_redefine()'. –

6

Si potrebbe anche voler controllare

override_function() - override di funzioni incorporate

dal pacchetto Advanced PHP debugger.

Dovendo ridefinire le funzioni PHP native o le espressioni linguistiche dovrebbe suonare comunque un campanello d'allarme. A mio parere, questo non dovrebbe far parte del codice di produzione, a meno che non si stia scrivendo un debugger o uno strumento simile.

Un'altra possibilità sarebbe quella di utilizzare http://antecedent.github.io/patchwork

mosaico è una libreria PHP che rende possibile ridefinire funzioni e metodi definiti dall'utente in fase di esecuzione, liberamente replicando la funzionalità runkit_function_redefine in puro codice PHP 5.3, che, tra le altre cose, consente di sostituire i metodi statici e privati ​​con i duplicati di prova.

Quest'ultimo non funziona per le funzioni native se

+0

@Gordon - grazie per il suggerimento. Voglio solo farlo a scopo di test e non codice di produzione - hai ragione, suona campanelli d'allarme! – Abs

1

echo non è una funzione, è un costrutto del linguaggio. Non ho niente per quello.

Ma chiamate di funzione come time() possono essere ignorate dal PHP-5.3's namespace fallback policy:

Per le funzioni [...], il PHP ricadere a funzioni globali [...] se una funzione namespace [...] non esiste.

E.g. per la funzione non qualificata chiamare time() nello spazio dei nomi non globale foo è possibile fornire foo\time().

Personalmente sto usando questo per prendere in giro per es. time() per il test dell'unità. Ho pubblicato quei schernisce nella libreria PHP-Mock:

namespace foo; 

use phpmock\phpunit\PHPMock; 

class FooTest extends \PHPUnit_Framework_TestCase 
{ 

    use PHPMock; 

    public function testBar() 
    { 
     $time = $this->getFunctionMock(__NAMESPACE__, "time"); 
     $time->expects($this->once())->willReturn(3); 
     $this->assertEquals(3, time()); 
    } 
} 
Problemi correlati