Supoñamos que no noso programa hai unha función definida e que o código avaliado contén unha que se chame igual. Qué sucedería? Cómo resolverlo?
Se temos nun ficheiro definida unha función co nome "foo()", ao executar o codigo, sen ter en conta ningunha modificación, a mensaxe de erro que obtemos será similar a seguinte:
Fatal error: Cannot redeclare foo() (previously declared in....
Para facer unha proba creamos un ficheiro como o seguinte:
<?php
error_reporting(E_ALL);
################################################################################
function foo() {
echo "Funcion foo orixinal" . PHP_EOL;
}
// Invocamos foo()
foo();
################################################################################
$code =<<< PHPCODE
function foo() {
echo "Funcion foo dende eval" . PHP_EOL;
}
PHPCODE;
// Tentamos avaliar $code
eval($code); // Fatal error: Cannot redeclare foo() (previously declared in...
Ao estar definida unha función co mesmo nome, en tempo de execución, ao procesar o código da sentencia exec lanza un erro. Un método sinxelo sería comprobar se a función xa está definida con function_exists. Outra posibilidade sería empregar extensións do motor Zend de PHP que permitan a "redefinición" da función (runkit, APD). No seguinte código recóllese un exemplo de uso de runkit para redefinir a función, con runkit_function_redefine:
$code =<<< PHPCODE
if(function_exists('foo')){
// Redefinir a función
runkit_function_redefine('foo', '', 'echo "(runkit version)" . PHP_EOL;');
} else {
function foo() {
echo "Funcion foo dende eval (sen redefinir)" . PHP_EOL;
}
}
PHPCODE;
eval($code) . PHP_EOL;
foo();
O uso de namespaces na versión 5.3 de PHP permite a definición dunha función nun espazo de nomes distinto non provocará colisións coa definida noutro.
namespace CDWA\PHP {
$foo = function() {echo "Funcion en namespace CDWA\\PHP" . PHP_EOL;};
$foo(); // A do namespace
\foo(); // A orixinal
}
Última actualización | 2012-08-05 10:21 PM (Europe/Madrid) |
Data de creación | 2010-07-03 10:59 PM (Europe/Madrid) |
php |