Pergunta

Você pode fazer isso em Python, mas é possível em PHP?

>>> def a(): print 1
... 
>>> def a(): print 2
... 
>>> a()
2

por exemplo:.

<? function var_dump() {} ?>
Fatal error: Cannot redeclare var_dump() in /tmp/- on line 1
Foi útil?

Solução

Esta é uma pouco tarde, mas eu só quero salientar que desde o PHP 5.3, é realmente possível para substituir funções internas sem usar uma extensão PHP.

O truque é que você pode redefinir uma função PHP interna dentro de um namespace. Ele é baseado no caminho PHP faz a resolução de nomes para funções:

Dentro do namespace (digo A \ B), chamadas para funções não qualificadas são resolvidas em tempo de execução. Aqui é como uma chamada para a função foo () é resolvida:

  1. Ele procura por uma função do namespace atual: A \ B \ foo ().
  2. Ele tenta encontrar e chamar a função foo global ()

Outras dicas

Não, não é possível fazer isso como você poderia esperar.

A partir da manual :

PHP não suporta sobrecarga de funções, nem é possível undefine ou redefinir funções previamente declaradas.

No entanto, você pode usar runkit_function_redefine e seus primos , mas definitivamente não é muito elegante ...

Você também pode usar create_function para fazer algo como isto:

<?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
?>

Tal como acontece com runkit, não é muito elegante, mas dá o comportamento que você está procurando.

Eu percebo esta pergunta é um pouco velho, mas Patchwork é um recentemente- Autorização projecto PHP 5.3 que suportes redefinição das funções definidas pelo utilizador. Porém, como o autor menciona, você vai precisar de recorrer a runkit ou php-teste-ajudantes para macaco núcleo -patch / funções de biblioteca.

Como jmikola mencionado, Patchwork é uma boa solução se você quiser adicionar o código para uma função.

Aqui está um artigo sobre como ele funciona: http://phpmyweb.net/2012/ 26/04 / write-um-awesome-plugin-sistema-em-php /

Ele vem com um código de exemplo. Eu acho que a versão phpmyweb usa um código um pouco melhor, porque ele não usa eval () 'd code, retalhos ao contrário. Você pode armazenar em cache opcodes ao usar eval ().

A resposta aceita é excelente !!! Vou apenas acrescentar que você pode colocar seus códigos em Namespace suportes e, em seguida, o padrão GLOBAL-SPACE é resetted.

algumas outras maneiras:

1) rename_function ($ old_name, $ new_name)

2) override_function ($ old_name, $ parâmetros, $ new_func)

e raramente utilizado:

3) runkit_function_rename (...)

4) runkit_function_redefine (...)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top