2009-02-10 17 views

risposta

11

Questo è un bit in ritardo, ma voglio solo precisare che dal PHP 5.3, è in realtà possibile eseguire l'override delle funzioni interne senza utilizzare un'estensione PHP.

Il trucco è che è possibile ridefinire una funzione PHP interna all'interno di uno spazio dei nomi. Si basa sul modo in cui PHP definisce la risoluzione delle funzioni:

All'interno dello spazio dei nomi (ad esempio A \ B), le chiamate alle funzioni non qualificate vengono risolte in fase di esecuzione. Ecco come viene risolta una chiamata alla funzione foo():

  1. Cerca una funzione dallo spazio dei nomi corrente: A \ B \ foo().
  2. Si cerca di trovare e chiamare la funzione foo globale()
+0

Bello, perché questa risposta non è accettata? – Pacerier

+1

Molto probabilmente, perché è stato pubblicato quasi quattro anni dopo la domanda, e la risposta accettata era probabilmente la più rilevante in quel momento. –

+0

Sono ancora su SO ... Accettato! –

9

No, non è possibile fare questo, come ci si potrebbe aspettare.

Dal manual:

PHP non supporta la funzione sovraccarico, né è possibile indefinire o ridefinire funzioni precedentemente dichiarate.

tuttavia, è possibile utilizzare runkit_function_redefine e dei suoi cugini, ma non è sicuramente molto elegante ...

È inoltre possibile utilizzare create_function per fare qualcosa di simile:

<?php 
$func = create_function('$a,$b','return $a + $b;'); 
echo $func(3,5); // 8 
$func = create_function('$a,$b','return $a * $b;'); 
echo $func(3,5); // 15 
?> 

Come runkit, non è molto elegante, ma dà il comportamento che stai cercando.

+0

L'hai detto due volte, ma perché "non è molto elegante"? – Pacerier

+0

@Pacerier: Beh, per cominciare, è un po 'un odore di codice quello di voler fare questo per cominciare, e sicuramente manderà qualcuno dietro di te a guardare il tuo codice, ma se passi oltre che devi digitare il codice funzione come argomento stringa in entrambi i casi, che è sgradevole per tutto tranne che per le funzioni più brevi. –

+0

Sicuramente siamo almeno su PHP 5.3, nessuno fa più String, il codice funzione può essere fornito come funzione anonima. – Pacerier

5

Mi rendo conto che questa domanda è un po 'vecchia, ma Patchwork è un progetto PHP 5.3 rilasciato di recente che supporta la ridefinizione delle funzioni definite dall'utente. Tuttavia, come cita l'autore, sarà necessario ricorrere a runkit o php-test-helpers alle funzioni core/library di patch della scimmia.

+2

Molto bella lib lib. Grazie per aver condiviso :) –

1

Come menzionato da jmikola, Patchwork è una buona soluzione se si desidera aggiungere codice a una funzione.

Ecco un articolo su come funziona: http://phpmyweb.net/2012/04/26/write-an-awesome-plugin-system-in-php/

Viene fornito con alcuni esempi di codice. Penso che la versione phpmyweb usi un codice leggermente migliore, perché non usa il codice d eval(), a differenza del patchwork. È possibile memorizzare nella cache gli opcode quando si utilizza eval().

+0

perché ti devi preoccupare delle cache opcode durante i test unitari? O cosa ... stai usando la patch della scimmia per qualcosa di diverso dal test ?? in questo caso hai problemi più grossi di 'eval()' di cui preoccuparti. – Spudley

+1

@Spudley Ovviamente l'articolo che ho pubblicato non è finalizzato al Test delle unità (da qui il titolo "Scrivi un fantastico sistema di plugin"). Sta solo mostrando un altro modo per creare un'architettura di plugin. E dice anche che vuole solo mostrare un altro modo di creare una tale architettura. Ofcourse, è in discussione se è un buon modo. Anche se non vedo alcun problema con esso. --- Di quali "problemi" stai parlando? Come ha detto l'autore, il caching di opcode non dovrebbe essere un problema poiché eval() non viene usato affatto (a differenza del patchwork). – Vivendi

+0

@Vivendi, Patchwork usa le funzioni runkit internamente? – Pacerier

Problemi correlati