Diferencia entre revisiones de «ManuelRomero/DAW/distancia/tutorias/Tutoria2»

De WikiEducator
Saltar a: navegación, buscar
Línea 4: Línea 4:
 
<br/>
 
<br/>
 
{{Objetivos|
 
{{Objetivos|
;Se han tratado los siguientes temas
+
;Se han tratado el tema de programación orientado a objetos
#Agenda
+
#Concepto básicos
#Ejercicios básicos de php
+
#Características de la programación orientada a objetos
#Presentación del tema de bases de datos
+
 
}}
 
}}
  
==Agenda==
+
==Programación Orientada a objetos==
*Sobre la agenda hemos comentado tres conceptos
+
*Ver la programación orientada a objetos como una manera más cómoda de programar
#Cómo ejecutar  código php en un solo  fichero
+
*Creamos componentes software, luego los usamos
#Cómo pasar información en input de tipo hidden
+
*Usamos la abstracción es sus dos visiones:
#Cómo pasar varios datos de información usando una sola variable que sería un array
+
#Al crear los componentes software me abstraigo de lo general (de su uso), y me centro en el detalle (en su funcionamiento).
===Ejecutar php en un solo fichero===
+
#Al usarlo en el programa principal me abstraigo del detalle y me centro en su uso
 
+
===Consejos===
*Muchas ocasiones queremos que el código php se ejecute en la misma página php.  
+
*Los nombres de las clases la primera letra en mayúscula
*Esto implica que de alguna manera el servidor tiene que saber si esta página es la primera vez o sea que se pide por que un usuario ha tecleado el url de la página en el navegador
+
*O bien se solicita la página por que se ha invocado la ejecución del fichero como resultado de hacer un submit en un forfmulario.
+
*En la página index.php tendrá que haber un formulario p.e.
+
<source lang=html4strict>
+
<form action=”index.php” method=”POST”>
+
  …..
+
  <intput type=submit value=”enviar datos” name=”enviar”
+
 
+
</form>
+
</source>
+
 
+
El código necesario dentro de la página sería
+
 
<source lang=php>
 
<source lang=php>
<?php
+
class Fecha{
  if ($_POST['enviar']){
+
....
      …...
+
 
}
 
}
?>
 
 
</source>
 
</source>
 
+
*Guardar cada clase en un fichero con su propio nombre
*De esta forma vemos si se ha enviado el formulario.
+
<source lang=php>
*Por su puesto hay varias maneras pero esta es una de ellas
+
Fecha.cpp
*Cuando se quiere invocar al mismo fichero se puede ver en el elemento  '''''form''''' lo siguiente
+
*O bien escribier el nombre del fichero
+
<source lang=html4strict>
+
<form action=”index.php” method=”POST”>
+
 
</source>
 
</source>
*También odemos  escribir un punto
+
===PHP como lenguaje orientado a objetos===
<source lang=html4strict>
+
*PHP es un lenguaje un poco peculiar como lenguaje orientado a objetos
<form action=”." method=”POST”>
+
*Bajo mi punto de vista hay dos temas importantes
 +
#No tiene sobrecarga tal cual la conocemos
 +
#Tiene métodos mágicos que dan versatilidad aunque al principio despistan
 +
*Atributos y métodos por  defecto publicos
 +
<source lang=php>
 +
class Fecha{
 +
  private $dia;
 +
  private $mes;
 +
  private $year;
 +
}
 
</source>
 
</source>
*Podemos tomar el valor de la variable superglobal $_SERVER, escribiendo un código php
+
;Constructor
<source lang=html4strict>
+
*Podemos poner un método con el nombre de la clase y ese se ejecutaría al instanciar el objeto
<form action=<?php echo $_SERVER['PHP_SELF']; ?> method=”POST”>  
+
*Tenemos un método mágico
 +
{{Definicion|'''''métodos mágicio'''  son métodos que se ejecutan sin que los invoquemos cuando ocurre determinadas cicunstancias}}
 +
<source lang=php>
 +
__construct(){
 +
}
 
</source>
 
</source>
 +
*Si tenemos un método con el nombre de la clase y el método '''''__construct''''' implementado, solo se ejecutará el método '''''__construct'''''
  
