
Diferencia entre revisiones de «Usuario:ManuelRomero/php/opp/introduccion»
De WikiEducator
< Usuario:ManuelRomero | php
Línea 111: | Línea 111: | ||
*Las variables siguen la misma regla de construcción que vistas anteriormente. | *Las variables siguen la misma regla de construcción que vistas anteriormente. | ||
*Las propiedades de la clase al igual que los métodos pueden especificárseles una determinada [[#visibilidad]] o alcance, siendo el valor por defecto '''''public'''''. | *Las propiedades de la clase al igual que los métodos pueden especificárseles una determinada [[#visibilidad]] o alcance, siendo el valor por defecto '''''public'''''. | ||
− | *También puedes ser [[#static]] o estáticas, también conocidas como variables de la clase, si se epecifica con la palabra reservada '''''[[#static]]''''' | + | *También puedes ser [[#static]] o estáticas, también conocidas como variables de la clase, si se epecifica con la palabra reservada '''''[[#static]]'''''. Este concepto lo abordaremos en otra sección. |
*Dado que php es de tipado dinámico, si dentro de un método de la clase quiero acceder a una propiedad de la misma he de indicarlo usando la seudovariable '''''[[#$this]]'''' | *Dado que php es de tipado dinámico, si dentro de un método de la clase quiero acceder a una propiedad de la misma he de indicarlo usando la seudovariable '''''[[#$this]]'''' | ||
*En este caso no podremos el '''''$''''' delante del nombre de la propiedad | *En este caso no podremos el '''''$''''' delante del nombre de la propiedad | ||
Línea 117: | Línea 117: | ||
<?php | <?php | ||
class Propiedades{ | class Propiedades{ | ||
+ | |||
public $propiedad = "rojo"; | public $propiedad = "rojo"; | ||
− | function getPropiedad(){ | + | |
+ | public function getPropiedad(){ | ||
+ | |||
echo "\$propiedad ahora es una variable local a método y no tiene valor: --$propiedad--<br/>"; | echo "\$propiedad ahora es una variable local a método y no tiene valor: --$propiedad--<br/>"; | ||
− | $propiedad=" | + | |
+ | $propiedad="azul"; | ||
+ | |||
+ | echo "Ahora visualizo el valor de \$propiedad del método: --$propiedad--<br/>"; | ||
+ | |||
echo "Ahora visualizo el valor de \$propiedad de la clase: --$this->propiedad--<br/>"; | echo "Ahora visualizo el valor de \$propiedad de la clase: --$this->propiedad--<br/>"; | ||
− | + | ||
} | } | ||
} | } | ||
Línea 130: | Línea 137: | ||
?> | ?> | ||
</source> | </source> | ||
+ | |||
===Métodos=== | ===Métodos=== | ||
*Es la forma de especificar el comportamiento de la clase | *Es la forma de especificar el comportamiento de la clase | ||
Línea 139: | Línea 147: | ||
*Su implementación es libre para cada clase, | *Su implementación es libre para cada clase, | ||
*Su invocación es transparente para el programador y se realiza siempre respectivamente al crear el objeto, y cuando este es destruido | *Su invocación es transparente para el programador y se realiza siempre respectivamente al crear el objeto, y cuando este es destruido | ||
+ | *El nombre es __construct y __destruct respectivamente, si bien, la lista de argumentos que pueden recibir, así como las acciones que pueden realizar es libre de implementar. | ||
+ | *Estos métodos que se invocan automáticamente cuando ocurre algo, en php se conocen como métodos mágicos. | ||
+ | *Los estudiaremos en otro apartado posteriormente, pero conviene conocer su existencia | ||
;[[#métodos mágicos]] | ;[[#métodos mágicos]] | ||
*Una serie de métodos cuyos nombres están reservados y se pueden usar con cualquier objeto de cualquier clase. | *Una serie de métodos cuyos nombres están reservados y se pueden usar con cualquier objeto de cualquier clase. | ||
+ | *Su nombre siempre empieza por __ | ||
*Un ejemplo son el __construct(...) y __destruct(...) | *Un ejemplo son el __construct(...) y __destruct(...) | ||
http://php.net/manual/es/language.oop5.magic.php | http://php.net/manual/es/language.oop5.magic.php | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
===Instancias: Operador '''''new'''''=== | ===Instancias: Operador '''''new'''''=== | ||
Línea 212: | Línea 191: | ||
} | } | ||
} | } | ||
+ | |||
+ | |||
+ | |||
+ | <!-- | ||
+ | ;[[#métodos abstractos]] | ||
+ | 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. | ||
+ | #[[#métodos estáticos ]] | ||
+ | *También llamados métodos de la clase, solo se crea una instancia, la cual es compartida por todos los objetos de la misma clase. | ||
+ | *Para poder acceder a un método estático, al igual que en las propiedades estáticas o en las constantes, hay que usar el operador de resolución de ambito [['''''#::''''']] | ||
+ | <source lang=php> | ||
+ | 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 | ||
+ | </source> | ||
+ | |||
+ | |||
+ | |||
+ | |||
</source> | </source> | ||
*Para usar el código anterior | *Para usar el código anterior | ||
Línea 398: | Línea 415: | ||
}} | }} | ||
+ | --> | ||
+ | {{Actividad| | ||
+ | =Empleado= | ||
+ | Confeccionar una clase Empleado, definir como atributos su nombre y sueldo. | ||
+ | Definir un método inicializar que lleguen como dato el nombre y sueldo. Plantear un segundo método que imprima el nombre y un mensaje si debe o no pagar impuestos (si el sueldo supera a 3000 paga impuestos) | ||
+ | <!-- | ||
+ | <source lang=php> | ||
+ | <html> | ||
+ | <head> | ||
+ | <title>Pruebas</title> | ||
+ | </head> | ||
+ | <body> | ||
+ | <?php | ||
+ | class Empleado { | ||
+ | private $nombre; | ||
+ | private $sueldo; | ||
+ | |||
+ | public function asigna($nom,$sue) | ||
+ | { | ||
+ | $this->nombre=$nom; | ||
+ | $this->sueldo=$sue; | ||
+ | } | ||
+ | public function pagaImpuestos() | ||
+ | { | ||
+ | echo $this->nombre; | ||
+ | echo '-'; | ||
+ | if ($this->sueldo>3000) | ||
+ | echo 'Debe pagar impuestos'; | ||
+ | else | ||
+ | echo 'No paga impuestos'; | ||
+ | echo '<br>'; | ||
+ | } | ||
+ | } | ||
+ | $empleado1=new Empleado(); | ||
+ | $empleado1->inicializar('Luis',2500); | ||
+ | $empleado1->pagaImpuestos(); | ||
+ | $empleado1=new Empleado(); | ||
+ | $empleado1->inicializar('Carla',4300); | ||
+ | $empleado1->pagaImpuestos(); | ||
+ | ?> | ||
+ | </body> | ||
+ | </html> | ||
+ | </source> | ||
+ | --> | ||
+ | =Actividad 2= | ||
+ | Confeccionar una clase Menu. Permitir añadir la cantidad de opciones que necesitemos. Mostrar el menú en forma horizontal o vertical (según que método llamemos | ||
+ | <!-- | ||
+ | <source lang = php> | ||
+ | <html> | ||
+ | <head> | ||
+ | <title>Pruebas</title> | ||
+ | </head> | ||
+ | <body> | ||
+ | <?php | ||
+ | class Menu { | ||
+ | private $enlaces=array(); | ||
+ | private $titulos=array(); | ||
+ | public function cargarOpcion($en,$tit) | ||
+ | { | ||
+ | $this->enlaces[]=$en; | ||
+ | $this->titulos[]=$tit; | ||
+ | } | ||
+ | public function mostrarHorizontal() | ||
+ | { | ||
+ | for($f=0;$f<count($this->enlaces);$f++) | ||
+ | { | ||
+ | echo '<a href="'.$this->enlaces[$f].'">'.$this->titulos[$f].'</a>'; | ||
+ | echo "-"; | ||
+ | } | ||
+ | } | ||
+ | public function mostrarVertical() | ||
+ | { | ||
+ | for($f=0;$f<count($this->enlaces);$f++) | ||
+ | { | ||
+ | echo '<a href="'.$this->enlaces[$f].'">'.$this->titulos[$f].'</a>'; | ||
+ | echo "<br>"; | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | $menu1=new Menu(); | ||
+ | $menu1->cargarOpcion('http://www.google.com','Google'); | ||
+ | $menu1->cargarOpcion('http://www.yahoo.com','Yhahoo'); | ||
+ | $menu1->cargarOpcion('http://www.msn.com','MSN'); | ||
+ | $menu1->mostrarVertical(); | ||
+ | ?> | ||
+ | </body> | ||
+ | </html> | ||
+ | </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" |
Revisión de 02:42 5 mar 2015
![]() |
Trabajo en proceso, espera cambios frecuentes. Tu ayuda y retroalimentación son bienvenidos. Ver página de charlas. |
![]() |
Programación orientada a objetos
Definición
Elementos en 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"; public function getPropiedad(){ echo "\$propiedad ahora es una variable local a método y no tiene valor: --$propiedad--<br/>"; $propiedad="azul"; echo "Ahora visualizo el valor de \$propiedad del método: --$propiedad--<br/>"; echo "Ahora visualizo el valor de \$propiedad de la clase: --$this->propiedad--<br/>"; } } $a = new Propiedades(); $a->getPropiedad(); ?> Métodos
http://php.net/manual/es/language.oop5.magic.php Instancias: 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"; } } } <!-- ;[[#métodos abstractos]] 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. #[[#métodos estáticos ]] *También llamados métodos de la clase, solo se crea una instancia, la cual es compartida por todos los objetos de la misma clase. *Para poder acceder a un método estático, al igual que en las propiedades estáticas o en las constantes, hay que usar el operador de resolución de ambito [['''''#::''''']] <source lang=php> 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
$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');
Actividad
-->
Actividad
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) { .... }
Actividad
<?php /** * Description of racional * * @author alumno */ class racional { //put your code here private $num; private $den; private $numRacional; public function __construct($cadenaOrNum=null, $den = null) { if (is_null($cadenaOrNum)) $this->racionalVacio(); else if (!(is_null($den))) $this->racionalNumDen($cadenaOrNum, $den ); else if (is_int($cadenaOrNum)) $this->racionalNum($cadenaOrNum); else $this->racionalCadena($cadenaOrNum); } //Sobrecargamos el m étodo asigna de modo que se pueda implementar de las siguientes maneras /*asigna("6/4"); asigna(); asigna(8); asigna(124, 6); * */ public function __call($metodo, $argumentos) { if ($metodo = "asigna"){ switch (count($argumentos)){ case 0: $this->racionalVacio(); break; case 2: $this->racionalNumDen($argumentos[0], $argumentos[1]); break; case 1: if (is_int($argumentos[0])) $this->racionalNum($argumentos[0]); else $this->racionalCadena($argumentos[0]); break; } } } // caso $a = racional(8,7); private function racionalNumDen($num, $den ){ $this->num=$num; $this->den=$den; $this->numRacional="$num/$den"; } // caso $a = racional(8); private function racionalNum($num ){ $this->num=$num; $this->den=1; $this->numRacional="$num/1"; } // caso $a = racional("8/7"); private function racionalCadena($cadena){ $pos = strpos($cadena, "/"); $num = substr($cadena,0, $pos); $den = substr($cadena ,$pos+1 ); settype($num, "int"); settype($den, "int"); $this->num= $num; $this->den= $den; $this->numRacional=$cadena; } // caso $a = racional(); y se inicia con 1/1 private function racionalVacio(){ $this->num=1; $this->den=1; $this->numRacional="1/1"; } public function visualiza(){ echo "<br/>valor del numerador ".$this->num; echo "<br/>valor del denominador ".$this->den; echo "<br/>valor del racional ".$this->numRacional; echo "<br/>valor numerico ".($this->num/$this->den); } } //------------------------- $a= new racional(); $b= new racional(5); $c= new racional(5,6); $d= new racional("6/6"); $a->visualiza(); $b->visualiza(); $c->visualiza(); $d->visualiza(); $a->asigna(6000,545); $a->visualiza(); $a->asigna("8458/55154"); $a->visualiza(); $a->asigna(85547); $a->visualiza(); $a->asigna(); $a->visualiza(); ?> 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();
Actividad
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(); ?>
|