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

Propiedades genéricas

Estas en el tema de Propiedades genéricas en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Hola, y aviso que es una pregunta de novato. Estoy tonteando un poco con las clases, para aprender, y se me ha planteado esta duda: ...
  #1 (permalink)  
Antiguo 15/11/2008, 05:32
Avatar de mariogl84  
Fecha de Ingreso: noviembre-2002
Ubicación: Barcelona
Mensajes: 433
Antigüedad: 21 años, 5 meses
Puntos: 20
Propiedades genéricas

Hola, y aviso que es una pregunta de novato.

Estoy tonteando un poco con las clases, para aprender, y se me ha planteado esta duda: tengo una clase con unas propiedades que son generales para todo mi sitio web, pero que cambiarían si se usaran en otro. Por ejemplo, una ruta donde buscar archivos (en mi sitio siempre va a ser la misma, pero si lo uso en otro sitio cambiará).

Al ser generales, no quiero tener que darles un valor cada vez que creo un objeto. Pero tampoco quiero darles el valor dentro del código de la clase, porque supongo que la clase debería poderse usar en otro sitio sin tocar su interior, ¿no?

Ejemplo tonto para ilustrar mi duda:

class Archivo {

private $directorio;
private $archivo;
.
.
.

El archivo cambiará en cada objeto, pero el directorio será siempre el mismo. ¿Cómo puedo hacer para que no tenga que pasarle el directorio al constructor cada vez que instancio la clase, ni que darle el valor dentro del código de la clase?

Gracias.
  #2 (permalink)  
Antiguo 15/11/2008, 15:33
Avatar de emiliodeg  
Fecha de Ingreso: septiembre-2005
Ubicación: Córdoba
Mensajes: 1.830
Antigüedad: 18 años, 7 meses
Puntos: 55
Respuesta: Propiedades genéricas

o creas una propiedad estatica o lo heredas

para la estatica

class Archivo{
public $archivo;
public static $directorio='algundirectorio/';
public function __construct($archivo){
$this->archivo=$archivo;
}
}
aca lo accederias como self::$directorio;

asi siempre q crees un objeto nuevo vas a tener el directorio igual

heredando

class ArchivoPadre {
protected $directorio='algo/';
}
class Archivo extends ArchivoPadre{
public $archivo;
public function __construct($archivo){
$this->archivo=$archivo;
}
}

aca accederias como $this->directorio;

saludos y espero te sirva la ayuda
__________________
Degiovanni Emilio
developtus.com
  #3 (permalink)  
Antiguo 15/11/2008, 16:58
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: Propiedades genéricas

Que tal Mario

Cita:
Estoy tonteando un poco con las clases, para aprender,
Creo que ya me debes haber leído alguna vez, dudo que jugar solo con las clases llegues a algo productivo. Sugiero que te apoyes en conceptos, un libro, UML, manual de Java, pero no probar por probar. Aún el manual de PHP es pobre en ese sentido, justamente, porque es un manual técnico de sintaxis, no de programación.

Cita:
y se me ha planteado esta duda: tengo una clase con unas propiedades que son generales para todo mi sitio web, pero que cambiarían si se usaran en otro. Por ejemplo, una ruta donde buscar archivos (en mi sitio siempre va a ser la misma, pero si lo uso en otro sitio cambiará).
Sugerencia, cambia el término "propiedades" por "atributos", no siempre una propiedad es un atributo.

Lo que tú estás describiendo es lo más parecido a una constante, y en particular, de configuración.
  • las constantes son siempre públicas a todo el sistema
  • nadie las puede modificar luego de definidas (o no serían "constantes").

Puedes crearte un archivo configuracion.php y ahí definir todas las constantes del sistema, del estilo:

Código PHP:
<?php
error_reporting
(E_ALL E_STRICT);

/* RUTAS */
define('HOME''C:\xampp\htdocs');
define('APP_NAME''tarea8_solucion');
define('APP'HOME DIRECTORY_SEPARATOR APP_NAME );
define('LOG'APP DIRECTORY_SEPARATOR 'logs' );
Cita:
Al ser generales, no quiero tener que darles un valor cada vez que creo un objeto. Pero tampoco quiero darles el valor dentro del código de la clase, porque supongo que la clase debería poderse usar en otro sitio sin tocar su interior, ¿no?
Una variante que puedes hacer es crear una constante de la clase, pero, solo deberías usarla si esa constante está relacionada con la clase, no por comodidad.

Del estilo:

Código PHP:
class Archivo 
{
    const 
DIR '/tmp';
        
