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

Problema con objetos

Estas en el tema de Problema con objetos en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Tengo el siguiente código: Código PHP: <? $idiomas  = array(        "Es"  => array (              "Nombre"  =>  "Español" ,              "Archivo"  =>  "spanish.php"        ),        "En"  ...
  #1 (permalink)  
Antiguo 30/10/2008, 21:41
 
Fecha de Ingreso: febrero-2008
Mensajes: 2
Antigüedad: 16 años, 2 meses
Puntos: 0
Problema con objetos

Tengo el siguiente código:

Código PHP:
<?

$idiomas 
= array(
      
"Es" => array (
            
"Nombre" => "Español",
            
"Archivo" => "spanish.php"
      
),
      
"En" => array (
            
"Nombre" => "English",
            
"Archivo" => "english.php"
      
)
);

class 
idiomas {
      var 
$idioma;

      function 
inicializar_idioma(){
            
$this->idioma = isset($_COOKIE["idioma"]) ? $_COOKIE["idioma"] : 'Es';
      }
}

class 
mensajes extends idiomas {
      function 
imprimir($mje) {
            include(
"inc/" $idiomas[$this->idioma]["Archivo"]);
            echo 
$lit[$mje];
      }
}

class 
sitio extends mensajes {
      function 
sitio(){
            
$this->inicializar_idioma();
            echo 
'Idioma: ' $idiomas[$this->idioma]["Nombre"];
      }
}
?>
Pero cuando inicializo la clase sitio en la página me imprime:
Código:
Idioma:
Por qué si debería imprimir Idioma: Español?

Alguien me puede ayudar por favor?
  #2 (permalink)  
Antiguo 30/10/2008, 21:51
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 objetos

Tema trasladado a PHP Orientado a Objetos.

Tu problema es que necesitas hacer global tu variable $idiomas o pasarla como parámetro.

Saludos.
  #3 (permalink)  
Antiguo 02/11/2008, 16:53
Avatar de ArrauKano  
Fecha de Ingreso: noviembre-2002
Ubicación: Santiago
Mensajes: 664
Antigüedad: 21 años, 5 meses
Puntos: 4
Respuesta: Problema con objetos

exacto.

$idiomas esta bajo el ámbito del método, no bajo el ámbito global.

Lo que es conveniente, es que hagas un método setIdioma(Array $idioma) o agregar eso en un constructor.
__________________
Blog | Tecnosquad
  #4 (permalink)  
Antiguo 02/11/2008, 21:25
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 objetos

Exacto, no uses variables globales.
__________________
Blog phpsenior.com Cursos a Distancia surforce.com
  #5 (permalink)  
Antiguo 04/11/2008, 09:54
 
Fecha de Ingreso: septiembre-2005
Mensajes: 142
Antigüedad: 18 años, 7 meses
Puntos: 3
Respuesta: Problema con objetos

Dios cuanta sobrecarga de herencia para tan poca funcionalidad. La POO está para ayudar y clarificar el código no para ofuscarlo.


Tienes 3 problemas fundamentales:

1) PHP4 desaparece. Si estas haciendo un site nuevo ves pensando seriamente en hacerlo con PHP5.

2) Problemas de responsabilidades entre objetos.

3) Documentacion

Creo que las clases heredadas no tienen porque tener la herencia de Idioma ya que tienen responsabilidades diferentes.

Hace tiempo que no escribo (un veterano de vuelta jaja) así que espero que me perdones por la parrafada asociada. Voy a intentar resolverte los 3 problemas con tus mismas clases:

clase Idiomas:
Código PHP:
/**
 * Gestion sobre la informacion del idioma. Mini I18N hehehe que frikada.
 * @category Idiomas
 * @package Idiomas
 */
