Diferencia entre revisiones de «Usuario:ManuelRomero/DAW/Distancia/2015/tutorias/tutoria1/»

De WikiEducator
Saltar a: navegación, buscar
Línea 67: Línea 67:
 
Cuando en un programa principal, voy a usar clases en de incluir los ficheros que contengan la implementación de las clases
 
Cuando en un programa principal, voy a usar clases en de incluir los ficheros que contengan la implementación de las clases
  
Por lo que  si tuvierámso la siguiente estructura de clases
+
Por lo que  si tuvierámso la siguiente estructura de clases que se muestra en el ejemplo
 +
[[Archivo:tree_clases.png]]
 +
*Cada clase lo único que va a hacer es en el constructor escribir un texto (es solo un ejemplo)
 +
<source lang=php>
 +
class A {
 +
    public function __construct() {
 +
        echo "<h2>Estoy cargando un objeto A</h2>";
 +
    }
 +
}
 +
</source>
 +
*Si en un programa principal queremos usar estas clases , tendríamos que '''''requerir''''' cada fichero
 +
<source lang=php>
 +
 
 +
require "A.php";
 +
require "B.php";
 +
require "C.php";
 +
require "D.php";
 +
require "E.php";
 +
 
 +
 
 +
$a = new A();
 +
$b = new B();
 +
$c = new C();
 +
$d = new D();
 +
$e = new E();
 +
</source>
 +
*Pero  si cada fichero está nombrado con el nombre de la clase, podemos usar una función de autocarga
 +
*Esta función es invocada de forma implícita cada vez que se instancia un objeto de una clase. En su invocación '''''recibe como parámetro un a función de callback que tiene el nombre de esa clase como parámetro'''''
 +
*Usando este hecho podríamos hacer
 +
*Esta función se llama '''''spl_autload_register(){}'''''
 +
*La función que recibe de parámetro no nos importa el nombre, por lo que la podemos usar como una función anónima
 +
 
 +
<source lang=php>
 +
spl_autoload_register(function ($variable_nombre_clase) {});
 +
</source>
 +
*Ahora tocaría poner código en esa función que tiene el parámetro nombre de la clase que queremos cargar
 +
<soruce lang=php>
 +
spl_autoload_register(function ($clase) {
 +
    require ("$clase.php");
 +
});
 +
 
 +
$a = new A();
 +
$b = new B();
 +
$c = new C();
 +
$d = new D();
 +
$e = new E();
 +
</source>
 +
 
 
</div>
 
</div>

Revisión de 23:45 24 ene 2020





Icon objectives.jpg
Objetivo
Se han tratado 3 temas fundamentalmente
  1. La programación orientada a objetos
  2. La práctica de la calculadora
  3. El examen de primera evaluación
La programación orientada a objetos
  • Se revisa las peculiaridades de php como lenguaje orientado a objetos
  • Se insiste en leer el wiki a pesar de que a veces pueda parecer un poco desordenado. pero es información importante. Cualquier cuestión que no quede clara o que se vea incompleta se debería comentar para solvertarlo.
  • En php hay dos aspecto peculiares sobre OOP
  1. Que no permite la sobrecarga/polimorfismo como la entendemos en otros lenguajes como java
  2. Que tiene lo que se llama métodos mágicos que son métodos que no se invocan de forma explícita, si no que implícitamente se invocas (si es que se han implementado) cuando ocurre algo
  • Sobre la primera cuestión se trabaja el ejemplo del racional:
  • Suponemos que queremos tener las siguientes opiciones de instanciar objetos
$r1 = new Racional(); // 1/1
$r2 = new Racional(6); // 6/1
$r3 = new Racional(7, 4); // 7/4
$r4 = new Racional("9/4"); //9/6
  • En este caso queremos sobre cargar el constructor. En php no se pueden crear métodos con el mismo nombre
  • Entonces lo que hacemos es crerar un solo método que tenga el máximo número de parámetros con el que se pueda invocar (en este caso 2) y con valores por defecto para aquellos que podrían no aparecer (en este caso los dos
class Racional {
//put your code here
 private $num;
 private $den;
 
public function __construct($num = null, $den = null) {
  • Ahora en el método empezamos a interrogar sobre si existe o no el parámetro y el tipo de dato
  • En este caso creamos este código, claramente sin optimizar ...
public function __construct($num = null, $den = null) {
 if ($num == null) { //new Racional()
      $this->num = 1;
      $this->den = 1;
  } else {
        if ($den == null) {
            if (is_numeric($num)) { // new Racional(5)
                $this->num = $num;
                $this->den = 1;
             } else { //new Racional("9/4");
                $v = explode("/", $num);
                $this->num = $v[0];
                $this->den = $v[1];
             }
        } else { //new Racional (5,6)
             $this->num = $num;
             $this->den = $den;
        }//end if/else $den ==null
     }
 }
Autocarga de clases

Sobre la autocarga de clases, se ha comentado como en php si seguimos las buenas prácticas de programación se debe de implementar cada clase en un fichero que tenga su nombre Cuando en un programa principal, voy a usar clases en de incluir los ficheros que contengan la implementación de las clases

Por lo que si tuvierámso la siguiente estructura de clases que se muestra en el ejemplo Tree clases.png

  • Cada clase lo único que va a hacer es en el constructor escribir un texto (es solo un ejemplo)
class A {
    public function __construct() {
        echo "<h2>Estoy cargando un objeto A</h2>";
    }
}
  • Si en un programa principal queremos usar estas clases , tendríamos que requerir cada fichero
require "A.php";
require "B.php";
require "C.php";
require "D.php";
require "E.php";
 
 
$a = new A();
$b = new B();
$c = new C();
$d = new D();
$e = new E();
  • Pero si cada fichero está nombrado con el nombre de la clase, podemos usar una función de autocarga
  • Esta función es invocada de forma implícita cada vez que se instancia un objeto de una clase. En su invocación recibe como parámetro un a función de callback que tiene el nombre de esa clase como parámetro
  • Usando este hecho podríamos hacer
  • Esta función se llama spl_autload_register(){}
  • La función que recibe de parámetro no nos importa el nombre, por lo que la podemos usar como una función anónima
spl_autoload_register(function ($variable_nombre_clase) {});
  • Ahora tocaría poner código en esa función que tiene el parámetro nombre de la clase que queremos cargar

<soruce lang=php> spl_autoload_register(function ($clase) {

   require ("$clase.php");

});

$a = new A(); $b = new B(); $c = new C(); $d = new D(); $e = new E(); </source>