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

PHP OO Duda agregacion,metodos magicos,etc

Estas en el tema de Duda agregacion,metodos magicos,etc en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Hola, Llevo varios dias con el mismo problema y la verdad es que no encuentro ninguna solucion,a ver si alguien me podia ayudar. Os voy ...
  #1 (permalink)  
Antiguo 26/12/2012, 06:25
 
Fecha de Ingreso: diciembre-2012
Mensajes: 26
Antigüedad: 11 años, 4 meses
Puntos: 0
Duda agregacion,metodos magicos,etc

Hola,
Llevo varios dias con el mismo problema y la verdad es que no encuentro ninguna solucion,a ver si alguien me podia ayudar.
Os voy a poner el codigo un poco resumido a ver

Código PHP:
class Medidas{

private 
$alto;
private 
$largo;
public function 
__construct($alto,$largo)
{
$this->alto $alto;
$this->largo $largo;
}
public function 
__set($name$value)
{
    switch(
$name)
    {
        case 
'Alto':
            
$this->alto =$value;
            break;
        case 
'Largo':
            
$this->largo=$value;
            break;
    }
}
}

class 
Clase1 {
private 
$propiedad1;
private 
$Medidas;
public function 
__construct($propiedad1Medidas $Medidas){
$this->propiedad1=$peopiedad1;
$this->Medidas->$Medidas;
}
    public function 
__clone()
        {
            
$this->Medidas=clone $this->Medidas;
        }
}

class 
Clase2 extends Clase1{
private 
$propiedad2;
public function 
__construct($propiedad1,$Medidas,$propiedad2){
parent::_construct($propiedad1,$Dimensiones);
$this->propiedad2->$propiedad2
}


Y despues para utilizar tengo el siguiente codigo

Código PHP:
$prueba=new Clase2('hola',new Medidas(20,30),'adios');

$clonar= clone $prueba;

$clonar->Medidas->Alto=10;
$clonar->Medidas->Largo=20
El problema es que al utilizar "$clonar->Medidas->Alto=10;" me da error.
Y ademas tengo que utilizar ese codigo,no puedo poner un setMedidas.

Alguien me puede ayudar?

Gracias y Saludos
  #2 (permalink)  
Antiguo 26/12/2012, 08:32
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 15 años
Puntos: 1517
Respuesta: Duda agregacion,metodos magicos,etc

Bueno verificando tienes bastantes errores, pero son cuestión de corregir operadores,
Código PHP:
Ver original
  1. <?php
  2. class Medidas{
  3.     private $alto;
  4.     private $largo;
  5.     public function __construct($alto,$largo)
  6.     {
  7.         $this->alto = $alto;
  8.         $this->largo = $largo;
  9.     }
  10.     public function __set($name, $value)
  11.     {
  12.         switch($name)
  13.         {
  14.             case 'Alto':
  15.                 $this->alto =$value;
  16.                 break;
  17.             case 'Largo':
  18.                 $this->largo=$value;
  19.                 break;
  20.         }
  21.     }
  22. }
  23.  
  24. class Clase1 {
  25.     private $propiedad1;
  26.     private $Medidas;
  27.  
  28.     public function __construct($propiedad1, Medidas $Medidas)
  29.     {
  30.         $this->propiedad1=$propiedad1;
  31.         $this->Medidas = $Medidas;
  32.     }
  33.  
  34.     public function __clone()
  35.     {
  36.         $this->Medidas = clone $this->Medidas;
  37.     }
  38. }
  39.  
  40. class Clase2 extends Clase1{
  41.     private $propiedad2;
  42.  
  43.     public function __construct($propiedad1,$Medidas,$propiedad2)
  44.     {
  45.         parent::__construct($propiedad1,$Medidas);
  46.         $this->propiedad2 = $propiedad2;
  47.     }
  48. }
  49.  
  50. $prueba=new Clase2('hola',new Medidas(20,30),'adios');
  51.  
  52. $clonar = clone $prueba;
  53.  
  54. $clonar->Medidas->Alto=10;
  55. $clonar->Medidas->Largo=20;
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #3 (permalink)  
Antiguo 26/12/2012, 12:54
 
Fecha de Ingreso: diciembre-2012
Mensajes: 26
Antigüedad: 11 años, 4 meses
Puntos: 0
Respuesta: Duda agregacion,metodos magicos,etc

Hola,
no entiendo que errores hay en el codigo que he puesto,porque son las dos ultimas lineas :
"$clonar->Medidas->Alto=10;
$clonar->Medidas->Largo=20;"
lo demas no da errores,solo es la duda de esas lineas.

Como hacer para acceder a Medidas y sus metodos desde la Clase2 que a su vez hereda de la Clase1 y que agrega una variable del tipo Dimensiones.

No se si me explico muy bien,pero bueno,esas son las dudas que tengo.

Saludos y Gracias
  #4 (permalink)  
Antiguo 26/12/2012, 12:59
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 19 años
Puntos: 839
Respuesta: Duda agregacion,metodos magicos,etc

Sí que el código da varios errores/notificaciones, quizás no los veas por desactivar el reporte.

Una cosa que no estás teniendo en cuenta es la visibilidad de la propiedad Medidas. La estás declarando como privada en Clase1, por lo que ni siquiera en Clase2 es accesible, y menos de forma pública.
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
  #5 (permalink)  
Antiguo 26/12/2012, 13:00
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 15 años
Puntos: 1517
Respuesta: Duda agregacion,metodos magicos,etc

Bueno el código que expusiste, tenía bastantes errores, ¿trataste el que coloqué corrigiendo los erroes? Con el no debes ver ningún error incluyendo las líneas que indicas.

Añado, deberías de usar el método mágina __get para obtener los datos de las variables para que las tengas disponibles en forma publica.
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #6 (permalink)  
Antiguo 27/12/2012, 05:12
 
Fecha de Ingreso: diciembre-2012
Mensajes: 26
Antigüedad: 11 años, 4 meses
Puntos: 0
Respuesta: Duda agregacion,metodos magicos,etc

Vale,he revisado y ampliado el código

Código PHP:
Ver original
  1. class Medidas{
  2.         private $alto;
  3.         private $largo;
  4.         public function __construct($alto,$largo)
  5.         {
  6.             $this->alto = $alto;
  7.             $this->largo = $largo;
  8.         }
  9.         public function __set($name, $value)
  10.         {
  11.             switch($name)
  12.             {
  13.                 case 'Alto':
  14.                     $this->alto =$value;
  15.                     break;
  16.                 case 'Largo':
  17.                     $this->largo=$value;
  18.                     break;
  19.             }
  20.         }
  21.        
  22.         public function __get($name)
  23.         {
  24.             switch($name)
  25.             {
  26.                 case 'Alto':
  27.                     return $this->alto;
  28.                     break;
  29.                 case 'Largo':
  30.                     return $this->largo;
  31.             }
  32.         }
  33.        
  34.         public function __toString()
  35.         {
  36.             return 'alto='.$this->alto.','.
  37.                     'largo='.$this->largo.'<br>';
  38.         }
  39.     }
  40.      
  41.     class Clase1 {
  42.         private $propiedad1;
  43.         private $Medidas;
  44.      
  45.         public function __construct($propiedad1, Medidas $Medidas)
  46.         {
  47.             $this->propiedad1=$propiedad1;
  48.             $this->Medidas = $Medidas;
  49.         }
  50.      
  51.         public function __clone()
  52.         {
  53.             $this->Medidas = clone $this->Medidas;
  54.         }
  55.         public function __toString()
  56.         {
  57.             return 'propiedad1 '.$this->propiedad1.'<br>'.
  58.                     'medidas='.$this->Medidas;
  59.         }
  60.     }
  61.      
  62.     class Clase2 extends Clase1{
  63.         private $propiedad2;
  64.      
  65.         public function __construct($propiedad1,$Medidas,$propiedad2)
  66.         {
  67.             parent::__construct($propiedad1,$Medidas);
  68.             $this->propiedad2 = $propiedad2;
  69.         }
  70.        
  71.         public function __toString()
  72.         {
  73.             return parent::__toString().
  74.                     'propiedad2 '.$this->propiedad2.'<br>';
  75.         }
  76.     }
  77.      
  78.     $prueba=new Clase2('hola',new Medidas(20,30),'adios');
  79.    
  80.     $clonar = clone $prueba;
  81.      echo $clonar;
  82.     $clonar->Medidas->Alto;
  83.     $clonar->Medidas->Largo;
  84.    
  85.     $medidas=new Medidas(50, 50);
  86.     echo $medidas;
  87.    echo $medidas->Alto;
  88.    $medidas->Alto=35;
  89.    echo $medidas;

He estado haciendo pruebas con un objeto de la clase medidas para ver si funcionaba el __set y el __get y funciona correctamente(85-89) ,pero "$clonar->Medidas->Alto" no funciona ni obteniendo valor ni poniendo.

No se si es problema mio o si a vosotros os funciona...

Y bueno lo que indica David , a ver ,yo entiendo que se debe acceder al objeto Medidas que ha sido heredado de la clase1 para acceder a sus funciones publicas __get y __set ¿no es asi?,ademas me piden que sea privado Medidas.

Gracias y Saludos
  #7 (permalink)  
Antiguo 27/12/2012, 05:34
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 19 años
Puntos: 839
Respuesta: Duda agregacion,metodos magicos,etc

Cita:
Iniciado por ivan_esp Ver Mensaje
Y bueno lo que indica David , a ver ,yo entiendo que se debe acceder al objeto Medidas que ha sido heredado de la clase1 para acceder a sus funciones publicas __get y __set ¿no es asi?,ademas me piden que sea privado Medidas.
A lo que iba es que justamente de la forma como lo tienes no puedes acceder a Medidas desde fuera de Clase1.
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
  #8 (permalink)  
Antiguo 27/12/2012, 06:31
 
Fecha de Ingreso: diciembre-2012
Mensajes: 26
Antigüedad: 11 años, 4 meses
Puntos: 0
Respuesta: Duda agregacion,metodos magicos,etc

Cita:
Iniciado por David Ver Mensaje
A lo que iba es que justamente de la forma como lo tienes no puedes acceder a Medidas desde fuera de Clase1.
Pues tienes razón David, ha sido poner public y todo a funcionar,con la de cosas que habia probado y no me habia fijado en eso...

El caso es que me piden que sea privado,hay alguna forma de que funcione siendo privado?

Gracias y Saludos
  #9 (permalink)  
Antiguo 27/12/2012, 06:42
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 19 años
Puntos: 839
Respuesta: Duda agregacion,metodos magicos,etc

Tendrás que usar justamente los métodos mágicos __get y __set

Solo ten en cuenta que desde Clase2 tampoco puedes acceder directamente (podrías acceder si la tuviera visibilidad protected)
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
  #10 (permalink)  
Antiguo 27/12/2012, 09:30
 
Fecha de Ingreso: diciembre-2012
Mensajes: 26
Antigüedad: 11 años, 4 meses
Puntos: 0
Respuesta: Duda agregacion,metodos magicos,etc

Cita:
Iniciado por David Ver Mensaje
Tendrás que usar justamente los métodos mágicos __get y __set

Solo ten en cuenta que desde Clase2 tampoco puedes acceder directamente (podrías acceder si la tuviera visibilidad protected)
Pero no estoy utilizando ya los metodos mágicos?

PD:Otra duda si alguien me la puede resolver,tengo que hacer una calculadora en php ,pero claro ,no es lo mismo que en javascript que puedo ir pulsando numeros y operaciones y se va realizando "en tiempo real",esto que seria poner dos campos para dos numeros y enviar el formulario con la operacion y que te devuelva el resulado? Porque yo creo que no hay manera de hacer una calculadora "normal" como en javascript ¿no?

Saludos y Gracias
  #11 (permalink)  
Antiguo 27/12/2012, 09:37
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
Respuesta: Duda agregacion,metodos magicos,etc

Los estas usando, pero solo en tu clase Medidas, tienes que usarlos en este caso también en Clase1, y en Clase2, el problema como bien dice @David es la visibilidad, en tu clase 2 no existe ya que es private, tienes que ponerlo como protected para poderlo ver.

¿A que te refieres con "normal"? Tanto en PHP como en Javascript se puede hacer de la misma manera, son los mismos operadores, la única diferencia como bien dices es que con PHP debes de enviar al servidor para que sea procesado ahí el calculo y en Javascript se realiza en el cliente.

Saludos.
  #12 (permalink)  
Antiguo 27/12/2012, 11:20
 
Fecha de Ingreso: diciembre-2012
Mensajes: 26
Antigüedad: 11 años, 4 meses
Puntos: 0
Respuesta: Duda agregacion,metodos magicos,etc

Cita:
Iniciado por GatorV Ver Mensaje
Los estas usando, pero solo en tu clase Medidas, tienes que usarlos en este caso también en Clase1, y en Clase2, el problema como bien dice @David es la visibilidad, en tu clase 2 no existe ya que es private, tienes que ponerlo como protected para poderlo ver.

¿A que te refieres con "normal"? Tanto en PHP como en Javascript se puede hacer de la misma manera, son los mismos operadores, la única diferencia como bien dices es que con PHP debes de enviar al servidor para que sea procesado ahí el calculo y en Javascript se realiza en el cliente.

Saludos.
Vale ,lo voy a probar a ver.

Respecto a la calculadora digo que no puedes tener un teclado y ahi hacer 22+5-7+3/5 ¿no? , solo se me ocurre un formulario con dos campos y un operador a elegir de manera que solo haga 5+3 , 7*2 ,etc

El caso es que hice una en Javascript con teclado y ahi hacia las operaciones que queria,pero al intentar hacerlo en php no se me ocurre como pasarle las operaciones de esa manera...

Saludos y Gracias
  #13 (permalink)  
Antiguo 27/12/2012, 15:20
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
Respuesta: Duda agregacion,metodos magicos,etc

Pues si no sabes pasar los valores te recomiendo ver este link: http://www.php.net/variables.external

Saludos.
  #14 (permalink)  
Antiguo 27/12/2012, 16:04
 
Fecha de Ingreso: diciembre-2012
Mensajes: 26
Antigüedad: 11 años, 4 meses
Puntos: 0
Respuesta: Duda agregacion,metodos magicos,etc

Cita:
Iniciado por GatorV Ver Mensaje
Pues si no sabes pasar los valores te recomiendo ver este link: [url]http://www.php.net/variables.external[/url]

Saludos.
Si ,si se como pasar valores en formularios,pero el problema esque no puedo poner un teclado con numero e ir poniendo numeros y operaciones,sino que tengo que tener un determinado numero de campos de texto,por ejemplo 2, para despues cojer de ahi los valores ¿no?

No se si sabeis a lo que me refiero,yo digo que no se puede hacer una calculadora como la de windows por ejemplo,que vas poniendo numeros y operaciones y te las va haciendo,y eso lo hice en javascript,pero en php no se me ocurre ninguna manera ya que al ser un formulario le tengo que mandar todos los datos a la vez.

A ver si alguien me puede decir si se puede hacer y dar alguna pista sobre como hacerlo.

Saludos y Gracias
  #15 (permalink)  
Antiguo 28/12/2012, 10:54
Avatar de Genetix  
Fecha de Ingreso: febrero-2002
Ubicación: Lima - Perú
Mensajes: 1.600
Antigüedad: 22 años, 2 meses
Puntos: 45
Respuesta: Duda agregacion,metodos magicos,etc

Probaste con AJAX?
__________________
"El conocimiento nos hace responsables."
twitter: @benjamingb
blog personal: http://codigolinea.com
ZF Manual en español http://manual.zfdes.com
  #16 (permalink)  
Antiguo 29/12/2012, 05:49
 
Fecha de Ingreso: diciembre-2012
Mensajes: 26
Antigüedad: 11 años, 4 meses
Puntos: 0
Respuesta: Duda agregacion,metodos magicos,etc

Cita:
Iniciado por Genetix Ver Mensaje
Probaste con AJAX?
Es que con AJAX no lo puedo hacer ya que no lo hemos visto, ¿ademas no es javascript?.
Se supone que tengo que hacer una "calculadora en php orientado a objetos".

Entonces es eso , con php ,no se ocurre como , a ver si alguien me puede dar una pista.

Saludos.
  #17 (permalink)  
Antiguo 29/12/2012, 09:20
Avatar de carlos_belisario
Colaborador
 
Fecha de Ingreso: abril-2010
Ubicación: Venezuela Maracay Aragua
Mensajes: 3.156
Antigüedad: 14 años
Puntos: 461
Respuesta: Duda agregacion,metodos magicos,etc

si es orientado a objetos deberías de crear una clase calculadora que haga las funciones de la misma y luego ir llamando a sus métodos y atributos, ve pensando en que hace una calculadora, cuales son las acciones y cuales son los atributos y crea la clase, si quieres luego de tener algo hecho lo posteas para ver si se te pueden dar mas opiniones sobre lo que crees, sludos
__________________
aprende d tus errores e incrementa tu conocimientos
it's not a bug, it's an undocumented feature By @David
php the right way
  #18 (permalink)  
Antiguo 29/12/2012, 10:18
 
Fecha de Ingreso: diciembre-2012
Mensajes: 26
Antigüedad: 11 años, 4 meses
Puntos: 0
Respuesta: Duda agregacion,metodos magicos,etc

Lo que tengo hehcho ,muy basico,es esto, y aqui el problema de que tengo que tener un numero de campos de texto definidos para pasarlos como datos del formulario.


Código PHP:
Ver original
  1. <form action="<?php echo $_SERVER['PHP_SELF'] ?>" method="get">
  2. <input type="text" name="numero1">
  3.  
  4. <input type="radio" value="suma" name="operador">+
  5. <input type="radio" value="resta" name="operador">-
  6. <input type="radio" value="multiplicar" name="operador">*
  7. <input type="radio" value="dividir" name="operador">/
  8.  
  9. <input type="text" name="numero2">
  10. <input type="submit" name="aceptar" value="Ok">
  11. </form>
  12. <?php
  13. class calculadora{
  14.     private $numero1;
  15.     private $numero2;
  16.  
  17.     function __construct($num1,$num2){
  18.         $this->numero1=$num1;
  19.         $this->numero2=$num2;
  20.        
  21.     }
  22.     function suma(){
  23.     return $this->numero1+$this->numero2;  
  24.     }
  25.     function resta(){
  26.     return $this->numero1-$this->numero2;
  27.     }
  28.     function multiplicar(){
  29.     return $this->numero1*$this->numero2;
  30.     }
  31.     function dividir(){
  32.         return $this->numero1/$this->numero2;
  33.     }
  34.    
  35. }
  36.  
  37.  
  38.  
  39. if (isset($_GET['numero1']) && isset($_GET['numero2']))
  40. {
  41. $calculadora=new calculadora($_GET['numero1'],$_GET['numero2']);
  42. $operador=$_GET['operador'];
  43. echo $calculadora->$operador();
  44. }
  45.  
  46. ?>
  #19 (permalink)  
Antiguo 04/01/2013, 17:32
 
Fecha de Ingreso: diciembre-2012
Mensajes: 26
Antigüedad: 11 años, 4 meses
Puntos: 0
Respuesta: Duda agregacion,metodos magicos,etc

Bueno ,ya he solucionado los problemas que tenia,solo me falta aplicar a la calculadora polimorfismo, pero no se como implementar a una calculadora polimorfismo , y ademas en php...

La calculadora tiene tres modos ,basica,avanzada y cientifica

Aqui el ejemplo

Código PHP:
Ver original
  1. class calculadora{
  2.     private $numero1;
  3.     private $numero2;
  4.  
  5.     function __construct($num1,$num2){
  6.         $this->numero1=$num1;
  7.         $this->numero2=$num2;
  8.  
  9.     }
  10.     function suma(){
  11.         return $this->numero1+$this->numero2;
  12.     }
  13.     function resta(){
  14.         return $this->numero1-$this->numero2;
  15.     }
  16.     function multiplicar(){
  17.         return $this->numero1*$this->numero2;
  18.     }
  19.     function dividir(){
  20.         return $this->numero1/$this->numero2;
  21.     }
  22.  
  23. }
  24.  
  25. class calculadoraAvanzada extends calculadora{
  26.     private $numero1;
  27.     private $numero2;
  28.     function __construct($num1,$num2){
  29.         parent::__construct($num1, $num2);
  30.     }
  31.  
  32.     function raiz(){
  33.         return sqrt($this->numero1);
  34.     }
  35. }
  36. class calculadoraCientifica extends calculadoraAvanzada{
  37.     private $numero1;
  38.     private $numero2;
  39.     function __construct($num1,$num2){
  40.         parent::__construct($num1, $num2);
  41.  
  42.     }
  43.     function cos(){
  44.         return cos($this->numero1);
  45.     }
  46.  
  47.  
  48. $calculadora=new calculadora($_GET['numero1'],$_GET['numero2']);
  49. $operador=$_GET['operador'];
  50. echo $calculadora->$operador();

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




La zona horaria es GMT -6. Ahora son las 12:02.