class Idiomas 
{
      
/**
       * Idioma actual
       *
       * @var string con el idioma actual
       */
      
private $_idioma;
      
      
/**
       * Array con la informacion de cada lengua
       * tipos de archivos asociados, traduccion de las keys etc..
       *
       * @var array
       */
      
private $_idiomasArray;
      
      
/**
       * Instancia que se asegurara que solo haya un objeto del tipo Idiomas
       *
       * @var Idiomas
       */
      
private static $_instance null;
      
      
/**
       * constructor por defecto
       *
       */
      
private function __construct()
      {
          
// inicializamos las variables
          
$this->_idiomasArray = array(
                          
"Es" => array (
                                
"Nombre" => "Español",
                                
"Archivo" => "spanish.php"
                          
),
                          
"En" => array (
                                
"Nombre" => "English",
                                
"Archivo" => "english.php"
                          
)
                    );
                    
         
$this->_idioma = isset($_COOKIE["idioma"]) ? $_COOKIE["idioma"] : 'Es';
      }
      
      
/**
       * Singleton devuelve una unica instancia de la clase
       *
       * @return Idiomas
       */
      
public static function getInstance()
      {
          if(
self::$_instance == null)
              
self::$_instance = new self;
          return 
self::$_instance;
      }

      
/**
       * Devuelve un array con el idioma seleccionado
       * o por defecto el establecido
       *
       * @param string $idioma
       * @return array datos con el idioma
       */
      
public function getIdiomaInfo($idioma null)
      {
          if(
$idioma == null)
              
$idioma $this->_idioma;
                  
          return 
$this->_idiomasArray[$idioma];
      }
      
      
/**
       * devuelve el idioma actual
       *
       * @return string
       */
      
public function getIdioma(){
          return 
$this->_idioma;
      }
      
      
/**
       * Devuelve el nombre del idioma
       *
       * @param string $idioma
       * @return string nombre del idioma
       */
      
public function getNombre($idioma null)
      {
          if(
$idioma == null)
              
$idioma $this->_idioma;
              
          
$idioma_seleccionado $this->getIdiomaInfo($idioma);
          return 
$idioma_seleccionado['Nombre'];              
      }
      
      
/**
       * Devuelve el nombre del archivo de mensajes asociado al idioma
       *
       * @param string $idioma
       * @return string nombre del fichero asociado al idioma
       */
      
public function getArchivo($idioma null)
      {
          if(
$idioma == null
              
$idioma $this->_idioma;
              
          
$idioma_seleccionado $this->getIdiomaInfo($idioma);
          return 
$idioma_seleccionado['Archivo'];
      }


clase Mensajes:
Código PHP:
/**
 * Gestion sobre los mensajes a traducir.
 * @category Idiomas
 * @package Idiomas
 * 
 */
class Idiomas_Mensajes {

      
/**
       * Traducira un mensaje basado en el idioma establecido
       *
       * @param string $mensaje sera la key a traducir
       */
      
public static function imprimir($mensaje
      {
              
$fichero Idiomas::getInstance()->getArchivo();
              require_once 
'inc/' $fichero;
            echo 
$lit[$mensaje]; // ??? esto nose de donde sale;
      
}

clase Sitio:
Código PHP:
/**
 * Clase creada para bajar el benckMark del site.
 * @category Idiomas
 * @package Idiomas
 * 
 */
class Idiomas_Sitio 
{
    
    public function 
__construct()
    {
        echo 
'Idioma: 'Idiomas::getInstance()->getNombre();
    }

Idiomas: He tranformado la clase idiomas en un singleton ya que solo trabajaremos con un objeto así encapsulamos su responsabilidad y podemos gestionarlo desde cualquier parte.

Mensajes: su método es estático ya que su salida siempre será la misma. Evitamos tener copias de objetos repetidos que hacen la misma funcionalidad y sobre los que no vamos a operar.

Idiomas_Sitio: ejem.... No entiendo para que has creado esta clase. Con los cambios actuales solo tendrias que hacer esto: Idiomas::getInstance()->getNombre()

Espero que el código te ayude a comprender un poco las responsabilidades aunque no te preocupes mucho todo es práctica y todos hemos pasado por esto.

Saludos
  #6 (permalink)  
Antiguo 04/11/2008, 10:09
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 objetos

Sí, es cierto lo que dice Casuis, por responder rápido no leí bien el código.

Alex, lo que estás diciendo de alguna forma con ese código es:

  • El Mensaje es un tipo de Idioma
  • Y que Sitio es un tipo de Mensaje y a su vez es un tipo de Idioma

Para herencia siempre tienes que respetar una relación de parentesco entre las clases, no puedes heredar para acceder a código, conceptualmente es incorrecto.

Un Perro puede heredar de Mamífero, un Usuario puede heredar de Persona, etc, pero un Mensaje no puede heredar de Idioma y Sitio no puede heredar de Mensaje.

Existen otras relaciones además de herencia, tienes dependencia y asociación (y sus variantes).
__________________
Blog phpsenior.com Cursos a Distancia surforce.com
  #7 (permalink)  
Antiguo 04/11/2008, 10:23
 
Fecha de Ingreso: septiembre-2005
Mensajes: 142
Antigüedad: 18 años, 7 meses
Puntos: 3
Respuesta: Problema con objetos

cierto Enrique tiene toda la razón. Por cierto cuanto tiempo.

La explicación de Enrique es la de ingenieria del Software. A decir verdad su comentario tendría que ir antes que el mío.

Mi comentario es más de praxis y transformación de cómo se representa el modelado aplicado a la tecnología.

Enrique diseña y yo construyo yo curro más y el gana más dinero <-- es un juego dentro del mundo del software

Espero haberte aclarado algo y no ofuscarte más.
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 05:47.