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

Counstructor

Estas en el tema de Counstructor en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Como puedo sobrecargar un constructor en una clase php. Es decir declarar mas de un constructor....
  #1 (permalink)  
Antiguo 07/12/2008, 18:18
 
Fecha de Ingreso: enero-2006
Mensajes: 47
Antigüedad: 18 años, 3 meses
Puntos: 0
Counstructor

Como puedo sobrecargar un constructor en una clase php. Es decir declarar mas de un constructor.
  #2 (permalink)  
Antiguo 07/12/2008, 18:32
 
Fecha de Ingreso: septiembre-2008
Mensajes: 18
Antigüedad: 15 años, 7 meses
Puntos: 0
Respuesta: Counstructor

Respuesta rapida: No se puede
Respuesta lenta y complicada :

Debes de crearte un constructor vacio y luego controlar las variables que le pasas por medio de las funciones func_num_args() y func_get_args($id_argumento).
Yo lo que hago es esto :
Código PHP:
class comentario{
private 
$nombre;
private 
$puntuacion;
/**
*Constructor
*
*@param string nombre
*@param string nombre, int puntuacion
*@return comentario
*/
 
function comentario()
 {
        if(
func_num_args()>0)
       {
          
$this->nombre func_get_arg(0);
       }
        if(
func_num_args()>1)
       {
          
$this->puntuacion intval(func_get_arg(1));
       }
 }

Con eso consigues tener constructor vacio, constructor con 1 argumento y con 2 argumentos. Ahora bien, si quieres hacer constructores de un solo argumento con distintos tipos ya es ir haciendo comprovaciones de si el argumento pasado es en la posicion x es de tal tipo o tal otro.

Tambien he leido algo de un metodo llamado __call, pero en resumidas cuentas viene a ser lo mismo pero de otra forma.

Espero que te sirva.
  #3 (permalink)  
Antiguo 08/12/2008, 14:47
Avatar de ArrauKano  
Fecha de Ingreso: noviembre-2002
Ubicación: Santiago
Mensajes: 664
Antigüedad: 21 años, 5 meses
Puntos: 4
Respuesta: Counstructor

en php5, basta con redefinir el método __construct()
__________________
Blog | Tecnosquad
  #4 (permalink)  
Antiguo 08/12/2008, 16:43
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: Counstructor

Cita:
Iniciado por mmesa84 Ver Mensaje
Como puedo sobrecargar un constructor en una clase php. Es decir declarar mas de un constructor.
Si tú quieres hacer lo mismo que otros lenguajes como Java, no, no se puede de la misma manera (no tiene por defecto "sobrecarga de métodos"), pero hay formas un poco más extensas para hacerlo.

De todas maneras no es una práctica muy recomendada tener múltiples métodos que se llaman lo mismo para luego variar en solo la firma, puede ser práctico al principio a la hora de codificar pero llega un momento que dificulta la claridad del diseño.
__________________
Blog phpsenior.com Cursos a Distancia surforce.com
  #5 (permalink)  
Antiguo 08/12/2008, 16:54
 
Fecha de Ingreso: septiembre-2008
Mensajes: 18
Antigüedad: 15 años, 7 meses
Puntos: 0
Respuesta: Counstructor

ArrauKano, me da a mi que no se puede redefinir metodos, ni tan siquiera en php5, y si lo hay te agradeceria enormemente que digas como se hace.

enriqueplace tengo que discrepar contigo en lo que se refiere a tener un metodo con el mismo nombre. No digo en otros, pero en lo que a constructores se refiere, creo que no ensucia el codigo y hace que la programacion sea muchisimo mas sencilla. Imaginate tener un constructor para 1 parametro, otro para 2, ... Y no creo que sea recomendable tener solo un constructor vacio y luego ir rellenando los valores a mano, ya que si nos basamos en la idea del constructor se supone que es quien nos tiene que dar el objeto inicial.
  #6 (permalink)  
Antiguo 08/12/2008, 16:55
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: Counstructor

Puedes redefinir métodos usando el mismo nombre, siempre y cuando estos sean publicos o protegidos.

En el link que dejo enriqueplace explican como hacerlo: http://ar2.php.net/manual/es/languag...verloading.php y http://ar2.php.net/manual/es/languag...visibility.php

Saludos.
  #7 (permalink)  
Antiguo 08/12/2008, 17:01
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: Counstructor

Cita:
enriqueplace tengo que discrepar contigo en lo que se refiere a tener un metodo con el mismo nombre. No digo en otros, pero en lo que a constructores se refiere, creo que no ensucia el codigo y hace que la programacion sea muchisimo mas sencilla.
Estás diciendo lo que dije, facilita la codificación pero no el diseño, tener 10 métodos constructores no es para nada "limpio", si tenemos probablemente 10 constructores es muy posible que estemos haciendo más cosas de las que deben.

Cita:
Imaginate tener un constructor para 1 parametro, otro para 2, ... Y no creo que sea recomendable tener solo un constructor vacio y luego ir rellenando los valores a mano, ya que si nos basamos en la idea del constructor se supone que es quien nos tiene que dar el objeto inicial.
Por esa razón un solo constructor debe ser suficiente para cualquiera. Defines cuales son los datos que son "esenciales" y "fundamentales" para crear el objeto, posteriormente si necesitas más datos estos los procesarás con get / set o con métodos comunes.

No le veo la dificultad más que si tienes el vicio de hacer sobrecarga de métodos.

PD: el problema radica cuando algo que es simple lo queremos hacer complejo, como un constructor, un toString, etc.
__________________
Blog phpsenior.com Cursos a Distancia surforce.com
  #8 (permalink)  
Antiguo 08/12/2008, 17:02
 
Fecha de Ingreso: septiembre-2008
Mensajes: 18
Antigüedad: 15 años, 7 meses
Puntos: 0
Respuesta: Counstructor

sere muy burro, pero copiado y pegado de la pagina de anieto 2k, me dice que nanai. He provado a poner los metodos publicos y tampoco. Sino es mucho pedir podrias poner un ejemplo?

edit:
Tal vez sea eso, que yo vengo de programar con c# y estoy muy acostumbrado a usar la sobrecarga. Pero sigo pensando que el constructor no deberia ser lo minimo, sino el objeto original en cada proceso. Ahora , como ya he dicho yo vengo de c# y en php he aprendido un poco a tumbos y hay ciertos conceptos que no tengo muy claros.

Última edición por raurodse; 08/12/2008 a las 17:09
  #9 (permalink)  
Antiguo 08/12/2008, 17:04
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: Counstructor

Si, debes ser muy burro

Por favor, copia eso de "nanai" (me imagino que es un error en php) y vemos por qué falla.
__________________
Blog phpsenior.com Cursos a Distancia surforce.com
  #10 (permalink)  
Antiguo 08/12/2008, 17:16
 
Fecha de Ingreso: septiembre-2008
Mensajes: 18
Antigüedad: 15 años, 7 meses
Puntos: 0
Respuesta: Counstructor

Muchas gracias por la ayuda
Código HTML:
Fatal error: Cannot redeclare Pruebas::Pruebas() in /opt/lampp/htdocs/pruebaobjetos/object_data/prueba.php on line 25
el codigo que tengo es este

Código PHP:
<?php

class Pruebas {
  public function 
__call($method_name$arguments) {
    
$accepted_methods = array("hello");
    if(!
in_array($method_name$accepted_methods)) {
      
trigger_error("Method <strong>$method_name</strong> no existe"E_USER_ERROR);
    }

    if(
count($arguments) == 0) {
      
$this->Pruebas1();
    } elseif(
count($arguments) == 1) {
      
$this->Pruebas2($arguments[0]);
    } elseif(
count($arguments) == 2) {
      
$this->Pruebas3($arguments[0], $arguments[1]);
    } else {
      return 
false;
    }
  }

