Ver Mensaje Individual
  #1 (permalink)  
Antiguo 22/01/2009, 11:40
irilien
 
Fecha de Ingreso: diciembre-2007
Mensajes: 42
Antigüedad: 17 años, 2 meses
Puntos: 1
Problema con el acceso a un atributo entre clases.

Hola amigos,

Por lo visto no puedo acceder una "propiedad" privada (atributo)... y no acabo de comprender exactamente cual es mi error.

Cita:
Fatal error: Cannot access private property DatabaseConfig::$_dsn in C:\Users\pc1\Desktop\php\ModelsBase.php on line 21
Tengo dos archivos, dos clases. La primera clase se encarga simplemente de los atributos de la base de datos, usuario, contraseña, host, dsnPrefix etc...

Código PHP:
<?php
class DatabaseConfig
{
    private 
$_dsnPrefix 'mysql';
    private 
$_host 'localhost';
    private 
$_port '3306';
    private 
$_user 'root';
    private 
$_pass 'password';
    private 
$_dbName 'phpbb3';
    private 
$_dsn NULL;

    public function 
__construct()
    {
        
$this->_dsn $this->_dsnPrefix ':host=' $this->_host ';port=' $this->_port ';dbname=' $this->_dbName;
    }
}
Y con esta segunda clase lo que se pretende es, primero observar que hay un Singleton, para así tener una instancia siempre disponible para la DB... Como deshabilitamos el Constructor para evitar llamadas explicitas. Inicializo dentro del getInstance la conexión. Cogiendo los valores del la base de datos de la primera clase.

Código PHP:
<?php
require 'DatabaseConfig.php';
class 
ModelsBase
{
    private 
$_db;
    static private 
$instance NULL;

    private function 
__construct() {}

    static public function 
getInstance()
    {
       if (
self::$instance == NULL) {
          
self::$instance = new ModelsBase();
          
self::$instance->_db = new DatabaseConfig();
          
self::$instance->connect();
       }
       return 
self::$instance;
    }
    
    public function 
connect()
    {
        return new 
PDO($this->_db->_dsn$this->_db->_user$this->_db->_pass);
    }
}

// Comprobación de acceso a DB
$db ModelsBase::getInstance();
$consulta $db->prepare('SELECT * FROM phpbb3_users');
$consulta->execute();

?><ul><?php
while($fila $consulta->fetch())
{
?>
    <li><?php echo $fila[0]?></li>
    <li><?php echo $fila[1]?></li>
<?php
}
?></ul>
Que mi forma de acceder a las "propiedades" (atributos) de la primera clase es incorrecta parece obvio. Pero lo que busco comprender más que nada es el... ¿ Por que ?

Mi conjetura es que no tenga acceso o visibilidad ya que la llamada primera será estática... pero si así fuese, todavía no comprendo la razón de ese comportamiento.

Espero podais ayudarme.

Gracias