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

Duda POO en PHP con cierta herencia

Estas en el tema de Duda POO en PHP con cierta herencia en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Hola ;) Me encontré con esto que no entendía en los artículos del blog de GatorV, moderador de este foro... Pero no quiero darle la ...
  #1 (permalink)  
Antiguo 11/02/2008, 11:44
 
Fecha de Ingreso: diciembre-2007
Mensajes: 42
Antigüedad: 16 años, 4 meses
Puntos: 1
Duda POO en PHP con cierta herencia

Hola ;)

Me encontré con esto que no entendía en los artículos del blog de GatorV, moderador de este foro... Pero no quiero darle la paliza jaja ;) Así que pregunto por aquí. Entre todos seguro será mejor.

La cuestión es que leyendo los articulos de mvc concretamente cuando crea por ejemplo la clase "view.php" hace una cosa en la mismisima primera linea... que no comprendo su funcionalidad, su fin...

Código PHP:
<?php
  
class ViewException extends Exception {}
  class 
View {
       private 
$data;
       private 
$template;
       private 
$layout;
       
       public function 
__construct() {}
       
       public function 
setData$data ) {
            if( !
is_array$data ) ) {
                 throw new 
ViewException('$data se esperaba fuera un arreglo, se envio un ' gettype$data ));
            }
            
$this->data $data;
       }
  ...
  }
Pues lo dicho... no entiendo cual es el fin, que se consigue haciendo esto... es decir... Declarar una clase que extiende otra... pero sin ningun miembro... ni atributos ni metodos... tampoco comprendo como podría afectar sobre la clase "view.php" que crea justo a la linea siguiente...

Será algun comportamiento o caracteristica de POO que desconozco supongo. Les agradecería si ustedes saben de que se trata esto me cuenten vaya...

Y aviso: Mi intención no es intentar llevar a cabo el articulo del blog, el articulo creo que tiene un fin ilustrativo... pero si ke me gustaría saber más acerca de esta forma de trabajar con las clases...

Muchas gracias !
  #2 (permalink)  
Antiguo 11/02/2008, 12:10
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Re: Duda POO en PHP con cierta herencia

La idea de heredar sin métodos es simplemente para hacer mas fácil el cachar errores, por decir:
Código PHP:
try {
         
// Tareas dificiles
} catch( SQLException $se ) {
        
// Guardar en un log todo lo de errores con SQL
} catch( FileWriteException $fwe ) {
        
// Guardamos en otro lado errores de escritura
} catch( Exception $e ) {
       throw 
$e// Si no es un error de los que nos interesan lo dejamos pasar.

Si ves el código podemos atrapar diferentes excepciones y manejar las cosas de forma especifica, es por eso que heredar de una clase directamente sin miembros nos da esa funcionalidad.

Saludos.
  #3 (permalink)  
Antiguo 12/02/2008, 16:04
 
Fecha de Ingreso: diciembre-2007
Mensajes: 42
Antigüedad: 16 años, 4 meses
Puntos: 1
Re: Duda POO en PHP con cierta herencia

Hola GatorV, gracias por tu respuesta.

Entiendo entonces que al extender la clase Exceptions adquiere la funcionalidad. De acuerdo. De forma que sería como adquirir una clase especifica de excepciones para vistas. He comprendido un poco mejor estos ejemplos... http://es.php.net/exceptions

Pero me gustaría cerciorarme de algo, al declarar esa clase con herencia... aunque no tenga miembros. Por una parte adquiriría si la funcionalidad de Exception... pero en este caso, nada más. No añades ninguna funcionalidad personalizada y si quisieramos añadirla debería ser dentro de esa declaración de la clase, no ? es decir... A lo que voy. NO habría en este caso una clase creada (o no permitiría crearla) en otro lugar con miembros y a la vez en el archivo "view.php" esta vez sin los miembros. No ? Por que lo que estaríamos haciendo sería intentar crear una clase ya creada aunque no tenga ni un solo miembro... ¿ Me equivoco ?

Gracias una vez más ;)
  #4 (permalink)  
Antiguo 12/02/2008, 16:27
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Re: Duda POO en PHP con cierta herencia

¿Podrías especificar mas cual es tu duda?, Estoy tratando de entender lo que dices pero no logro entender cual es tu duda.

Saludos.
  #5 (permalink)  
Antiguo 12/02/2008, 18:03
 
Fecha de Ingreso: diciembre-2007
Mensajes: 42
Antigüedad: 16 años, 4 meses
Puntos: 1
Re: Duda POO en PHP con cierta herencia

Si, disculpa si resulté confuso.

En el ejemplo hay un archivo view.php con dos clases declaradas...

Código PHP:
<?php 
  
class ViewException extends Exception {} 
  class 
View 
       ... 
  }
