Diferencia entre revisiones de «PHP Programación Orientada a obxectos»
Ir a la navegación
Ir a la búsqueda
| Línea 83: | Línea 83: | ||
* O nome da clase pode comezar por unha letra ou guión baixo seguido de letras, números e guións baixos. Non se pode utilizar ningunha palabra reservada de PHP. | * O nome da clase pode comezar por unha letra ou guión baixo seguido de letras, números e guións baixos. Non se pode utilizar ningunha palabra reservada de PHP. | ||
* Como norma, '''o nome dunha clase comezará cunha letra maiúscula'''. | * Como norma, '''o nome dunha clase comezará cunha letra maiúscula'''. | ||
| + | |||
: Exemplos: | : Exemplos: | ||
:: class <b>P</b>elota {} | :: class <b>P</b>elota {} | ||
:: class <b>C</b>onta<b>B</b>ancaria {} | :: class <b>C</b>onta<b>B</b>ancaria {} | ||
| + | |||
| + | |||
| + | * Cada clase '''estará definida nun arquivo php que levará o seu nome'''. | ||
| + | : Así, por exemplo, a clase Alumno terá un arquivo de nome Alumno.class.php | ||
| + | : Como norma, '''a extensión dunha clase será .class.php'''. | ||
| + | |||
| + | : Se dentro dunha páxina php necesito utilizar a clase Alumno terei que poñer: | ||
| + | ::<syntaxhighlight lang="java" line enclose="div" highlight="" > | ||
| + | <?php | ||
| + | require_once('Alumno.class.php'); | ||
| + | ?> | ||
| + | </syntaxhighlight> | ||
| + | |||
| + | :<u>Nota:</u> Lembrar as formas que [http://wiki.cifprodolfoucha.es/index.php?title=PHP_Reutilizaci%C3%B3n_de_c%C3%B3digo:_Include_/_Require vimos para incluír arquivos externos]. | ||
| + | : No exemplo estamos a supoñer que o arquivo 'Alumno.class.php' atópase no mesmo sitio que a clase php que está a facer uso del. | ||
| + | |||
| + | * Para non ter que repetir o código anterior para cada unha das clases que necesitemos, podemos facer uso da [http://php.net/manual/es/language.oop5.autoload.php autocarga de clases]. | ||
| + | : Do que se trata é de que cando fagamos uso dunha clase, a páxina PHP a inclúa automaticamente sen ter que facelo nos manualmente como no exemplo anterior. Para iso podemos facer uso da... | ||
| + | |||
| + | * [http://php.net/manual/es/function.spl-autoload-register.php Función sql-autoload-register]. | ||
| + | : Exemplo: | ||
| + | ::<syntaxhighlight lang="java" line enclose="div" highlight="6,2-4" > | ||
| + | <?php | ||
| + | function cargadorClases($class) { | ||
| + | require $class . '.class.php'; | ||
| + | } | ||
| + | |||
| + | spl_autoload_register('cargadorClases'); | ||
| + | |||
| + | ?> | ||
| + | </syntaxhighlight> | ||
| + | |||
| + | : Liña 6: Indicamos o nome da función que vai 'cargar' as clases cando non se atopen definidas na páxina actual. | ||
| + | : Liñas 2-4: Definimos a función indicada no método 'spl_autoload_register'. Dita función se define cunha parámetro, que vai ser o nome da clase a cargar cando non a atope. | ||
| + | :: No interior de dita función formamos o nome do arquivo a cargar en base ao nome da clase e o [http://wiki.cifprodolfoucha.es/index.php?title=PHP_Reutilizaci%C3%B3n_de_c%C3%B3digo:_Include_/_Require incluímos cunha das formas xa vistas anteriormente]. | ||
| + | |||
| + | * Vexamos un exemplo de clase: | ||
| + | : Arquivo: '''DiscosDuros.class.php''' | ||
| + | ::<syntaxhighlight lang="java" line enclose="div" highlight="" > | ||
| + | <?php | ||
| + | |||
| + | class DiscosDuros { | ||
| + | public $numSerie; | ||
| + | public $capacidade=1; // en TB | ||
| + | |||
| + | public function getCapacidadeKB(){ | ||
| + | return $this->capacidade*1024*1024; | ||
| + | } | ||
| + | } | ||
| + | </syntaxhighlight> | ||
| + | |||
| + | : Como vemos, temos definidos dous atributos, número de serie e capacidade. Por defecto, a capacidade de todos os obxectos que cremos desta clase será de 1TB. | ||
| + | : Tamén vemos a definición dun método (getCapacidadeKB) que devolve a capacidade do disco en KB. Dentro deste método sinalar o uso da variable '''$this'''. | ||
| + | |||
| + | === Variable $this === | ||
| + | |||
| + | * En todas as linguaxe de POO sempre imos ter unha forma de referenciar a 'instancia' actual dentro do código da clase. | ||
| + | : Que significa a 'instancia acutal' ? | ||
| + | |||
| + | * Cando cremos obxectos dunha clase, cada obxecto terá os seus datos. | ||
| + | : Así, podo crear dúas contas bancarias (dous obxectos): | ||
| + | :: conta1 | ||
| + | |||
| + | == Creando obxectos == | ||
| + | |||
| + | * Para crear un obxecto dunha clase usaremos este código: | ||
| + | ::<syntaxhighlight lang="java" line enclose="div" highlight="" > | ||
| + | <?php | ||
| + | |||
| + | ?> | ||
| + | </syntaxhighlight> | ||
| + | |||
| + | |||
Revisión del 12:47 12 nov 2016
Introdución
- Na actualidade empréganse fundamentalmente dúas formas de programación:
- Programación estruturada
- Programación orientada a obxectos.
- A programación estruturada baséase na utilización de 3 estruturas básicas: Secuencial, Condicional e Repetitiva.
- En base a estas 3 estruturas podemos 'programar' calquera solución informática.
- É un tipo de programación 'orientada' ao procedemento. Programamos pensando nos procesos que imos que ter que aplicar aos datos dos que dispoñemos.
- Vexamos un exemplo.
- Imaxinemos que queremos programar unha solución informática para xestionar as contas bancarias.
- Partimos de que temos uns datos: un número de conta, un saldo, un titular, unha dirección.
- Creamos un programa no que definimos globalmente os datos, por exemplo en forma de array, no que cada elemento do array vai ser unha conta cos datos anteriores. Podemos ler ditos datos dende unha base de datos un dun arquivo.
- Isto o faríamos en primeiro lugar utilizando unha estrutura secuencial.
- Creamos os procedementos necesarios para tratar ditos datos, pensando no tratamentos que imos dar a ditos datos:
- Procedemento de ingresarCartos, ao que mandaríamos como parámetro un número de conta e uns cartos. Buscaríamos dito número de conta no array e aumentaríamos o seus ingresos.
- Procedemento de retirarCartos, ao que mandaríamos como parámetro un número de conta e uns cartos. Buscaríamos dito número de conta no array e diminuímos o seus ingresos.
- ....
- A programación orientada a obxectos, denominada POO, basease no uso de clases e obxectos (instancias de clase) para dar unha solución informática a un problema.
- É un tipo de programación 'orientada' ao dato. Programamos pensando na información que dispoñemos e 'modelizamos' ditos datos con clases.
- Unha clase vai estar formada por 'variables' ('atributos na POO') e 'procedementos' ('métodos na POO') para tratar os datos gardados nas variables. Se temos unha fábrica de galletas, a clase Galleta sería o molde da galleta. Có molde podemos crear todas as galletas, pero o molde non é ningunha galleta en particular.
- O obxecto dunha clase (denominado instancia de clase) ven ser cada un dos datos que queremos gardar na nosa solución informática. Dentro do mesmo código temos os valores que queremos gardar e os métodos que van poder tratar ditos valores. O conxunto dos valores que temos nun obxecto nun momento determinado denomínase estado do obxecto. Seguindo o exemplo da fábrica de galletas, cada obxecto (instancia de clase) ven ser unha galleta.
- Na POO obtemos un código máis lexible e reutilizable.
- A POO é máis achegada a nosa forma de pensar. Podemos ver calquera cousa do que nos rodea e abstraer as súas propiedades para formar na nosa cabeza a idea de clase.
- Así, se vemos un coche podemos abstraer as propiedades de cor, potencia, modelo,...! Acabamos de crear unha clase !. Para esas propiedades podemos crear múltiples instancias (obxectos) que van representar coches diferentes, cada un cuns valores diferentes (estado).
- Seguindo o exemplo anterior das contas bancarias...
- Creamos unha clase ContaBancaria que teña as seguintes variables (atributos ou propiedades) e procedementos (métodos):
- Atributos: Número de conta, titular, saldo,...
- Métodos:
- ingresarCartos
- retirarCartos
- Ditos métodos non necesitan levar parámetros xa que van tratar os datos que se atopan definidos na mesma clase.
- É dicir, se eu creo un obxecto desta clase, por exemplo:
- conta1 => NumConta: 1111, Titular: 'Angel', Saldo: 4000
- Os métodos que se atopan definidos na clase poden ser utilizados polo obxecto conta1. Ditos métodos van poder acceder aos datos da clase (número de conta e saldo).
- Creamos unha clase Banco, formado por, entre outros atributos, un array de obxectos ContaBancaria. Ese array gardaría todas as contas bancarias dun banco.
- En conclusión:
- Na programación estruturado os datos e os procedementos están separados e sen relación.
- Búscase o procesamento duns datos de entrada para obter unha saída.
- A idea e buscar unha solución informática a un problema pensando no uso de procedementos e funcións como guía.
- Na POO se ten como guía aos datos.
- Primeiro defínense as clases (datos) e despois implantase os métodos (procedementos) que van facer uso destes datos.
Creando clases
- Unha clase é un molde do que despois poderemos crear obxectos.
- As variables que están definidas dentro dunha clase reciben o nome de atributos ou propiedades e as funcións que están definidas dentro dunha clase reciben o nome de métodos. Os métodos da clase son usados para manipular as súas propias propiedades.
- As clases defínense empreñando a palabra clave class seguida do nome da clase e dun bloque de código entre chaves. A sintaxe é a seguinte:
1 <?php 2 class SimpleClass 3 { 4 // propiedade 5 public $var = 'valor por defecto'; 6 7 // métodos 8 public function amosarVar() { 9 echo $this->var; 10 } 11 } 12 ?>
- O nome da clase pode comezar por unha letra ou guión baixo seguido de letras, números e guións baixos. Non se pode utilizar ningunha palabra reservada de PHP.
- Como norma, o nome dunha clase comezará cunha letra maiúscula.
- Exemplos:
- class Pelota {}
- class ContaBancaria {}
- Cada clase estará definida nun arquivo php que levará o seu nome.
- Así, por exemplo, a clase Alumno terá un arquivo de nome Alumno.class.php
- Como norma, a extensión dunha clase será .class.php.
- Se dentro dunha páxina php necesito utilizar a clase Alumno terei que poñer:
1 <?php 2 require_once('Alumno.class.php'); 3 ?>
- Nota: Lembrar as formas que vimos para incluír arquivos externos.
- No exemplo estamos a supoñer que o arquivo 'Alumno.class.php' atópase no mesmo sitio que a clase php que está a facer uso del.
- Para non ter que repetir o código anterior para cada unha das clases que necesitemos, podemos facer uso da autocarga de clases.
- Do que se trata é de que cando fagamos uso dunha clase, a páxina PHP a inclúa automaticamente sen ter que facelo nos manualmente como no exemplo anterior. Para iso podemos facer uso da...
- Exemplo:
1 <?php 2 function cargadorClases($class) { 3 require $class . '.class.php'; 4 } 5 6 spl_autoload_register('cargadorClases'); 7 8 ?>
- Liña 6: Indicamos o nome da función que vai 'cargar' as clases cando non se atopen definidas na páxina actual.
- Liñas 2-4: Definimos a función indicada no método 'spl_autoload_register'. Dita función se define cunha parámetro, que vai ser o nome da clase a cargar cando non a atope.
- No interior de dita función formamos o nome do arquivo a cargar en base ao nome da clase e o incluímos cunha das formas xa vistas anteriormente.
- Vexamos un exemplo de clase:
- Arquivo: DiscosDuros.class.php
1 <?php 2 3 class DiscosDuros { 4 public $numSerie; 5 public $capacidade=1; // en TB 6 7 public function getCapacidadeKB(){ 8 return $this->capacidade*1024*1024; 9 } 10 }
- Como vemos, temos definidos dous atributos, número de serie e capacidade. Por defecto, a capacidade de todos os obxectos que cremos desta clase será de 1TB.
- Tamén vemos a definición dun método (getCapacidadeKB) que devolve a capacidade do disco en KB. Dentro deste método sinalar o uso da variable $this.
Variable $this
- En todas as linguaxe de POO sempre imos ter unha forma de referenciar a 'instancia' actual dentro do código da clase.
- Que significa a 'instancia acutal' ?
- Cando cremos obxectos dunha clase, cada obxecto terá os seus datos.
- Así, podo crear dúas contas bancarias (dous obxectos):
- conta1
Creando obxectos
- Para crear un obxecto dunha clase usaremos este código:
1 <?php 2 3 ?>
-- Ángel D. Fernández González -- (2016).