É possível substituir funções PHP (monkeypatch)?
-
22-08-2019 - |
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
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:
- Ele procura por uma função do namespace atual: A \ B \ foo ().
- 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.
Kind of. Consulte http://dev.kafol.net/2008/09 /php-redefining-deleting-adding.html .
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: