Foros del Web » Programando para Internet » PHP » Frameworks y PHP orientado a objetos »

Problema con el acceso a un atributo entre clases.

Estas en el tema de Problema con el acceso a un atributo entre clases. en el foro de Frameworks y PHP orientado a objetos en Foros del Web. 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: ...
  #1 (permalink)  
Antiguo 22/01/2009, 11:40
 
Fecha de Ingreso: diciembre-2007
Mensajes: 42
Antigüedad: 16 años, 4 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
  #2 (permalink)  
Antiguo 22/01/2009, 11:54
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: Problema con el acceso a un atributo entre clases.

Pues el problema es ese, las clases privadas solamente las ve la misma clase, si quieres que esta se pase a las clases heradadas, debes de usar el modificador protected.

Saludos
  #3 (permalink)  
Antiguo 22/01/2009, 12:12
 
Fecha de Ingreso: diciembre-2007
Mensajes: 42
Antigüedad: 16 años, 4 meses
Puntos: 1
Respuesta: Problema con el acceso a un atributo entre clases.

Consideras que estoy haciendo uso de la herencia ? No hago uso de la palabra clave "extends" en ninguna de las dos clases.

EDITO: Si tu forma de decirlo... "se pase a las clases heradadas" era una forma de hablar. Desconocía total y absolutamente que los modificadores de acceso se usasé para otrás cosas, no solo en previsión de usar herencia de POO. A excepción de que si consideraba los modificadores, a nivel de ambito de bloque, ya sabes ambito global, de dentro de una función etc... Pero no por ejemplo entre instancias de objetos (mensajes, no ?)

Última edición por irilien; 22/01/2009 a las 12:22
  #4 (permalink)  
Antiguo 22/01/2009, 12:22
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: Problema con el acceso a un atributo entre clases.

En ese caso es imposible usar una propiedad privada de una clase en otra, tienes que usar un getter.

Saludos
  #5 (permalink)  
Antiguo 22/01/2009, 12:28
 
Fecha de Ingreso: diciembre-2007
Mensajes: 42
Antigüedad: 16 años, 4 meses
Puntos: 1
Respuesta: Problema con el acceso a un atributo entre clases.

Comprendo GatorV

Claro !! Con getters si se puede. No caí en la cuenta de que tengo esa genial caracteristica a mano. ( todavía soy un novato novato )

Muchas gracias. ; )
Voy a seguir y si eso. Publico los cambios.
  #6 (permalink)  
Antiguo 23/01/2009, 12:11
Avatar de enriqueplace  
Fecha de Ingreso: mayo-2005
Ubicación: Uruguay / Argentina
Mensajes: 1.102
Antigüedad: 18 años, 11 meses
Puntos: 32
Respuesta: Problema con el acceso a un atributo entre clases.

Cuidado irilien, no abuses de los getter y setter.

Busca en este mismo foro que ya hemos discutido el tema.

En resumen, sugerencias generales:
  1. Siempre atributos privados (99,99% de los casos, a menos que estés desarrollando algo extremadamente dinámico y raro )
  2. Usa métodos comunes/normales y no getter/setter
  3. Si no te queda otra, usa solo getter
  4. Si no te queda otra, usa setter
  5. Trata de evitar getter y setter a la vez (efecto "atributo público")
__________________
Blog phpsenior.com Cursos a Distancia surforce.com
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 09:08.