Diferencia entre revisiones de «Usuario:ManuelRomero/php/opp/introduccion»
De WikiEducator
< Usuario:ManuelRomero | php
Línea 155: | Línea 155: | ||
</source> | </source> | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ====Enlace estático en tiempo de ejecución==== | |
− | + | *Para poder hacer referencia en tiempo de ejecución a un elemento estático de la clase se usa este operador | |
+ | *Elementos estáticos en php | ||
+ | #Constantes y Propiedades y métodos estáticas | ||
+ | *Usaremos el operador '''''::''''' de resolución de ámbito | ||
+ | *Especificaremos el nombre de la clase del cual queremos acceder a su constante | ||
+ | |||
+ | |||
+ | # | ||
+ | *Usaremos igualmente el operador de resolución de ámbito '''''::''''' | ||
+ | |||
+ | #propiedades y métodos no estáticos | ||
+ | *Para ellos usaremos el operador '''''->''''', precedido de la seudovariable '''''$this''''' | ||
+ | ==static== | ||
+ | ==$this== | ||
+ | |||
+ | ===métodos=== | ||
+ | ===pseudovariables '''''this'''''=== | ||
+ | ===operador '''''self''''' y '''''parent'''''=== | ||
+ | |||
+ | |||
+ | ===Instancias: Operador '''''new'''''=== | ||
+ | *Una clase describe lo común de unos determinados objetos | ||
+ | *Las clases en principio no se usan durante la ejecución, salvo si queremos acceder a métodos o ṕropiedades estáticas como veremos un poco más adelante | ||
+ | *Lo que se usa son objetos | ||
+ | *Para ello debemos ''instanciar'' objetos de las clases | ||
+ | *Esto se hace con el operador '''new''' | ||
+ | *Una vez '''instanciado''' ya tenemos la referencia del objeto y lo podemos utilizar | ||
+ | *hay que pensar que en memoria tenemos '''toda''' la estructura del la clase por cada objeto | ||
+ | [[Archivo:Objetos4.png]] | ||
+ | <source lang=php> | ||
+ | class MiCalse{ | ||
+ | //propiedades | ||
+ | //métodos | ||
+ | } | ||
+ | $objeto = new Miclase(); | ||
+ | </source> | ||
+ | {{Actividad| | ||
+ | *Crea una clase llamada producto con los atributos código, nombre y precio}} | ||
+ | ;Accediendo a los atributos de un objeto: seudovariable $this | ||
+ | *$this es una seudovariable que referenica al objeto del ámbito en el cual está usado | ||
+ | *Se utiliza dentro de la definición de la propia clase y hará referencia a un objeto concreto en un momento dado de la clase en la que está siendo utilizado | ||
+ | *Ejemplo | ||
+ | <source lang=php> | ||
+ | <?php | ||
+ | class MyClase | ||
+ | { | ||
+ | function ser_estar() | ||
+ | { | ||
+ | if (isset($this)) { | ||
+ | echo '$this Ahora soy por que estoy'; | ||
+ | } else { | ||
+ | echo "\$this ni es ni está.\n"; | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | </source> | ||
+ | *Para usar el código anterior | ||
+ | <source lang=php> | ||
+ | |||
+ | $a = new MyClase(); | ||
+ | $a->ser_estar(); | ||
+ | |||
+ | // Accedo directamente al método de la clase | ||
+ | MyClase::ser_estar(); | ||
+ | </source> | ||
+ | *Si desde la propia clase quiero acceder a métodos o atributos estáticos, se usa el operador '''''self''''' | ||
+ | <source lang=php> | ||
+ | class Producto { | ||
+ | private static $num_productos = 0; | ||
+ | private $codigo; | ||
+ | //..... | ||
+ | public funtion ventaProducto($cantidad){ | ||
+ | //Este método podría realizar hacer varias cosas , y luego quiero decrementar elemento | ||
+ | $this->decrementa($cantidad); | ||
+ | } | ||
+ | public function incrementa ($cantidad) { | ||
+ | self::$num_productos-=$cantidad; | ||
+ | } | ||
+ | //.... | ||
+ | </source> | ||
+ | |||
+ | *Observar la función get_class(), me retorna el nombre del objeto actual si no se le pasa parámetro | ||
+ | http://php.net/manual/es/function.get-class.php | ||
+ | *Observar que para acceder a los diferentes elementos de un objeto se utilizar el operador de indirección '''''->'''''. Esto es por que en realidad el nombre del objeto es una dirección de memoria. | ||
+ | ===Funciones para usar con objetos=== | ||
+ | *Al igual que get_class(), existen una serie de funciones interesantes que conviene conocer. | ||
+ | *Ver la siguiente referenica | ||
+ | http://php.net/manual/es/ref.classobj.php | ||
+ | |||
+ | |||
===métodos contructor y destructor=== | ===métodos contructor y destructor=== | ||
− | * | + | *En php existe un método llamado __construct(..) el cual es invocado siempre que se instancia un objeto. |
− | * | + | *Es el constructor, y su invocación es implícita al operador new. |
− | * | + | *En PHP5 puedes definir en las clases métodos constructores, que se ejecutan cuando se crea el objeto. El constructor de una clase debe llamarse __construct. Se pueden utilizar, por ejemplo, para asignar valores a atributos. |
+ | *Veamos el ejemplo | ||
+ | <source lang=php> | ||
+ | class Producto { | ||
+ | private static $num_productos = 0; | ||
+ | private $codigo; | ||
+ | |||
+ | public function __construct() { | ||
+ | self::$num_productos++; | ||
+ | } | ||
+ | … | ||
+ | } | ||
+ | |||
+ | *El constructor de una clase puede llamar a otros métodos o tener parámetros, | ||
+ | *En este caso deberán pasarse cuando se crea el objeto. | ||
+ | *Sin embargo, sólo puede haber un método constructor en cada clase. Este concepto es importante tenerlo claro | ||
+ | |||
+ | <source lang=php> | ||
+ | class Producto { | ||
+ | private static $num_productos = 0; | ||
+ | private $codigo; | ||
+ | |||
+ | public function __construct($codigo) { | ||
+ | $this->$codigo = $codigo; | ||
+ | self::$num_productos++; | ||
+ | } | ||
+ | } | ||
+ | $p = new Producto('GALAXYS'); | ||
+ | </source> | ||
+ | *Por ejemplo, si como en este ejemplo, definimos un constructor en el que haya que pasar el código, siempre que instanciemos un nuevo objeto de esa clase tendrás que indicar su código. | ||
+ | {{Pregunta|Ahora habría que pensar como implementar la sobre carga de un constructor }} | ||
+ | {{Actividad| | ||
+ | *Realiza una clase para acceso a la base de datos | ||
+ | *Será una forma de reescribir mysqli mas amigable para nosotros | ||
+ | *Podremos conectar. | ||
+ | *Si no pasamos valor por defecto se conectará con los parámetros de siempre (localhost, dwes, root, root | ||
+ | *Verificará usuario en la tabla de usuarios | ||
+ | *Insertará un usuario | ||
+ | *Obtendrá los datos de un producto o de todos | ||
+ | *Realiza luego un programa que utilice esta clase y observa su comodidad. | ||
+ | <source lang=php> | ||
+ | <?php | ||
+ | require_once('Producto.php'); | ||
+ | |||
+ | class DB { | ||
+ | public public __contruct(.....){ | ||
+ | //Este método conecta por defecto con localhost, root root y dwes | ||
+ | } | ||
+ | public function ejecutaConsulta($sql) { | ||
+ | //realiza una consulta | ||
+ | |||
+ | } | ||
+ | |||
+ | |||
+ | //Obitene todos los productos de la tabla productos y los reotorna en una array | ||
+ | public function obtieneProductos() { | ||
+ | |||
+ | } | ||
+ | |||
+ | |||
+ | //Obtiene un producto determinado | ||
+ | public function obtieneProducto($codigo) { | ||
+ | |||
+ | } | ||
+ | |||
+ | //Verifica un cliente para la clase en general | ||
+ | public static function verificaUsuario($nombre, $contrasena) { | ||
+ | |||
+ | } | ||
+ | //Verifica un cliente para la clase en general | ||
+ | public static function insertaUsuario($nombre, $contrasena) { | ||
+ | |||
+ | |||
+ | } | ||
+ | |||
+ | ?> | ||
+ | </source> | ||
+ | |||
+ | <!-- | ||
+ | <source lang=php> | ||
+ | <?php | ||
+ | require_once('Producto.php'); | ||
+ | |||
+ | class DB { | ||
+ | protected static function ejecutaConsulta($sql) { | ||
+ | $opc = array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"); | ||
+ | $dsn = "mysql:host=localhost;dbname=dwes"; | ||
+ | $usuario = 'dwes'; | ||
+ | $contrasena = 'abc123.'; | ||
+ | |||
+ | $dwes = new PDO($dsn, $usuario, $contrasena, $opc); | ||
+ | $resultado = null; | ||
+ | if (isset($dwes)) $resultado = $dwes->query($sql); | ||
+ | return $resultado; | ||
+ | } | ||
+ | |||
+ | public static function obtieneProductos() { | ||
+ | $sql = "SELECT cod, nombre_corto, nombre, PVP FROM producto;"; | ||
+ | $resultado = self::ejecutaConsulta ($sql); | ||
+ | $productos = array(); | ||
+ | |||
+ | if($resultado) { | ||
+ | // Añadimos un elemento por cada producto obtenido | ||
+ | $row = $resultado->fetch(); | ||
+ | while ($row != null) { | ||
+ | $productos[] = new Producto($row); | ||
+ | $row = $resultado->fetch(); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | return $productos; | ||
+ | } | ||
+ | |||
+ | |||
+ | public static function obtieneProducto($codigo) { | ||
+ | $sql = "SELECT cod, nombre_corto, nombre, PVP FROM producto"; | ||
+ | $sql .= " WHERE cod='" . $codigo . "'"; | ||
+ | $resultado = self::ejecutaConsulta ($sql); | ||
+ | $producto = null; | ||
+ | |||
+ | if(isset($resultado)) { | ||
+ | $row = $resultado->fetch(); | ||
+ | $producto = new Producto($row); | ||
+ | } | ||
+ | |||
+ | return $producto; | ||
+ | } | ||
+ | |||
+ | public static function verificaCliente($nombre, $contrasena) { | ||
+ | $sql = "SELECT usuario FROM usuarios "; | ||
+ | $sql .= "WHERE usuario='$nombre' "; | ||
+ | $sql .= "AND contrasena='" . md5($contrasena) . "';"; | ||
+ | $resultado = self::ejecutaConsulta ($sql); | ||
+ | $verificado = false; | ||
+ | |||
+ | if(isset($resultado)) { | ||
+ | $fila = $resultado->fetch(); | ||
+ | if($fila !== false) $verificado=true; | ||
+ | } | ||
+ | return $verificado; | ||
+ | } | ||
+ | |||
+ | } | ||
+ | |||
+ | ?> | ||
+ | </source> | ||
+ | --> | ||
+ | }} | ||
+ | |||
+ | |||
{{Actividad| | {{Actividad| | ||
Construir una clase llamado racional que podamos inicializar con un string del tipo por ejemplo "8/5" | Construir una clase llamado racional que podamos inicializar con un string del tipo por ejemplo "8/5" | ||
Línea 506: | Línea 744: | ||
--> | --> | ||
}} | }} | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
===Estableciendo nivel de acceso:Encapsulación=== | ===Estableciendo nivel de acceso:Encapsulación=== | ||
Línea 599: | Línea 750: | ||
;public (Si se utiliza la sintexis var de php 4, implica acceso pulbic). Acceso total | ;public (Si se utiliza la sintexis var de php 4, implica acceso pulbic). Acceso total | ||
;protected Solo accesible desde las clases que presentas herencia | ;protected Solo accesible desde las clases que presentas herencia | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
==::== | ==::== |
Revisión de 19:43 12 dic 2014
Trabajo en proceso, espera cambios frecuentes. Tu ayuda y retroalimentación son bienvenidos. Ver página de charlas. |
Repaso básico de la programación orientada a objetos
Atributos ==> Son las características o datos de un objeto Su valor nos da el estado de un objeto en un momento dado Comportamiento==> permiten modificar el estado de un objetos Permiten saber como es el estado de un objeto Permiten que un objeto haga cosas en el sistema (comunicación entre objetos) Son las cosas que el objeto sabe hacer Servicios que ofrece También lo son acciones internas para facilitar las cosas al objeto OPP En php
class NombreClase{ //propiedades //métodos }
^[a-zA-Z_][a-zA-Z0-9_]*$
Propiedades
<?php class Constantes{ const K = 10; const IVA = 0.21; function getValores(){ echo "Valor de la constante --".self::K."--<br/>"; echo "Valor del producto de 235 euros base ".((self::IVA*235)+235); } } $a=new Constantes(); //Mostramos los valores de las constantes $a->getValores(); echo "<br/>valor de la constante con el nombre de la clase ".Constantes::K; echo "<br/>valor de la constante con el nombre del objeto".$a::K; ?>
<?php class Propiedades{ public $propiedad = "rojo"; function getPropiedad(){ echo "\$propiedad ahora es una variable local a método y no tiene valor: --$propiedad--<br/>"; $propiedad="Valor local de \$propiedad en el método getPropiedad()<br>"; echo "Ahora visualizo el valor de \$propiedad de la clase: --$this->propiedad--<br/>"; echo "Ahora visualizo el valor de \$propiedad del método: --$propiedad--<br/>"; } } $a = new Propiedades(); $a->getPropiedad(); ?> Métodos
http://php.net/manual/es/language.oop5.magic.php Son métodos que no tienen código y su implementación se establece al crear una clase que derivada de la clase que contiene el método abstracto.
class Lock { private $isLocked = false; public function unlock() { $this->isLocked = false; echo 'You unlocked the Lock'; } public function lock() { $this->isLocked = true; echo 'You locked the Lock'; } public function isLocked() { return $this->isLocked; } } $aLock = new Lock; // Create object from the class blueprint $aLock->unlock(); // You unlocked the Lock $aLock->lock(); // You locked the Lock
Enlace estático en tiempo de ejecución
static$thismétodospseudovariables thisoperador self y parentInstancias: Operador new
class MiCalse{ //propiedades //métodos } $objeto = new Miclase();
<?php class MyClase { function ser_estar() { if (isset($this)) { echo '$this Ahora soy por que estoy'; } else { echo "\$this ni es ni está.\n"; } } }
$a = new MyClase(); $a->ser_estar(); // Accedo directamente al método de la clase MyClase::ser_estar();
class Producto { private static $num_productos = 0; private $codigo; //..... public funtion ventaProducto($cantidad){ //Este método podría realizar hacer varias cosas , y luego quiero decrementar elemento $this->decrementa($cantidad); } public function incrementa ($cantidad) { self::$num_productos-=$cantidad; } //....
http://php.net/manual/es/function.get-class.php
Funciones para usar con objetos
http://php.net/manual/es/ref.classobj.php
métodos contructor y destructor
class Producto { private static $num_productos = 0; private $codigo; public function __construct() { self::$num_productos++; } … } *El constructor de una clase puede llamar a otros métodos o tener parámetros, *En este caso deberán pasarse cuando se crea el objeto. *Sin embargo, sólo puede haber un método constructor en cada clase. Este concepto es importante tenerlo claro <source lang=php> class Producto { private static $num_productos = 0; private $codigo; public function __construct($codigo) { $this->$codigo = $codigo; self::$num_productos++; } } $p = new Producto('GALAXYS');
Un concepto muy importante es la sobre carga.
$a = new racional ("8/5");/* 8/5 */ $b = new racional (5,4); /* 5/6 */ $c = new racional (5); /* 5/1 */ $d = new racional (); /* 1/1 */
public function __construct($cadenaOrNum=null, $den = null) { .... }
métodos mágicos
http://php.net/manual/es/language.oop5.magic.php
// caso $a = racional(8,7); racionalNumDen($cadenaOrNum, $den ); // caso $a = racional(8); racionalNum($cadenaOrNum ); // caso $a = racional("8/7"); racionalCadena($cadenaOrNum); // caso $a = racional(); y se inicia con 1/1 racionalVacio();
Estableciendo nivel de acceso:Encapsulación
::
visibilidad
<?php class Usuario { private $usuario; private $password; public function __construct($usuario) { $this->password = 'passDefecto'; $this->usuario = $usuario; } public function __destruct() { echo 'Me voy......'; } public function getUsuario(){ return $this->usuario; } public function getPass(){ return $this->password; } public function setUsuario($user){ this->usuario =$user; } public function setPass($pass){ this->password =$pass; } } $usuario = new Usuario('manolo'); //.... $pass = $_POST['pass']; //.... $usuario->setPass($pass); //... ?>
<?php /* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ class persona{ protected $nombre; protected $fNac; //.... } class medico extends persona{ private $numColegiado; public function __construct($nombre, $fechaNacimiento, $colegiado) { $this->nombre=$nombre; $this->fNac=$fechaNacimiento; $this->numColegiado=$colegiado; } public function visualiza(){ echo "Medico $this->nombre"; } } $medicoPueblo1= new medico("pedro", "1/1/1969","123456"); $medicoPueblo1->visualiza(); ?>
|