Restringiendo el acceso a las funciones en PHP: Mas alla de protected, private and public

MIentras estaba implementando nuevas caracteristicas en phpORM, surgio la necesidad de poder accesar a cierta informacion desde otras clases. En la teoria de Objetos, cuando se quiere permitir que una funcion externa acceda a un metodo privado de una clase, lo que se hace es declara a esa funcion como amiga de la clase.

class MIClase
{
private function miFuncion() {}
friend function acceso_externo();
}

Sin embargo, en PHP no existe el modificador friend. Sin embargo se puede intentar codear una solucion.

La base de esta solucion es la funcion debug_backtrace(). Esta funcion me devuelve informacion de depuracion, como por ejemplo: que script se esta ejecutando, o en que linea de codigo me encuentro … o mejor aun desde donde se realizo la llamada.

class MIClase
{
// En esta variable privada uno se debe asegurar de incluir todos los nombres de clases que
// tendran acceso  nuestros metodos “privados”, eso incluye el nombre de la propia clase
private $__friends = array(”MIClase”,”ClaseAmiga”, “OtraClaseAmiga”);

// Este metodo, sera accesible por las clases amigas. Aunque se ha declarado publico ….
// sera realmente privado para todos menos para esta clase y las clases amigas
public function Metodo()
{
$trace = debug_backtrace();  // Obtengo la informacion de depuracion

// Verificamos que la llamada alla sido hecha desde alguna de las clases incluidas en $__friends
if(isset($trace[1]['class']) && in_array($trace[1]['class'],$this->__friends))
{
// MI CODIGO ACA
}else{

trigger_error(’Cannot access private function ‘ . __CLASS__ .’::Metodo’, E_USER_ERROR);

}

}

}

Share/Save/Bookmark

If you enjoyed this post, please consider to leave a comment or subscribe to the feed and get future articles delivered to your feed reader.

Comments

No comments yet.

Leave a comment

(required)

(required)