*Aquí ponemos un ejemplo que es uno de los que vimos en la tutoría
+
;Sobrecarga
{{Actividad|
+
*La podemos simular de dos maneras
*Escribir un programa en php que en un solo fichero se nos solicite nombre de usuario y password
+
#Pasando varios atributos con valores por defecto
*Al ejecutar la parte de php se verificarán las siguietes condiciones
+
#usanto el método mágico __call($nameFuncion, $atributos)
#Que el usuario y password no estén vacíos
+
;Ver el wiki donde está explicada esta parte
#Que el usuario tenga más de 7 caracteres
+
;Otros aspectos en los que se han incidido
#que la password tenga al menos un dígito
+
*Recordad que para acceder a un atributo hay que usar obligatoriamente la seudovariable $this, en este caso el atributo no tiene que llevar $
*En caso de que todo esté ok, simplemente se dejará el nombre de usuario y password en las casillas de texto
+
*En caso de que haya algún error, se informará del error que haya (solo del primero que se encuentre), y se mostrará las cajas de texto vacías
+
 
+
 
<source lang=php>
 
<source lang=php>
<!DOCTYPE html>
+
class Fecha{
<html>
+
  private $dia;
    <head>
+
  private $mes;
        <title>Formulario de datos  </title>
+
  private $year;
        <meta charset="UTF-8">
+
  public function __construct( $d, $m, $y){
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
+
    $this->dia = $d; //mirar bien que dia no lleva $
    </head>
+
    $mes = $m; //En este caso $mes es una variable local al método no tiene nada que ver con el atributo $mes de la clase
    <body>
+
.....
        <!-- Aqui empieza el código php -->
+
        <?php
+
        //Si es la primera vez que se ejecuta el formulario
+
        if (!(isset($_POST['enviar']))){
+
            //Primera vez
+
            $usuario="";
+
            $pass="";
+
        }
+
        else{
+
            if (errores()){
+
                //Segunda o siguientes veces con error
+
            $usuario="";
+
            $pass="";
+
               
+
            }else{
+
               
+
                //Todo ok y no es la primera vez que se carga la página
+
                $usuario=$_POST['usuario'];
+
                $pass=$_POST['pass'];
+
  
            }
+
  }
        }
+
  
        /*Esta función analiza los datos de usuario y passoword para ver si hay algún error
 
          En caso de error muestra un mensaje y retorna un booleano con valor true
 
          En caso de que no haya error retorna el booleano false
 
        */
 
        function errores(){
 
            $usuario = $_POST['usuario'];
 
            $pass = $_POST['pass'];
 
            if ((empty($usuario))||(empty($pass))){
 
                echo "Los campos de usuariio y pass no pueden estar vacíos";
 
                return true;
 
            }
 
            if (strlen($usuario)<=7){
 
                echo "La cadena de usuario debe tener más de 7 caracteres y no ".strlen($usuario);
 
                return true;
 
            }
 
            //Establemcesmos la expresión regular de números
 
            $expresion='/[0-9]/';
 
            //Con esta función analizamos a ver si el texto $pass tiene la expresión regular $expreson
 
            if (preg_match($expresion,$pass)!=true){
 
                echo "La pass debe tener al menos un dígito y no lo tienen ".($pass);
 
                return true;
 
               
 
            }
 
            return false;
 
        }
 
        ?>
 
       
 
        <form action=<?php echo $_SERVER['PHP_SELF'] ?> method="POST">
 
            Inserta un numero <br>
 
          <!--Observar que el valor de las cajas de texto la obtengo ejecutando php -->
 
            usuario : <input type="text" name="usuario" value="<?php echo "$usuario"; ?>"/>
 
            Pass:    <input type="text" name="pass" value="<?php echo "$pass" ;?>"/>
 
            <br>
 
            <input type="submit" value="Enviar" name="enviar"/>
 
        </form>
 
       
 
    </body>
 
</html>
 
</source>
 
  
  
}}
+
</source>
 
+
====Cómo pasar información en input de tipo hidden====
+
*Para pasar información entre el cliente y el servidor  puedo usar un input de tipo hidden.
+
*Esto puede ser muy interesante en muchas ocasiones.
+
*Es muy importante recordar que http es un protocolo sin estado
+
{{Puntos clave|
+
http es un protocolo sin estado}}
+
*Por eso en determinadas ocasiones para recordar cosas del úlimo envío puedo usar esta sencilla estrategia
+
*Lógicamente hay muchas más y mas sofisticadas que iremos  viendo como Bases de datos, ficheros cookies, sesiones o usar Ajax para recargar solo parte de la página manteniendo intacta el resto de información.
+
*Cada vez que hago una solicitud a un servidor , este me atiende como si fuera la primera vez, aunque sea la solicitud 300  y todas seguidas.
+
*Si por ejemplo me he validado y  quiero pasar al servidor mi nombre de  usuario y no volverlo a escribir se lo  puedo pasar en un input de tipo hidden.
+
*El hecho de enviarlo en un hidden es por que sólo dentro de los formularios podemos enviar información al servidor
+
*Sobre este tema no pongo ejemplo, ya que lo hago  en el siguiente sobre la agenda.
+
 
+
  
====Cómo pasar varios valores en una sola variable====
+
*Concepto de variables/métodos estáticos y constantes
*Esto se consigue poniendo a los diferentes input el mismo nombre con corchetes.
+
*Usar self::... Para acceder a él
*Cuando el servidor lea esa variable de $_POST leeré todo en un array
+
{{Actividad|
+
Hacer un programa que lea 10 enteros de 10 cajas de texto y me visualice la media
+
 
<source lang=php>
 
<source lang=php>
<!DOCTYPE html>
+
class miClase{
<html>
+
  const IVA; //Constante iva, así se declaran las constantes el oop de php
    <head>
+
  public static $cuentaObjetos; // es un atributo estático
        <title>Medias de notas</title>
+
  ....
        <meta charset="UTF-8">
+
  public function __contruct(){
        <meta name="viewport" content="width=device-width">
+
      self::$cuentaObjetos ++;//Así accedo a un elemento estático
    </head>
+
      echo "Valor de la constante " . self::IVA: //Así accedo a una constante
    <body>
+
  }
        <form method="POST" action="medias.php">
+
            Valores de notas<br/>
+
            Nota 1<input type="text" name ="notas[]"/><br/>
+
            Nota 2<input type="text" name ="notas[]"/><br/>
+
            Nota 3<input type="text" name ="notas[]"/><br/>
+
            Nota 4<input type="text" name ="notas[]"/><br/>
+
            Nota 5<input type="text" name ="notas[]"/><br/>
+
            Nota 6<input type="text" name ="notas[]"/><br/>
+
            Nota 7<input type="text" name ="notas[]"/><br/>
+
            Nota 8<input type="text" name ="notas[]"/><br/>
+
            Nota 9<input type="text" name ="notas[]"/><br/>
+
            Nota 10<input type="text" name ="notas[]"/><br/>
+
       
+
            <input type=submit value="enviar datos" name="enviar"/>
+
  
    </form>
 
    <?php
 
    if (isset($_POST['enviar'])){
 
        $notas = $_POST['notas'];
 
        $suma = 0;
 
        foreach ($notas as $nota) {
 
            $suma = $suma + $nota;
 
        }
 
        echo "nota media = ".($suma / 10);
 
    }
 
    ?>
 
</body>
 
</html>
 
</source>
 
  
}}
 
  
*En el caso de la agenda, fijaros que tenemos la siguiente situación.
+
}
*Al principio tengo la agenda sin valores
+
[[Imagen:agenda1.png]]
+
*Ahora inserto un nombre y teléfono(En la imagen manolo y 1111).
+
*En el servidor es fácil leer ese nombre y teléfono que están en las cajas de texto
+
*y visualziar ahora que tengo ese nombre y teléfono
+
<source lang=php>
+
<?php
+
 
+
....
+
$nombre=$_POST['nombre']
+
$telefono = $_POST['telefono']
+
....
+
echo (" CONTACTOS ACTUALES : 1<br>");
+
    echo "<ul>";
+
    echo "<li>". $nombre.': '.$telefono."</li>";
+
    echo"</ul>";
+
?>
+
 
</source>
 
</source>
[[Imagen:agenda2.png]]
 
*Pero claro cuando vuelva a enviar otro nombre y teléfono  perderé lo anterior
 
*Para evitar esto ya sabemos que podemos poner input de tipo hidden.
 
*Pero claro tendré que poner tantos input como contactos tenga, y se me presenta el problema de qué nombres les pongo a cada uno y cómo lo recupero luego
 
*La solución, como hemos visto antes es usar un array asociativo
 
*Mirad la idea
 
*Cada vez que lea el nombre y teléfono, además de leerlo en las variabes, lo guardo en un array asociativo
 
<source lang=php>
 
<?php
 
//Esta variable son los input hidden descritos más abajo
 
$agenda = $_POST['agenda'];
 
  
....
+
*Luego hicimos un pequeño ejemplo de una calculadora
//Los valores que acaba de insertar el usuario de la aplicación
+
*El enunciado es la práctica del wiki
$nombre=$_POST['nombre'];
+
*Os dejaré el código para que lo analicéis
$telefono = $_POST['telefono'];
+
 
+
//Ahora los guardo en el array asociativo $agenda[]
+
$agendda[$nombre]=$telefono;
+
....
+
 
+
 
+
</source>
+
*Y Lo cargo en input de tipo hidden
+
<source lang=php>
+
foreach ($agenda as $nom => $tel) {
+
        echo'<input type="hidden" name="agenda[\'$nom\']" value=\'$tel\'/>';
+
        echo "<br>";
+
            }
+
</source>
+
*Cualquier duda os invito a que escribáis en el foro que hay una entrada de la tutoría
+

Revisión de 05:03 19 dic 2015





Icon objectives.jpg

Objetivos

Se han tratado el tema de programación orientado a objetos
  1. Concepto básicos
  2. Características de la programación orientada a objetos




Programación Orientada a objetos

  • Ver la programación orientada a objetos como una manera más cómoda de programar
  • Creamos componentes software, luego los usamos
  • Usamos la abstracción es sus dos visiones:
  1. Al crear los componentes software me abstraigo de lo general (de su uso), y me centro en el detalle (en su funcionamiento).
  2. Al usarlo en el programa principal me abstraigo del detalle y me centro en su uso

Consejos

  • Los nombres de las clases la primera letra en mayúscula
class Fecha{
....
}
  • Guardar cada clase en un fichero con su propio nombre
Fecha.cpp

PHP como lenguaje orientado a objetos

  • PHP es un lenguaje un poco peculiar como lenguaje orientado a objetos
  • Bajo mi punto de vista hay dos temas importantes
  1. No tiene sobrecarga tal cual la conocemos
  2. Tiene métodos mágicos que dan versatilidad aunque al principio despistan
  • Atributos y métodos por defecto publicos
class Fecha{
   private $dia;
   private $mes;
   private $year;
}
Constructor
  • Podemos poner un método con el nombre de la clase y ese se ejecutaría al instanciar el objeto
  • Tenemos un método mágico


Icon define.gif

Definición

métodos mágicio son métodos que se ejecutan sin que los invoquemos cuando ocurre determinadas cicunstancias


__construct(){
}
  • Si tenemos un método con el nombre de la clase y el método __construct implementado, solo se ejecutará el método __construct
Sobrecarga
  • La podemos simular de dos maneras
  1. Pasando varios atributos con valores por defecto
  2. usanto el método mágico __call($nameFuncion, $atributos)
Ver el wiki donde está explicada esta parte
Otros aspectos en los que se han incidido
  • Recordad que para acceder a un atributo hay que usar obligatoriamente la seudovariable $this, en este caso el atributo no tiene que llevar $
class Fecha{
   private $dia;
   private $mes;
   private $year;
   public function __construct( $d, $m, $y){
     $this->dia = $d; //mirar bien que dia no lleva $
     $mes = $m; //En este caso $mes es una variable local al método no tiene nada que ver con el atributo $mes de la clase
.....
 
   }
  • Concepto de variables/métodos estáticos y constantes
  • Usar self::... Para acceder a él
class miClase{
   const IVA; //Constante iva, así se declaran las constantes el oop de php
   public  static $cuentaObjetos; // es un atributo estático
   ....
   public function __contruct(){
      self::$cuentaObjetos ++;//Así accedo a un elemento estático
      echo "Valor de la constante " . self::IVA: //Así accedo a una constante
   }
 
 
 
}
  • Luego hicimos un pequeño ejemplo de una calculadora
  • El enunciado es la práctica del wiki
  • Os dejaré el código para que lo analicéis