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

De WikiEducator
Saltar a: navegación, buscar
(PHP como lenguaje orientado a objetos)
 
(4 revisiones intermedias por el mismo usuario no mostrado)
Línea 1: Línea 1:
 
 
{{:Usuario:ManuelRomero/DAW/distancia/tutorias/nav}}
 
{{:Usuario:ManuelRomero/DAW/distancia/tutorias/nav}}
__NTOC__
+
__NOTOC__
  
 
<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. Se invocan de forma explícita (transparente para el programador, sin que éste los invoque),  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====
+
*Concepto de variables/métodos estáticos y constantes
*Para pasar información entre el cliente y el servidor  puedo usar un input de tipo hidden.
+
*Usar self::... Para acceder a él
*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====
+
*Esto se consigue poniendo a los diferentes input el mismo nombre con corchetes.
+
*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=0.21; //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
+

Última revisión de 06:33 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. Se invocan de forma explícita (transparente para el programador, sin que éste los invoque), 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=0.21; //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