  public function 
Pruebas() {
    echo 
"Hola Pruebas";
  }

  public function 
Pruebas($name){
    echo 
"Hola $name";
  }

  public function 
Pruebas($first_name$last_name){
    echo 
"Hola $first_name, $last_name<br>";
  }
}

$ot = new Pruebas();
$ot->Pruebas();
$ot->Pruebas("John");
$ot->Pruebas("John""Smith");
?>
Es copiado y pegado del enlace de anieto 2k pero añadiendo lo que habian comentado de public.

edit: Aclara que la linea 25 es el segundo pruebas

Reedit: Puede ser que sea porque en la declaracion de los metodos los llama con el mismo nombre y que ahi se ha equivocado? que en realidad seria prueba1, y prueba2? y que el $accepted_methods = array("hello"); en lugar de ese deberia ser un $accepted_methods = array("Prueba");?

Última edición por raurodse; 08/12/2008 a las 17:22
  #11 (permalink)  
Antiguo 08/12/2008, 17:31
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: Counstructor

Creo ni si quiera haz leido lo que dicen, NO puedes sobrecargar constructores, intenta implementar el ejemplo que te dejo raurodse.

Saludos.
  #12 (permalink)  
Antiguo 08/12/2008, 17:46
 
Fecha de Ingreso: septiembre-2008
Mensajes: 18
Antigüedad: 15 años, 7 meses
Puntos: 0
Respuesta: Counstructor

Comprovado y solucionado. Era lo que decia en los edits, que el ejemplo estaba mal puesto.

Gracias de todos modos. Saludos
  #13 (permalink)  
Antiguo 09/12/2008, 11:22
Avatar de ArrauKano  
Fecha de Ingreso: noviembre-2002
Ubicación: Santiago
Mensajes: 664
Antigüedad: 21 años, 5 meses
Puntos: 4
Respuesta: Counstructor

Disculpen, me imagine que hablaba de varias clases, ...

Tienen razón, nativamente no se puede. Interesante el ejemplo.
__________________
Blog | Tecnosquad
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:30.