Redefinir funcións en PHP

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();

 

Redefinición de funcións en PHP 5.3

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

Relacionados