Foro de elhacker.net

Programación => PHP => Mensaje iniciado por: Thaorius en 28 Diciembre 2006, 05:53 am



Título: Fatal error: Cannot access empty property in...
Publicado por: Thaorius en 28 Diciembre 2006, 05:53 am
Hola a todos.

Tengo un pequeño problemita, en mi cms, tengo esta funcion que me carga las librerias de funciones para su uso, el problema es que yo nesecito que las librerias cargadas(clases) queden disponibles al usuario de esta forma:
Código:
$core->nombre_libreria
De esta forma el usuario hace esto:
Código:
$core->load_library("LoadableModule");
y la libreria LoadableModule es cargada apra darle soporte de modulos al sistema, entonces despues el usuario puede hacer:
Código:
$core->modules->add_module($module_descriptor);

No se si se entiende, el problema se produce al ejecutar este codigo:
Código:
if ($instantiate)
{
$class_name = 'TWS_'.$class;
if(class_exists($class_name))
{
$this->objects[$class] =& new $class_name();
$kernel_var = $this->objects[$class]->get_kernel_var();
$this->$kernel_var = $this->objects[$class]; // ACA es el error!
} else {
trigger_error("Kernel panic: Can't load the requested library(".$class."). The library is corrupted.", E_USER_ERROR);
}
}
Entonces, php me dice que para acceder a $this->kernel_var que le saque el $, pero yo no quiero acceder a $this->kernel_var, sino a $this->nombre_dinamico_contenido_en_kernel_var, entonces mi pregunta es, como hago para crear una variable de clase dinamicamente?

PD: uso PHP5.

Saludos y muchas gracias


Título: Re: Fatal error: Cannot access empty property in...
Publicado por: Ertai en 30 Diciembre 2006, 00:31 am
Has probado declarando una variable dinamicamente? No tengo nada de tiempo para probarlo, pero no pierdes nada por mirar...

Código:
var $$kernel_var;

Saludos.


Título: Re: Fatal error: Cannot access empty property in...
Publicado por: Thaorius en 30 Diciembre 2006, 06:09 am
No, no probe, en cuenta, descubri una solucion mucho mas elegante.
Como no encontraba com oarreglarlo y nadie me contestaba, busque la info de oop de php, pero claro, la ultima vez que la vi era de php4, valla sorpresa me lleve cuando vi las mejoras en l oque respecta a oop de php5. Con las funciones magicas, __get, __set, __isset, __unset arregle todo, junto con el array $objects.

Por si alguien le interesa el ejemplo, aca les dejo:
Código:
<?php
/* Check constants */
if(!defined('KERNELBASE')) trigger_error("KERNELBASE not defined.", E_USER_ERROR);
if(!defined('SELFLOC')) trigger_error("SELFLOC not defined.", E_USER_ERROR);

/* Include base API */
require_once(KERNELBASE.'core/Base.php');
require_once(KERNELBASE.'core/Library.php');
require_once(KERNELBASE.'core/KernelException.php');

/* Core class */
class TWS_Core extends TWS_Base
{
private $objects = array();
public $config;

/* Default constructor */
public function __construct()
{
/* Call TWS_Base constructor */
parent::__construct('TWS_Core');

/* Define kernel constants */
define('KERNELVERSION', '3.0');
define('KERNELSTATUS', '1');
}

private function __get($prop)
{
if(isset($this->objects[$prop]))
{
return $this->objects[$prop];
} else {
throw new KernelException("TWS_Core::__get", "Attemp to read from undefined property($prop).");
}
}

private function __set($prop, $value)
{
if(isset($this->objects[$prop]))
{
return $this->objects[$prop];
} else {
throw new KernelException("TWS_Core::__set", "Attemp to write to undefined property($prop).");
}
}

private function __isset($prop)
{
return isset($this->objects[$prop]);
}

private function __unset($prop)
{
if(isset($this->objects[$prop]))
{
unset($this->objects[$prop]);
} else {
throw new KernelException("TWS_Core::__unset", "Attemp to delete undefined property($prop).");
}
}

/* Kernel start-up routine */
public final function core_start()
{
/* Disable magic quotes */
set_magic_quotes_runtime(0);

/* Load config */
include(KERNELBASE.'config/core.conf.php');
$this->config = $core;

/* Load DataBaseEngine */
try {
$this->load_library('DataBaseEngine');

/* Start database engine */
$this->db->start_engine();

/* Load the other basic libraries */
$this->load_library('LoadableModule');
$this->load_library('LoadableTemplate');
$this->load_library('DynamicMenu');
} catch(KernelException $e) {
$e->printKernelPanic();
die();
}
}

public final function load_library($class, $instantiate = true)
{
if (isset($this->objects[$class]))
{
return;
}

if (file_exists(KERNELBASE.'core-libs/'.$class.'.lib.php'))
{
require(KERNELBASE.'core-libs/'.$class.'.lib.php');
}
else
{
if (file_exists(KERNELBASE.'libs/'.$class.'.lib.php'))
{
require(KERNELBASE.'libs/'.$class.'.lib.php');
}
else
{
throw new KernelException("TWS_Core::load_library", "Can't load the requested library(".$class."). The library doesn't exists.");
return;
}
}

if ($instantiate)
{
$class_name = 'TWS_'.$class;
if(class_exists($class_name))
{
$tmp =& new $class_name(&$this);
$this->objects[$tmp->get_kernel_var()] = $tmp;
} else {
throw new KernelException("TWS_Core::load_library", "Can't load the requested library(".$class."). The library is corrupted.");
}
}
return;
}

public final function get_loaded_libraries()
{
return $this->objects;
}

public final function install_library($location)
{
if(file_exists($location))
{
copy($location, KERNELBASE.'libs/');
}
return;
}

public final function uninstall_library($name)
{
if(file_exists(KERNELBASE.'libs/'.$name.'.lib.php'))
unlink(KERNELBASE.'libs/'.$name.'.lib.php');
}
}
?>

Gracias de todas formas.

Un Saludo