Autor Tema: Aprendiendo POO.  (Leído 1797 veces)

Desconectado Siquillote

  • PHPero Master
  • ******
  • Mensajes: 4.229
  • Karma: 179
  • Sexo: Masculino
    • Ver Perfil
Aprendiendo POO.
« en: 15 de Agosto de 2010, 17:06:57 pm »
Hola chicos, de nuevo. ¿Por que será que cuando uno está aburrido le entran ganas de aprender y cuando quieres aprender lo dejas? Pues eso me
acaba de ocurrir. Estaba aburrido y me puse a ver tutoriales de POO de los que hay en el foro y bueno, hice un par de scripts muy basicos pero
funcionan. A los mas avanzados os resultará una chorrada pero para los que quieran aprender como yo... pues aqui les dejo algo que he hecho.

pruebauno.php
Citar

<?php
class preguntar{
	
var 
$get;
	
	
public function 
Averiguar(){
	
	
	
$this->get htmlentities($_GET[&#39;num&#39;]);
	
	
	
$total $this->get;
	
	
	
if(
$total and is_numeric($total) and $total 5){
	
	
	
	
return 
true;
	
	
	
} else {
	
	
	
	
return 
false;
	
	
	
}
	
	
}
}

$llamo = new preguntar();
$todo $llamo->Averiguar();
if(
$todo == true){
	
echo &
#39;El numero escogido es &#39;.htmlentities($_GET[&#39;num&#39;]).&#39;&#39;;
} elseif($todo == false){
	
echo &
#39;Algo ha ido mal&#39;;
}
	

?>

pruebados.php
Citar

<?php
// Este codigo me he basado en la forma de Focux, me parecia muy interesante lo de printf() y %s estube investigando y bueno, lo he usado.
class dos{
	
var 
$recoger;
	

	
	
public function 
Nombres(){
	
	
	
$this->recoger htmlentities($_GET[&#39;o&#39;]);
	
	
	
define(_Minombre,"Siquillote");
	
	
	
define(_Otronombre,$this->recoger);
	
	
	
	
if(
_Minombre == _Otronombre){
	
	
	
	
	
printf("Hola %s",_Minombre);
	
	
	
	
} else {
	
	
	
	
	
printf("No eres %s",_Minombre);
	
	
	
	
}
	
	
}
}

$mostrar = new dos();
echo 
$mostrar->Nombres();
?>


¿Que os parece?. No me ha costado mucho hacerlo pero ahora veo la importancia que tiene POO en comparacion con PHP, muy util la verdad.
No es dificil, era yo el que lo hacer ver así ;).

#Fdo. Physlet

Comunidad PHPeros

Aprendiendo POO.
« en: 15 de Agosto de 2010, 17:06:57 pm »

Desconectado Physlet

  • PHPero Experto
  • *****
  • Mensajes: 822
  • Karma: 41
  • Sexo: Masculino
  • Todo es posible con esfuerzo, dedicación e interés
    • Ver Perfil
    • PanamaDev
Re:Aprendiendo POO.
« Respuesta #1 en: 15 de Agosto de 2010, 18:02:53 pm »
la importancia que tiene POO en comparacion con PHP
Error de conceptos, POO es una técnica para programar y PHP es un lenguaje de programación. La técnica que aplicabas antes en PHP se llama "programación estructurada".

Y pues, me alegra muchísimo tu actitud por aprender. Y no, no es una chorrada por ningún lado... Es como si te pareciera una chorrada ver a un bebé caminando, de alguna manera hay que empezar, siempre y cuando haya interés y dedicación lo comprenderás muy bien :P...

Ok mira, te daré unas recomendaciones:

- Yo tuve una charla con mi profesora de Java y me ha dicho que lo aceptable es siempre poner el modo de acceso a todos los atributos/métodos de la clase. Los modos de acceso son: public, private y protected. Si no se lo colocas, -en el caso de php- te lo reconoce como private, pero es correcto colocarlo siempre aunque sea private. Con eso me refiero al "var $get;", es mejor que pongas "private $get;".

- Por lo regular en POO, uno siempre tiende a asignar valores dentro de las clases, y para ello usamos o un método para asignar o un constructor. ¿Qué es el constructor? (lo podrás ver en otros temas, pero te lo resumo aquí), es un método especial que lleva la misma estructura que cualquier otro método, pero su nombre debe ser el mismo de la clase. Por ejemplo:


class Hola{
   private 
$v;

   private function 
Hola($valor_a_asignar){
        
$this->get $valor_a_asignar;
   }
}


Y entonces, a la hora de crear el objeto, le asignas los valores a asignar directamente en la instancia:

$objeto = new Hola("Aquí está $valor_a_asignar");

Hay otra forma de crear constructores, creo que se usa algo como __construct, la verdad no entiendo por qué lo usan si un constructor es un método con el mismo nombre de la clase xD, pero en PHP es válido igual, en otros no.

- El nombre de la clase, es recomendable que sea siempre en mayúscula, de hecho así dice la regla xDD...

Desconectado Marcus

  • PHPer@
  • **
  • Mensajes: 72
  • Karma: 1
  • Sexo: Masculino
  • Nuev@ PHPer@
    • Ver Perfil
Re:Aprendiendo POO.
« Respuesta #2 en: 15 de Agosto de 2010, 18:48:55 pm »
Me ha pasado igual que a tí.

Siempre me digo que quiero aprender y siempre arrugo, empiezo a leer sin ganas, pero cuanto estoy aburrido es totalmente diferente.

Desconectado Siquillote

  • PHPero Master
  • ******
  • Mensajes: 4.229
  • Karma: 179
  • Sexo: Masculino
    • Ver Perfil
Re:Aprendiendo POO.
« Respuesta #3 en: 15 de Agosto de 2010, 20:54:38 pm »
Gracias Physlet por el minitutorial pero hay algo que no he entendido. Dices que mediante una funciona que este dentro de la clase debería crear
ahí todos los valores. Vale y a la funcion la llamas Hola y a la la clase le has llamado Hola.

Entonces si la clase se llama hola y la funcion hola... ¿Estas no se confundiran en el metodo de llamada de la clase y de la función?. Es decir, por lo
que tengo yo entendido, para llamar a una clase haces esto y luego ya llamas a la funcion:


<?php
class Physlet{
      private 
$physlet// Le asigno el valor privado ya que seguiré lo que me has recomendado.

     
private function Hola($valor_a_asignar){
           
$this->focux $valor_a_asignar;
           echo 
$this->physlet;
     }

}

$objeto = new Hola("Valor de la variable a asignar"); // Segun tu dices sería esta linea pero aqui estas llamando a la clase no al objeto.
echo $objeto->Hola("Siquillote"); // Yo creo que esta linea sería lo necesario, pero vamos, siempre el experto sabra mas que el alumno.
?>


Espero tu aclaración porfavor.
« Última modificación: 16 de Agosto de 2010, 12:50:03 pm por Siquillote »

#Fdo. Physlet

Desconectado Physlet

  • PHPero Experto
  • *****
  • Mensajes: 822
  • Karma: 41
  • Sexo: Masculino
  • Todo es posible con esfuerzo, dedicación e interés
    • Ver Perfil
    • PanamaDev
Re:Aprendiendo POO.
« Respuesta #4 en: 15 de Agosto de 2010, 22:24:36 pm »
Ok, primero que nada, soy Physlet no Focux xDDD!!!

Segundo, esa es una función especial llamada "constructor", que te permite darle valores para inicializar la clase. Ese constructor lo que te permite es que a la hora de instanciar a la clase, puedas asignarle los valores sin tener que llamar a un método de asignar.

Lo que tú hiciste ahí fue directamente asignar e imprimir. Primero que nada, te recuerdo que en los métodos es recomendable retornar valores, no imprimirlos. Esta es una "regla" que se usa para que en POO se cumpla su característica "Reutilización de código", para que todas las "salidas" del programa se hagan siempre fuera de la clase (también llamado: cuerpo principal del programa).


<?php
class Hola{
      private 
$variable;

     private function 
Hola($valor_a_asignar){
           
$this->variable $valor_a_asignar;
     }

     private function 
imprimir(){
          return 
$this->variable;
     }
}
// Cuerpo principal del programa

$objeto = new Hola("Aquí el valor"); // Aquí creas un objeto que obtendrá todas las características de la clase Hola, y le asignas los
                                                        //valores iniciales (constructor).
echo $objeto->imprimir(); // Aquí llamas al método imprimir() de la clase Hola
?>


Espero hayas comprendido algo, soy un poco malo explicando igual xD

Desconectado CarlosRdrz

  • Moderador Global
  • PHPero Master
  • *****
  • Mensajes: 2.505
  • Karma: 131
  • Sexo: Masculino
  • A.k.a. TLX
    • Ver Perfil
Re:Aprendiendo POO.
« Respuesta #5 en: 16 de Agosto de 2010, 02:44:08 am »
Physlet, el problema es que en PHP la función constructor no tiene el mismo nombre que la clase como pasa en C++ o Java.
En PHP la función constructor se llama __construct, así que tu código anterior sería así:

<?php
class Hola{
     private 
$variable;

     public function 
__construct($valor_a_asignar){
           
$this->variable $valor_a_asignar;
     }

     public function 
imprimir(){
          return 
$this->variable;
     }
}
// Cuerpo principal del programa

$objeto = new Hola("Aquí el valor"); // Aquí creas un objeto que obtendrá todas las características de la clase Hola, y le asignas los
                                                        //valores iniciales (constructor).
echo $objeto->imprimir(); // Aquí llamas al método imprimir() de la clase Hola
?>


Por cierto, otro apunte más.
En PHP, si no declaras la propiedad del método o variable (public, private o protected) se tratará como public, y no como private.

Saludos!
« Última modificación: 16 de Agosto de 2010, 14:35:33 pm por TLX »
La dedicación de mi respuesta sera directamente proporcional a la dedicación de tu pregunta.
Hacer códigos que entiendan las máquinas es fácil, lo difícil y realmente útil es hacer códigos que entiendan las personas.
http://twitter.com/CarlosRdrz
http://www.carlosrdrz.es

Desconectado Physlet

  • PHPero Experto
  • *****
  • Mensajes: 822
  • Karma: 41
  • Sexo: Masculino
  • Todo es posible con esfuerzo, dedicación e interés
    • Ver Perfil
    • PanamaDev
Re:Aprendiendo POO.
« Respuesta #6 en: 16 de Agosto de 2010, 05:48:25 am »
Physlet, el problema es que en PHP la función constructor no tiene el mismo nombre que la clase como pasa en C++ o Java.
En PHP la función constructor se llama __construct, así que tu código anterior sería así:
Es que no estamos hablando de un lenguaje en sí. En PHP se hace igual de esa manera, lo he comprobado también. Otra cosa es que hayan querido meter eso del __construct para no confundir a otros... Pero yo por mi parte, me baso en la definición de un constructor en POO (sin orientarse a ningún lenguaje).

Citar
A function becomes a constructor, when it has the same name as the class.
http://php.net/manual/en/oop4.constructor.php

Bueno, al menos ahí tengo una referencia de que mantienen el estandar, solo que quizás sea más cómodo de la otra forma.

Por cierto, otro apunte más.
En PHP, si no declaras la propiedad del método o variable (public, private o protected) se tratará como public, y no como private.
Saludos!
Alguien me dijo que era privado, cometí el error al no experimentarlo. ¿O era en C++?, no recuerdo bien...
Independientemente de ello, es recomendable siempre ponerlo.

PD: Cabe destacar que cuando estudié POO no iba orientado a ningún lenguaje en particular, así que si estoy algo desactualizado, disculpen.
« Última modificación: 16 de Agosto de 2010, 05:55:18 am por Physlet »

Desconectado CarlosRdrz

  • Moderador Global
  • PHPero Master
  • *****
  • Mensajes: 2.505
  • Karma: 131
  • Sexo: Masculino
  • A.k.a. TLX
    • Ver Perfil
Re:Aprendiendo POO.
« Respuesta #7 en: 16 de Agosto de 2010, 12:13:27 pm »
Es que no estamos hablando de un lenguaje en sí. En PHP se hace igual de esa manera, lo he comprobado también. Otra cosa es que hayan querido meter eso del __construct para no confundir a otros... Pero yo por mi parte, me baso en la definición de un constructor en POO (sin orientarse a ningún lenguaje).
http://php.net/manual/en/oop4.constructor.php

El problema es que estas mirando un manual de PHP antiguo, en concreto de la versión 4, y estamos en la versión 5.3
De todas formas, en PHP lo habitual es usar __construct. Todo tiene un por qué, y esto también. Viene explicado aquí:
http://www.php.net/manual/en/language.oop5.decon.php

De hecho, por razones de compatibilidad, si en un script PHP no existe __construct entonces busca por un método con el nombre igual que la clase para tratarlo como costructor (excepto en algunos casos, ver la web de arriba) pero sin embargo para los destructores no pasa lo mismo. El destructor en PHP se llama __destruct, y ~Clase no va a funcionar.

Bueno, al menos ahí tengo una referencia de que mantienen el estandar, solo que quizás sea más cómodo de la otra forma.
Alguien me dijo que era privado, cometí el error al no experimentarlo. ¿O era en C++?, no recuerdo bien...
Independientemente de ello, es recomendable siempre ponerlo.

PD: Cabe destacar que cuando estudié POO no iba orientado a ningún lenguaje en particular, así que si estoy algo desactualizado, disculpen.
No, no, lo cierto es que se trata de public.
http://www.php.net/manual/en/language.oop5.properties.php
Pero si, estoy de acuerdo contigo, es recomendable ponerlo siempre.

Estoy de acuerdo contigo, hay cosas de POO que es mejor explicarlo en general con sus conceptos para todo los lenguajes, pero también es necesario explicar como se aplica a PHP (ya que de hecho estamos en el foro de PHP POO) y es mejor explicar desde un principio cuales son las diferencias con otros lenguajes para no liar mucho a la gente, por que sino al final se acaba intentando usar ~Clase() en PHP y __construct() en Java jaja

Simplemente cada lenguaje tiene una sintaxis propia de él, pero los conceptos de POO se aplican a todos los lenguajes.
Aunque en PHP se llame Pepe y en C++ o Java José, en esencia es lo mismo.

Saludos!
La dedicación de mi respuesta sera directamente proporcional a la dedicación de tu pregunta.
Hacer códigos que entiendan las máquinas es fácil, lo difícil y realmente útil es hacer códigos que entiendan las personas.
http://twitter.com/CarlosRdrz
http://www.carlosrdrz.es

Desconectado Siquillote

  • PHPero Master
  • ******
  • Mensajes: 4.229
  • Karma: 179
  • Sexo: Masculino
    • Ver Perfil
Re:Aprendiendo POO.
« Respuesta #8 en: 16 de Agosto de 2010, 12:48:42 pm »

Ups! Perdon Physlet, s que antes de responderte, me habia leido otra vez mi duda y claro, el ejemplo lo habia sacado de Focux y por incosciencia
creia que eras Focux, disculpame.

!Y muhas gracias a ti y a TLX, ya me he enterado! K+ a los 2 ;).

#Fdo. Physlet

Desconectado Siquillote

  • PHPero Master
  • ******
  • Mensajes: 4.229
  • Karma: 179
  • Sexo: Masculino
    • Ver Perfil
Re:Aprendiendo POO.
« Respuesta #9 en: 16 de Agosto de 2010, 13:31:02 pm »
Perdón por el doble post, pero justo cuando he entendido el metodo de como funciona, he intentado poner en practica un ejemplo mio y me ha
salido un error a llamar __construct(), pensaba que error mio pero es que en vuestros ejemplos tambien ocurre, me sale este error:

"Fatal error: Call to private Construir::__construct() from invalid context in C:\AppServ\www\construir.php on line 15"

construir.php
Citar

<?php
class Construir{
	
private 
$nombre;
	
private 
$apellidos;
	
	
public function 
__construct($uno,$dos){
	
	
	
$this->nombre $uno;
	
	
	
$this->apellidos $dos;
	
	
}
	
	

	
	
public function 
Mostrar(){
	
	
	
return 
$this->nombre.&#39;<br>&#39;.$this->apellidos;
	
	
}
}
$objeto = new Construir("Angel Samuel","PHPeros");
echo 
$objeto->Mostrar();
?>

¡Solucionado! No me acordaba que si una funcion era privada no podría usarse fuera de la clase ¡Gracias!
« Última modificación: 16 de Agosto de 2010, 14:10:58 pm por Siquillote »

#Fdo. Physlet

Desconectado westwest

  • PHPero Master
  • ******
  • Mensajes: 2.837
  • Karma: 104
  • Sexo: Masculino
    • Ver Perfil
Re:Aprendiendo POO.
« Respuesta #10 en: 16 de Agosto de 2010, 14:01:21 pm »
¿Sabes que es private y public?
Si auna función le asignas private solo podrá ser llamada desde la clase, por lo tanto no puedes llamarla desde fuera de esta, cambia a public las dos funciones y debería solucionarse

Desconectado CarlosRdrz

  • Moderador Global
  • PHPero Master
  • *****
  • Mensajes: 2.505
  • Karma: 131
  • Sexo: Masculino
  • A.k.a. TLX
    • Ver Perfil
Re:Aprendiendo POO.
« Respuesta #11 en: 16 de Agosto de 2010, 14:36:00 pm »
Si, perdona, se me olvidó cambiarlo al copiar el ejemplo de Physlet.
Me alegro de que ya te funcione.

Saludos! :)
La dedicación de mi respuesta sera directamente proporcional a la dedicación de tu pregunta.
Hacer códigos que entiendan las máquinas es fácil, lo difícil y realmente útil es hacer códigos que entiendan las personas.
http://twitter.com/CarlosRdrz
http://www.carlosrdrz.es

Desconectado Siquillote

  • PHPero Master
  • ******
  • Mensajes: 4.229
  • Karma: 179
  • Sexo: Masculino
    • Ver Perfil
Re:Aprendiendo POO.
« Respuesta #12 en: 16 de Agosto de 2010, 15:39:43 pm »
¿Sabes que es private y public?
Si auna función le asignas private solo podrá ser llamada desde la clase, por lo tanto no puedes llamarla desde fuera de esta, cambia a public las dos funciones y debería solucionarse

Si, si que lo sé, por algo te lo he dicho en el msn jaja!.
Si, perdona, se me olvidó cambiarlo al copiar el ejemplo de Physlet.
Me alegro de que ya te funcione.

Saludos! :)

Gracias, ya me he animado a mostrar datos de una tabla de la base de datos con POO y la verdad es que esta genial ;).

#Fdo. Physlet