?>
1. Declaras una clase que hereda de Exception adquiriendo su funcionalidad. Sin miembros. Me refería a si tu ejemplo contemplaba una declaración externa de la misma clase, en otro lugar, en otro archivo... esta vez si con miembros que le den funcionalidades propias...

Pero si no me equivoco... PHP lo que te diría es que la clase ya estaba definida una vez y no te permitiría redefinirla de nuevo, no ?


2. Por otra parte... No acabo de entender por que la clase View tiene visibilidad sobre la clase ViewException... (Puedes hacer un throw new ViewException dentro de View).
  • Es por que la clase ViewException Hereda de una clase que es propia del lenguaje, la clase Exception ?
  • Es por que el thow new hace una llamada estatica ? o como funciona esto...
No he encontrado documentación especifica acerca del "throw new"

Gracias por la paciencia !! Se que soy algo duro jeje
  #6 (permalink)  
Antiguo 12/02/2008, 23:12
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Re: Duda POO en PHP con cierta herencia

1.- La clase ViewException esta definida ahi para ahorrar codigo, pero puede estar definida en otro fichero sin ningun problema aunque no tenga miembros ni nada (de hecho es mas recomendable que este en su fichero propio).

2.- La clase View ve a ViewException porque esta definida aunque estuviera asi:
Código PHP:
<?php
include( 'View/Exception.php' );
class 
View {

}
Como te comento no importa donde este la clase con que tu la incluyas la puedes lanzar.

Para usar el comando throw tu debes de tener una clase que herede de Exception, no puedes lanzar clases que no hereden a Exception (esto es por diseño).

El comando throw lanza una clase por decir lanzar una excepcion nueva:
Código PHP:
throw new Exception"algo paso mal" ); 
y la cachas en un bloque catch, pero que pasa como te decia en un ejemplo mas grande donde solo deseas cachar errores de SQL:
Código PHP:
function algo() {
     try {
            
// muchas cosas
     
} catch( SQLException $se ) {
           
// logueamos o rollback o algo
     
} catch( Exception $e ) { // bloque generico para todas las excepciones
          
Logger::log$e->getMessage() );
          throw 
$e// Aqui relanzamos la excepcion para que un bloque mayor la controle
     
}
}