    public function 
getDir()
    {
       return 
self::DIR;
    }

También serán públicas, y podrás usarla desde fuera de la clase. Imaginemos que tenemos un método crear un archivo y le paso el nombre y el directorio por defecto (estoy inventando cualquier cosa):

Código PHP:
$archivo = new Archivo();

$archivo->creaArchivoNuevo('nombre del archivo'Archivo::DIR); 
Cita:
El archivo cambiará en cada objeto, pero el directorio será siempre el mismo. ¿Cómo puedo hacer para que no tenga que pasarle el directorio al constructor cada vez que instancio la clase, ni que darle el valor dentro del código de la clase?
Como comenté anteriormente, o defines una constante en la clase, pero esa información quedará a fuego y es la típica que debe ser "configurable", por lo tanto lo ideal es en un archivo de configuración.
__________________
Blog phpsenior.com Cursos a Distancia surforce.com
  #4 (permalink)  
Antiguo 15/11/2008, 17:00
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: Propiedades genéricas

Estimado,

1. Herencia por Herencia, no, prohibido.

2. Atributos públicos, no, prohibido.

__________________
Blog phpsenior.com Cursos a Distancia surforce.com
  #5 (permalink)  
Antiguo 17/11/2008, 11:10
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: Propiedades genéricas

O usar un archivo de configuración, date una vuelta por Zend Framework, el paquete Zend_Config hace eso que necesitas precisamente.

Saludos.
  #6 (permalink)  
Antiguo 17/11/2008, 13:02
Avatar de MaBoRaK  
Fecha de Ingreso: abril-2003
Ubicación: La Paz - Bolivia
Mensajes: 2.003
Antigüedad: 21 años
Puntos: 35
Respuesta: Propiedades genéricas

loading..........


Algo que yo hago es crearme las "opciones" en un array y pasarlos a la clase padre al inicializarlo.

Código PHP:
$a = new App_Facebook(array(
   
'dir'=>'bla/',
   
'db'=>array('hostname'=>'blabla')
)); 
Código PHP:
$b = new App_Facebook(array(
   
'dir'=>'bla/',
   
'db'=>array('hostname'=>'mabich.com')
)); 
De esta forma tengo un set de configuración para esa clase y si quiero tener por ejemplo 3 tipos de aplicación dependiendo de una sola clase me sirve muchismo, en cambio definir (define) los parametros para su funcionamiento te limita a UN SOLO set de configuración.


connection closed.
__________________

Maborak Technologies
  #7 (permalink)  
Antiguo 17/11/2008, 15:57
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: Propiedades genéricas

Estimado MaBoRak,

Hay muchas opciones posibles (y siempre dependientes del contexto, no hay una mejor que otra) y es entendible lo que dices, pero lo que solicita el colega es todo lo contrario, por esa razón nadie le dio una solución basada en el constructor.
__________________
Blog phpsenior.com Cursos a Distancia surforce.com
  #8 (permalink)  
Antiguo 21/11/2008, 02:30
Avatar de mariogl84  
Fecha de Ingreso: noviembre-2002
Ubicación: Barcelona
Mensajes: 433
Antigüedad: 21 años, 5 meses
Puntos: 20
Respuesta: Propiedades genéricas

Gracias a todos por las respuestas.

Leyéndoos me da la sensación de que estaba pidiendo una tontería. Lo que yo preguntaba era si se podían evitar estos dos casos:


- que el valor en cuestión se meta en el código interno de la clase (así, si le quiero pasar la clase a mi primo Pablito, él no tendrá que tocar nada del código de la clase).

- que tuviera que enviar ese valor cada vez que instanciara la clase.


Por ejemplo, si defino una constante en un archivo de configuración, como me habéis sugerido, luego la uso dentro de mi clase, y de cara a la portabilidad podría indicar en la documentación que para usar esta clase hay que definir la constante tal.

Código PHP:
<?php
error_reporting
(E_ALL E_STRICT);

/* RUTAS */
define('HOME''C:\xampp\htdocs');
Código PHP:
<?php
class Archivo {

    private 
$directorio HOME;
    private 
$archivo;
.
.
.
Y añadir en la documentación que para usar esta clase hay que definir externamente una constante HOME.

Esto supongo que funciona, pero ¿es coherente con la POO o estoy proponiendo una burrada?

Gracias.
  #9 (permalink)  
Antiguo 21/11/2008, 04: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: Propiedades genéricas

Es coherente con la disciplina de la programación en sí

Si quieres distribuir clases, genera o archivos de configuración para las clases que lo necesiten o un solo archivo de configuración para el conjunto (sistema, paquete, etc).

No le des más vueltas.
__________________
Blog phpsenior.com Cursos a Distancia surforce.com
  #10 (permalink)  
Antiguo 21/11/2008, 09:10
Avatar de mariogl84  
Fecha de Ingreso: noviembre-2002
Ubicación: Barcelona
Mensajes: 433
Antigüedad: 21 años, 5 meses
Puntos: 20
Respuesta: Propiedades genéricas

De acuerdo, gracias.
  #11 (permalink)  
Antiguo 21/11/2008, 09:38
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: Propiedades genéricas

Insisto si quieres algo mas "limpio" ve la clase Zend_Config, de esa forma no toca ningun archivo PHP solamente un XML, o un .ini.

Saludos.
  #12 (permalink)  
Antiguo 21/11/2008, 14:25
Avatar de mariogl84  
Fecha de Ingreso: noviembre-2002
Ubicación: Barcelona
Mensajes: 433
Antigüedad: 21 años, 5 meses
Puntos: 20
Respuesta: Propiedades genéricas

Gracias, GatorV. Le echaré un vistazo.
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

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 03:17.