Foros del Web » Programando para Internet » PHP »

Duda con POO

Estas en el tema de Duda con POO en el foro de PHP en Foros del Web. Hola, estoy intentando aprender como funciona la programación orientada a objetos y estoy algo perdido a la hora de extender una clase a otra, tengo ...
  #1 (permalink)  
Antiguo 01/04/2014, 20:48
 
Fecha de Ingreso: enero-2008
Mensajes: 580
Antigüedad: 16 años, 3 meses
Puntos: 9
Duda con POO

Hola, estoy intentando aprender como funciona la programación orientada a objetos y estoy algo perdido a la hora de extender una clase a otra, tengo dos clases ("Alerta e Imagen") y me gustaría extenderlas a Html, pero no veo en que tramos lo estoy haciendo mal

Lo que busco es que lo siguiente funcione
Código PHP:
            $Html=new Html();
            
$Html->alert('success','Éxito','Mensaje...','close');
            
$Html->alert('info','Información','Mensaje...','close');
            
$Html->image('https://www.google.es/images/srpr/logo11w.png','rounded');
            
$Html->image('https://www.google.es/images/srpr/logo11w.png','circle'); 
Código HTML:
<!DOCTYPE html>
<html lang="">
	<head>
		<title>Title Page</title>
		<meta charset="UTF-8">
		<meta name=description content="">
		<meta name=viewport content="width=device-width, initial-scale=1">
		<meta name="viewport" content="width=device-width, initial-scale=1.0">
		<!-- Bootstrap CSS -->
		<link href="//netdna.bootstrapcdn.com/bootstrap/3.1.0/css/bootstrap.min.css" rel="stylesheet" media="screen">
		<link href="//netdna.bootstrapcdn.com/bootstrap/3.1.0/css/bootstrap-theme.min.css" rel="stylesheet" media="screen">
		<style>body {margin: 20px;}</style>
	</head>
	<body> 
Código PHP:
            class Alerta {
                
//success/info/warning/danger
                
private $alerta;
                public function 
alert($style$ttl$msg$close=null) {
                    if(isset(
$close)){$close="<button type=\"button\" class=\"close\" data-dismiss=\"alert\" aria-hidden=\"true\">&times;</button>\n";}
                echo 
$this->alerta="<div class=\"alert alert-$style alert-dismissable\">".$close."<strong>".ucwords($ttl)."!</strong> $msg</div>\n";
                }
            }
            class 
Imagen {
                
//rounded/circle/thumbnail
                
private $imagen;
                public function 
image($src$style) {
                    echo 
$this->imagen="<img src=\"$src\" alt=\"...\" class=\"img-$style\">";
                }
            }

            
$objAlerta=new Alerta();
            
$objAlerta->alert('success','Éxito','Mensaje...','close');
            
$objAlerta->alert('info','Información','Mensaje...','close');
            
$objImagen=new Imagen();
            
$objImagen->image('https://www.google.es/images/srpr/logo11w.png','circle');
            
            class 
Html extends Alerta {}
            class 
Html extends Imagen {}

            
$Html=new Html();
            
$Html->alert('success','Éxito','Mensaje...','close');
            
$Html->image('https://www.google.es/images/srpr/logo11w.png','circle'); 
Código HTML:
		<!-- jQuery -->
		<script src="//code.jquery.com/jquery.js"></script>
		<!-- Bootstrap JavaScript -->
		<script src="//netdna.bootstrapcdn.com/bootstrap/3.1.0/js/bootstrap.min.js"></script>
	</body>
</html> 

Última edición por quico5; 01/04/2014 a las 21:29
  #2 (permalink)  
Antiguo 01/04/2014, 21:33
Avatar de jheckson  
Fecha de Ingreso: febrero-2011
Ubicación: $VE->Aragua['Maracay']
Mensajes: 109
Antigüedad: 13 años, 2 meses
Puntos: 8
Respuesta: Duda con POO

Amigo estas interpretando mal el "extends"...

ClaseA extends ClaseB {}

Eso se interpreta que la Clase A hereda los metodos y atributos de la Clase B, tu lo tienes alreves

Deberias tenerlo mas bien asi:

