Autor Tema: Reto #4 - Practicando con clases en PHP  (Leído 5041 veces)

Desconectado westwest

  • PHPero Master
  • ******
  • Mensajes: 2.837
  • Karma: 104
  • Sexo: Masculino
    • Ver Perfil
Re:Reto #4 - Practicando con clases en PHP
« Respuesta #15 en: 19 de Febrero de 2010, 22:44:23 pm »
Re*****, porque es una función, ahora mismo te subo un archivo y te lo pruebo.
$consultas->send();
Eso no es una función?

Comunidad PHPeros

Re:Reto #4 - Practicando con clases en PHP
« Respuesta #15 en: 19 de Febrero de 2010, 22:44:23 pm »

Desconectado Focux

  • PHPero Master
  • ******
  • Mensajes: 1.010
  • Karma: 22
    • Ver Perfil
Re:Reto #4 - Practicando con clases en PHP
« Respuesta #16 en: 19 de Febrero de 2010, 23:11:00 pm »
$consultas->send();
Eso no es una función?
Si, una funcion de la classe. Y ya vi que es verdad lo que decias..
Mixtiqueros.net

<?PHP
define
(_miNombre, &#39;Focux&#39;);
if(_miNombre == &#39;Focux&#39;): printf(&#39;%s es un programador avanzado&#39;, _miNombre); else: printf(&#39;Tu no eres %s&#39;, _miNombre); endif;
?>

Desconectado WarezD@rK

  • PHPer@ Fijo
  • ***
  • Mensajes: 162
  • Karma: 8
  • Sexo: Masculino
  • Pasaba por aquí...
    • Ver Perfil
    • Ninguno
Re:Reto #4 - Practicando con clases en PHP
« Respuesta #17 en: 20 de Febrero de 2010, 04:35:25 am »
Bueno, como prometí, ya he llegado a casa y voy a repasar los códigos de mara y west.
Veo que no hay muchos comentarios en el código. La verdad es que esta parte es muy importante porque ayuda a terceras personas a entender el algoritmo y en casos donde la clase es muy extensa, se vuelve algo indispensable, sobretodo en proyectos donde participan varias personas.

Me centraré exclusivamente en las clases que es de lo que trata el reto, los formularios es algo que tenemos más que aprendido y que domináis a la perfección.

Empezamos con la clase de mara:

He visto que has publicado el código y he podido probar tu clase. Como dije, era muy importante el control de errores y en este caso he encontrado un pequeño fallo con el tema de la división por 0. Es algo en lo que solemos fallar y no basta con comprobar si el código es numérico. Dividiendo 0 / 0 obtenemos este resultado:

Warning: Division by zero in /home/a7465051/public_html/calculadoraClass.php  on line 20

Veo que no has declarado las variables como privadas. Aunque no es ningún error te recomendaria por seguridad declararlas como privadas, ya que no va a ser necesario modificarlas desde fuera de la clase. También sobra la variable "$operacion", no es necesaria dentro de la clase. La variable que declares para utilizarla en la ejecución, no es necesaria declararla dentro:

Código: [Seleccionar]
<?php
private $numero1;
private 
$numero2;
private 
$resultado;
?>

Has entendido muy bien cómo funcionan las funciones dentro de una clase y los métodos para realizar las operaciones están muy bien:

Código: [Seleccionar]
<?php
public function sumar($xxnumero1$xxnumero2)
{
    
$this->resultado $xxnumero1 $xxnumero2;
    return 
$this->resultado;
}
?>

Por otro lado, no has creado un constructor y aunque no era estrictamente necesario, lo pedía para que viérais cómo funciona. En este caso sería:

Código: [Seleccionar]
<?php
function __construct()
{
    
$this->numero1 0;
    
$this->numero2 0;
    
$this->resultado 0;
}
?>

Te ha faltado una función que pedía para mostrar el resultado, que en este caso sería:

Código: [Seleccionar]
<?php
public function resultado()
{
    echo 
$this->resultado;
}
?>

En general, creo que has entendido bastante bien cómo funcionan las clases, aunque hubiese preferido que el control de errores fuese parte de la clase y no algo ajeno a ella, ya que el fin de las clases es reducir el código a la hora de trabajar con ellas. Me gustaría hacer otro reto un poco más difícil y ver cómo te desenvuelves con la programación orientada a objetos, seguro que lo harías bien.

Sigamos con la clase de west:

Veo que tú sí has pensado en la división entre 0. Es un detalle importante y un error bastante común. En ese aspecto todo bien.

Lo que no has entendido muy bien es para qué sirve el constructor y cómo se utiliza. El constructor sirve para establecer unos valores por defecto o ejecutar cierto algoritmo al crear el objeto que hace referencia a la clase. En este caso no debías pasarle ninguna variable a la función y sobra el ($numero1 = 0, $numero2 = 0) y tampoco era necesario comprobarlas. Simplemente había que inicializar las variables:

Código: [Seleccionar]
<?php
function __construct()
{
    
$this->numero1 0;
    
$this->numero2 0;
    
$this->resultado 0;
}
?>

Debido al diseño de tu constructor, su función "choca" con la función numeros(), ya que hacen algo parecido y es un poco paradójico. Hay dos opciones, establecer los valores al crear el objeto (new Calculadora(5, 3)) o establecerlos utilizando un método (numeros(5, 3)). En este caso pedía hacerlo con un método y tú lo has hecho de las dos formas.

He visto que las operaciones las realiza en un mismo método y mi intención era que fuese un método por cada operación, de esta manera sería más fácil ver el funcionamiento de la clase.

El método para mostrar el resultado perfecto.

En general creo que está bastante bien teniendo en cuenta que no te hacía mucha gracia la programación orientada a objetos y sería interesante verte programar alguna clase más.



A continuación os haré un boceto de cómo tenía pensado yo este reto. No es que sea lo correcto, porque hay muchas formas de programar, pero es lo que tenía en mente y en vez de hacerlo con dos operantes, lo haré compatible con más de dos, ya que sería un poco repetitivo y así variamos un poco. Veamos qué lío me sale:

Código: [Seleccionar]
<?php
/*
Clase Calcular para PHPeros.net
Reto #4: Practicando con clases en PHP
*/

class Calcular
{
# Declaramos 3 variables
# privadas para nuestra clase.
private $operantes;
private $resultado;
private $error;

# Creamos un constructor
# que las inicialice.
function __construct()
{
$this->operantes = array(105);
$this->resultado 0;
$this->error false;
}

# Diseñamos un método PRIVADO
# para mostrar el error que solo
# podrá ser utilizado dentro de nuestra clase.
private function verError()
{
return "Error: ".$this->error;
}

# Diseñamos un método para establecer
# los operantes y comprobar su tipo.
public function operantes($xOperantes)
{
# Creamos una variable boleana
# de control que devolverá TRUE
# en caso de que algún valor no
# sea numérico.
$xHayError false;

# Comprobamos si los valores
# se encuentran dentro de una array.
if(is_array($xOperantes))
{
# Comprobamos si hay más de 1
# operante, lógicamente.
if(count($xOperantes) >= 2)
{
# Recorremos los valores uno a uno
foreach($xOperantes as $xNumero)
{
# Comprobamos si son del tipo numérico.
if(!is_numeric($xNumero))
{
$xHayError true;
break;
}
}

# Comprobamos si ha habido algún error
# al recorrer el array.
if($xHayError)
{
$this->error "Debes introducir exclusivamente valores numéricos.";
echo $this->verError();
}
else
{
$this->operantes $xOperantes;
}
}
else
{
$this->error "Debe haber como mínimo 2 operantes.";
echo $this->verError();
}
}
else
{
$this->error "Para hacerlo más divertido, los operantes deben estar dentro de un array.";
echo $this->verError();
}
}

# Diseñamos un método que recorra
# el array y sume sus valores.
public function sumar()
{
# Si no ha ocurrido ningún error
# al establecer los operantes.
if(!$this->error)
{
# Inicializamos el resultado a 0.
$xResultado 0;

# Recorremos el array y realizamos
# la operación correspondiente al método.
foreach($this->operantes as $xNumero)
{
$xResultado $xResultado $xNumero;
}

# Almacenamos el resultado en
# la variable global.
$this->resultado $xResultado;
}
}

# Diseñamos un método que recorra
# el array y reste sus valores.
public function restar()
{
# Si no ha ocurrido ningún error
# al establecer los operantes.
if(!$this->error)
{
# Inicializamos el resultado con
# el doble del primer valor, de manera
# que al restar la primera vez, obtengamos
# el primer valor íntegro.
$xResultado $this->operantes[0] * 2;

# Recorremos el array y realizamos
# la operación correspondiente al método.
foreach($this->operantes as $xNumero)
{
$xResultado $xResultado $xNumero;
}

# Almacenamos el resultado en
# la variable global.
$this->resultado $xResultado;
}
}

# Diseñamos un método que recorra
# el array y multiplique sus valores.
public function multiplicar()
{
# Si no ha ocurrido ningún error
# al establecer los operantes.
if(!$this->error)
{
# Inicializamos el resultado a 1
# para que al multiplicar el primer
# operante, devuelva su valor íntegro.
$xResultado 1;

# Recorremos el array y realizamos
# la operación correspondiente al método.
foreach($this->operantes as $xNumero)
{
$xResultado $xResultado $xNumero;
}

# Almacenamos el resultado en
# la variable global.
$this->resultado $xResultado;
}
}

# Diseñamos un método que recorra
# el array y divida sus valores.
public function dividir()
{
# Creamos una variable de control
# que devolverá TRUE en case de que
# algún operante sea 0.
$xHayError false;

# Si no ha ocurrido ningún error
# al establecer los operantes.
if(!$this->error)
{
# Inicializamos el resultado
# con el primer operante elevado
# al cuadrado, para que devuelva
# su valor íntegro.
$xResultado $this->operantes[0] * $this->operantes[0];

# Recorremos el array y realizamos
# la operación correspondiente al método.
foreach($this->operantes as $xNumero)
{
# Comprobamos si algún
# operante es igual a 0.
if($xNumero != 0)
{
$xResultado $xResultado $xNumero;
}
else
{
$xHayError true;
break;
}
}

if($xHayError)
{
$this->error "No puedes dividir valores entre 0.";
echo $this->verError();
}
else
{
# Almacenamos el resultado en
# la variable global.
$this->resultado $xResultado;
}
}
}

# Diseñamos un método para
# devolver el resultado.
public function verResultado()
{
# Si no ha ocurrido ningún error
# al establecer los operantes.
if(!$this->error)
{
return "El resultado es: ".$this->resultado;
}
}
}
?>

De esta forma, si lo que queremos es, por ejemplo, dividir múltiples valores, su ejecución sería tan sencilla como:

Código: [Seleccionar]
<?php
$operacion 
= new Calcular();
$operacion->operantes(array(10025));
$operacion->dividir();
echo 
$operacion->verResultado();
?>

Incluye el control de errores, por lo que no es necesario comprobar nada al utilizar la clase, todo se genera desde dentro.

Os adjunto mi clase.



Gracias por vuestro interés en mi reto y espero que haya sido instructivo.
Un saludo :)
Trabajando en mi actual proyecto.

Desconectado westwest

  • PHPero Master
  • ******
  • Mensajes: 2.837
  • Karma: 104
  • Sexo: Masculino
    • Ver Perfil
Re:Reto #4 - Practicando con clases en PHP
« Respuesta #18 en: 20 de Febrero de 2010, 12:07:28 pm »
creo que ya entendí mejor lo del constructor ^^

Desconectado Focux

  • PHPero Master
  • ******
  • Mensajes: 1.010
  • Karma: 22
    • Ver Perfil
Re:Reto #4 - Practicando con clases en PHP
« Respuesta #19 en: 20 de Febrero de 2010, 14:51:57 pm »
Buen aporte, deberías poner más retos de este tipo para poder aprender más.
Mixtiqueros.net

<?PHP
define
(_miNombre, &#39;Focux&#39;);
if(_miNombre == &#39;Focux&#39;): printf(&#39;%s es un programador avanzado&#39;, _miNombre); else: printf(&#39;Tu no eres %s&#39;, _miNombre); endif;
?>

Desconectado Farresito

  • PHPero Avanzado
  • ****
  • Mensajes: 385
  • Karma: 5
  • Sexo: Masculino
  • PimPamTomaC++
    • Ver Perfil
    • Farresito
Re:Reto #4 - Practicando con clases en PHP
« Respuesta #20 en: 07 de Noviembre de 2010, 16:01:09 pm »
Te dejo un Karma+ porque, a pesar de no haber participado, has hecho un esfuerzo en corregir los errores ;)
“Lo mejor de los booleanos es que si te equivocas estás a un sólo bit de la solución correcta.”

-- Anónimo

"No temo a los ordenadores; lo que temo es quedarme sin ellos"

-- Isaac Asimov

Desconectado Physlet

  • PHPero Experto
  • *****
  • Mensajes: 822
  • Karma: 41
  • Sexo: Masculino
  • Todo es posible con esfuerzo, dedicación e interés
    • Ver Perfil
    • PanamaDev
Re:Reto #4 - Practicando con clases en PHP
« Respuesta #21 en: 14 de Noviembre de 2010, 19:33:30 pm »
Coloca otro reto de programación orientada a objetos, me gustaría participar.

Por cierto, no era necesario inicializar en 0 con el constructor, ya hasta donde yo recuerdo al llamar al constructor $obj = new Calcular(); todos los atributos son inicializados.
« Última modificación: 14 de Noviembre de 2010, 19:38:00 pm por Physlet »