try {
      
algo();
} catch( 
Exception $e ) { // Este bloque no se va a ejecutar para excepciones de SQL, ya que esas las "cachamos" dentro de nuestra funcion y nunca van a llegar aca...
      
echo $e->getMessage();

Como puedes ver, lanze una excepcion ya creada dentro del bloque catch para atraparla mas arriba en mi codigo, para eso sirve el comando throw.

Saludos.
  #7 (permalink)  
Antiguo 13/02/2008, 03:39
 
Fecha de Ingreso: diciembre-2007
Mensajes: 42
Antigüedad: 16 años, 4 meses
Puntos: 1
Re: Duda POO en PHP con cierta herencia

Amazing !!! De verdad, ahora si que me queda mucho más claro.

Muchas gracias GatorV
  #8 (permalink)  
Antiguo 13/02/2008, 04:45
 
Fecha de Ingreso: octubre-2007
Mensajes: 394
Antigüedad: 16 años, 6 meses
Puntos: 2
Re: Duda POO en PHP con cierta herencia

Uniendome al tema, tengo una pregunta. Cuantas excepciones se suelen hacer normalmente? Se que me diras que depende dle programador, de la pagina, del programa..etc... Pero me refiero a que por ejemplo, a la hora de trabajar con consultas SQL, puedes crear una excepcion para decir que no quedan filas en la consulta que has hecho, puedes crear otra para decir que lo que estas insertando no se puede insertar porque le falta el "@"....nose cosas asi.........y si declararamos para cada cosa de estas una clase nueva que herede de EXCEPTION....ps al final podriamos tener 100 clases solo de excepciones.........
cual suele ser la manera mas logica de operar con ellas y de crearlas...etc?
  #9 (permalink)  
Antiguo 13/02/2008, 08:54
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Re: Duda POO en PHP con cierta herencia

Por eso las excepciones si te fijas el segundo parametro es el error code:
Código PHP:
<?php
class Exception
{
    protected 
$message 'Unknown exception';   // exception message
    
protected $code 0;                        // user defined exception code
    
protected $file;                            // source filename of exception
    
protected $line;                            // source line of exception

    
function __construct($message null$code 0);

    final function 
getMessage();                // message of exception 
    
final function getCode();                   // code of exception
    
final function getFile();                   // source filename
    
final function getLine();                   // source line
    
final function getTrace();                  // an array of the backtrace()
    
final function getTraceAsString();          // formated string of trace

    /* Overrideable */
    
function __toString();                       // formated string for display
}
?>
Entonces nosotros solo creamos una excepcion para SQL y damos nuestros codigos de error:
Código PHP:
class SQLException extends Exception {
         const 
ERROR_NO_ROWS_UPDATED 1;
         const 
ERROR_QUERY_INCOMPLETE2;

Luego lanzas solo las excepciones:
Código PHP:
if( error_en_query() ) {
        throw new 
SQLException"Hay un error en el Query $query"SQLException::ERROR_QUERY_INCOMPLETE );

y asi puedes ya cacharlas en otro lugar:
Código PHP:
catch( SQLException $e ) {
       if( 
$e->getCode() == SQLException::ERROR_QUERY_INCOMPLETE ) {
               echo 
"Tienes un error en tu query, verifica que esta bien escrita";
       } else { 
// es otro error, podemos checar o guardar
               
Logger::log$e->getMessage();
               echo 
"Hay un error en la base de datos...";
       }

Saludos.
  #10 (permalink)  
Antiguo 13/02/2008, 11:36
 
Fecha de Ingreso: octubre-2007
Mensajes: 394
Antigüedad: 16 años, 6 meses
Puntos: 2
Re: Duda POO en PHP con cierta herencia

mm vale tonces lo que tu haces es unir todas las excepciones que tienen que ver con SQL en una misma clase....y diferenciar las distintas "subexcepciones SQL" mediante atributos...k te van a chivar cual a sido el error, no???

lo que no entiendo muy bien es
Código PHP:
class SQLException extends Exception {
         const 
ERROR_NO_ROWS_UPDATED 1;
         const 
ERROR_QUERY_INCOMPLETE2;

por un lado ....esos dos atributros....nose pk pones lo de const y lo del =1 y =2

y luego tampoco entiendo la parte en la k aces el throw el segundo parametro ese
throw new SQLException( "Hay un error en el Query $query", SQLException::ERROR_QUERY_INCOMPLETE );


vamos, creo que entiendo lo que intentas lograr, que supongo que es lo que e dicho en el primer parrafo..pero no pillo muy bien la implementacion
  #11 (permalink)  
Antiguo 13/02/2008, 12:18
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Re: Duda POO en PHP con cierta herencia

const sirve para crear una constante que se evalúa a algo, es como un define, es para darle a un valor un nombre y sea mas fácil de leer el código.

El segundo parámetro al crear la excepción es el código de error.

Saludos.
  #12 (permalink)  
Antiguo 13/02/2008, 14:28
 
Fecha de Ingreso: octubre-2007
Mensajes: 394
Antigüedad: 16 años, 6 meses
Puntos: 2
osea ese segundo parametro es como si le pasaras como codigo de error un 2, no?
(pk como as puesto const ERROR_QUERY_INCOMPLETE= 2; )

Pero lo que no pillo de este segundo parametro throw new SQLException( "Hay un error en el Query $query", SQLException::ERROR_QUERY_INCOMPLETE );

es la sintaxis.....lo de los :: y eso

un saludo...

mmm habiendolo pensado..mmm....lo de :: qué es para darle el valor de esa constante que tiene SQLException como atributo?

osea cuando haces variable1 = nombreDeClase :: nombreDeConstante

variable1 tomaria el valor de esa constante, no? para eso es lo de ::? por tanto un atributo const es publico? cualquiera desde fuera tiene acceso a el? y cualquier instancia de esa clase va a tener esas constantes inmodificables, no?

un saludo?

Última edición por GatorV; 13/02/2008 a las 15:28
  #13 (permalink)  
Antiguo 13/02/2008, 15:15
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Re: Duda POO en PHP con cierta herencia

Asi es, cuando tu usas :: estas accesando a un atributo de la clase, tu puedes usarlo para llamar a funciones estaticas de una clase, o a constantes, o a variables estaticas:
Código PHP:
NombreClase::hazAlgo();
NombreClase::VALOR_CONSTANTE;
NombreClase::$atributoPublico "hola"
Saludos.
  #14 (permalink)  
Antiguo 13/02/2008, 15:21
 
Fecha de Ingreso: octubre-2007
Mensajes: 394
Antigüedad: 16 años, 6 meses
Puntos: 2
Re: Duda POO en PHP con cierta herencia

gracias perfecto
  #15 (permalink)  
Antiguo 13/02/2008, 15:28
 
Fecha de Ingreso: octubre-2007
Mensajes: 394
Antigüedad: 16 años, 6 meses
Puntos: 2
Re: Duda POO en PHP con cierta herencia

aprovechando el tema............no entiendo muy bien cuando usar metodos estaticos......pk variables estaticas se usan cuando el valor de esa variable es el mismo para todos los objetos instanciados de esa clase......pero los metodos estaticos¿

un saludo y gracias
  #16 (permalink)  
Antiguo 13/02/2008, 15:29
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Re: Duda POO en PHP con cierta herencia

Te recomiendo busques en el foro, ya se ha tratado mucho el tema, pero principalmente es para poder tener funciones que solo se ocupen de forma rápida y no tener que iniciar un objeto.

Saludos.
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 18:52.