Class Html extends Alerta {...

Pero la herencia multiple no esta permitida asi que debes idearte otra cosa, ademas que la POO no es simple hecho de usar clases y reutilizar codigos entre otra cosas, es mas cuestion de diseño que otra cosa!

Te dejo este link a un post donde comente un manual muy bueno de diseño con POO en PHP5, es algo dificil de entender en sus inicios pero cuando comienzas a entender el porque de las cosas notaras lo increible que es! =)

http://www.forosdelweb.com/f18/inici...8/#post4586005
__________________
Ayudar a otros, es una de las mejores formas de aprender y ayudarse a si mismo! =)

>[Jheck]<
  #3 (permalink)  
Antiguo 01/04/2014, 21:36
 
Fecha de Ingreso: enero-2008
Mensajes: 580
Antigüedad: 16 años, 3 meses
Puntos: 9
Respuesta: Duda con POO

Gracias por compartirme el manual @jheckson, he conseguido que me funcionase pero no se si es una sintaxis valida

class Alerta {
//success/info/warning/danger
private $alerta;
public function alert($style, $ttl, $msg, $close=null) {
if(isset($close)){$close="<button type=\"button\" class=\"close\" data-dismiss=\"alert\" aria-hidden=\"true\">&times;</button>\n";}
echo $this->alerta="<div class=\"alert alert-$style alert-dismissable\">".$close."<strong>".ucwords($ttl)."! </strong> $msg</div>\n";
}
}
class Imagen extends Alerta {
//rounded/circle/thumbnail
private $imagen;
public function image($src, $style) {
echo $this->imagen="<img src=\"$src\" alt=\"...\" class=\"img-$style\">";
}
}
class Html extends Imagen {}

$Html=new Html();
$Html->alert('success','Éxito','Mensaje...','close');
$Html->image('https://www.google.es/images/srpr/logo11w.png','circle');
  #4 (permalink)  
Antiguo 01/04/2014, 21:52
Avatar de jheckson  
Fecha de Ingreso: febrero-2011
Ubicación: $VE->Aragua['Maracay']
Mensajes: 109
Antigüedad: 13 años, 2 meses
Puntos: 8
Respuesta: Duda con POO

Aunque sea posible no es el deber ser, ya que estas heredando por el simple hecho de reutilizar codigo o juntarlo.

Por eso te pase el manual, donde explican las razones de cuando debes y no heredar de una clase u otra, una de las razones para heredar es por una relacion como seria esto:

Por ejemplo:

class Computadora {...}

class Lapto extends Compuradora {...}

class PC extends Compuradora {...}

la relacion es de lo generico (Computadora) a lo especifico (Lapto / PC) en donde lo especifico creamos o añadimos cosas que sean especifica de ella, y ya de lo generico ps tenemos una parte por asi decirlo...

Ahora con tu ejemplo:

Podriamos hacer esto:
Código PHP:
Ver original
  1. class html {
  2. private $alerta;
  3.  
  4. public function cargarAlerta($style, $ttl, $msg, $close=null)
  5. {
  6.      $this->alerta = new alerta();
  7.      $this->alerta->alert($style, $ttl, $msg, $close=null);
  8. }
  9.  
  10. }
  11.  
  12. class alerta
  13. {
  14.  private $alerta;
  15.                 public function alert($style, $ttl, $msg, $close=null) {
  16.                     if(isset($close)){$close="<button type=\"button\" class=\"close\" data-dismiss=\"alert\" aria-hidden=\"true\">&times;</button>\n";}
  17.                 echo $this->alerta="<div class=\"alert alert-$style alert-dismissable\">".$close."<strong>".ucwords($ttl)."!</strong> $msg</div>\n";
  18.                 }
  19. }
  20.  
  21. $miHtml = new html();
  22. $miHtml->cargarAlerta('aaa', 'bbb', 'hola', null);

Primero te recomiendo entender los conceptos de la programacion POO para que se te haga mas facil diseñar! Animo con el manual! =)
__________________
Ayudar a otros, es una de las mejores formas de aprender y ayudarse a si mismo! =)

>[Jheck]<

Etiquetas: html, poo
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 07:44.