Plantilla:PHP/SintasixPHPOOPBase

De WikiEducator
Saltar a: navegación, buscar

OOP en PHP

  • PHP no se diseñó originalmente como un lenguaje orientado a objetos, por lo que muchas de las características de este paradigma se han ido incorporando en las últimas versiones, especialmente a partir de la versión 5.3.
  • PHP almacena el valor de un objeto como una referencia (dirección de memoria), no como una copia del valor.
  • Esto implica que, si queremos pasar un objeto a través de la red, debemos serializarlo, para que viaje también el valor del mismo y no solo la dirección de memoria (que en destino carecería de sentido). Veremos este concepto más adelante.
En PHP las clases tienen métodos y propiedades
  1. Propiedades: son los atributos o características de la clase.
  2. Métodos: representan el comportamiento de la clase.
Definir una clase en PHP
class NombreClase {
    // propiedades
    // métodos
}
  • NombreClase es un identificador válido según la siguiente expresión regular:
^[a-zA-Z_][a-zA-Z0-9_]*$
  • Se recomienda que el nombre de las clases comience con mayúscula.
  • Los nombres de las clases no son sensibles a mayúsculas/minúsculas, aunque es buena práctica tratarlos como si lo fueran.
  • Es muy recomendable guardar las clases en ficheros cuyo nombre coincida con el de la clase; esto permite la autocarga y forma parte de las buenas prácticas de programación.



Icon casestudy.gif
Ejemplo

Vamos a crear una clase llamada Fecha.

  • Atributos de la clase: dia, mes, year.
  • Método verFecha(): obtiene la fecha como una cadena de caracteres.
  • Método validarFecha(): verifica si una fecha es correcta o no.



Declaramos la clase

  • Utilizaremos siempre un fichero con el mismo nombre que la clase.
class Fecha {
 
}

Los atributos

  • Al declarar los atributos, aparece un concepto importante: la visibilidad o alcance del atributo, es decir, desde dónde puede verse o modificarse su valor.
Encapsulación
acceso a los componentes
  • Al definir tanto las propiedades como los métodos, especificamos su nivel de acceso.
  • Es una buena práctica no permitir acceso directo a los atributos, sino hacerlo a través de métodos específicos.



Icon key points.gif

Puntos clave

  • La encapsulación es uno de los pilares de la POO.
Permite o restringe la visibilidad de los componentes de una clase.



Visibilidad
  • Implementa el principio de encapsulación.
  • Permite especificar desde qué ámbito se tiene acceso a un determinado elemento.
  • Básicamente tenemos tres niveles:
  1. Desde la propia clase.
  2. Desde otras clases no relacionadas o desde el programa principal.
  3. Desde clases que extienden a otra (herencia).
  • Por tanto, existen tres tipos de visibilidad:
  1. public
  2. private
  3. protected
Icon present.gif
Tip:
  • public: tipo de visibilidad asignada por defecto a los métodos (si no se especifica).
  • En el caso de los atributos hay que declararla de forma explícita.
  • El uso de la palabra reservada var está depreciado; antes se usaba para declarar atributos públicos.


public
  • Los elementos públicos pueden ser accesibles desde cualquier ámbito en el que exista una referencia al objeto.
private
  • Los elementos con este modificador solo son accesibles desde el interior de la propia clase (ni siquiera desde clases heredadas).
  • En POO es habitual hacer todos los atributos privados y acceder a ellos mediante los métodos getter y setter.
Icon present.gif
Tip:

A un elemento private de una clase tampoco se puede acceder desde clases derivadas, pero en PHP sí se puede acceder a los atributos privados de otro objeto de la misma clase:

class A {
    private $foo;
 
    public function compara(A $b) {
        // Se puede acceder directamente al atributo privado $foo de otro objeto de la misma clase
        if ($this->foo == $b->foo) {
            return true;
        }
        return false;
    }
}


protected
  • Este tipo de visibilidad permite el acceso solo desde la propia clase y desde clases derivadas (herencia).
Siguiendo con nuestro ejemplo de Fecha, declaramos los atributos
class Fecha {
    // Declaración de atributos
    private int $dia;
    private int $mes;
    private int $year;
}

Los métodos

  • Es la forma de especificar el comportamiento de la clase: lo que el objeto sabe hacer dentro del programa.
  • Los métodos se definen usando la palabra reservada function.
  • En PHP orientado a objetos existen métodos especiales llamados #métodos mágicos, que se ejecutan automáticamente cuando ocurre un evento concreto (por ejemplo, al crear o destruir un objeto).
Métodos constructor y destructor
  • En PHP, a diferencia de Java, no podemos usar un método con el mismo nombre que la clase (desde PHP 7.4 genera error).
  • El constructor se define con el método mágico __construct() y se ejecuta automáticamente al instanciar un objeto.
  • De forma similar, el método __destruct() se ejecuta al destruir un objeto.
  • Ambos son opcionales y su invocación es transparente para el programador.
  • En __construct() podemos pasar parámetros para inicializar los atributos del objeto.
Ejemplo
construyendo nuestra clase
class Fecha {
    private int $dia;
    private int $mes;
    private int $year;
 
    public function __construct(int $d, int $m, int $y) {
        $this->dia = $d;
        $this->mes = $m;
        $this->year = $y;
    }
}
En este código aparecen dos conceptos importantes
  1. La seudovariable $this
  2. El operador de indirección ->

$this y el operador de indirección ->

  • Para acceder a los atributos o métodos de un objeto dentro de la clase usamos la seudovariable $this.
  • $this hace referencia al objeto actual (la instancia sobre la que se está ejecutando el método).
  • Si dentro de un método se omite $this->, PHP interpretará las variables como locales y no como atributos de la clase.



Icon activity.jpg
Observa el siguiente código
<?php
class Persona {  
    public $nombre;
    public $apellido;
 
    public function __construct(string $n, string $a) {
        // ERROR: asignación a variables locales, no a atributos
        $nombre = $n;
        $apellido = $a;
    }
}
 
$p = new Persona("María", "Ruiz");
echo "<h1>Nombre: $p->nombre</h1>";
echo "<h1>Apellido: $p->apellido</h1>";

  • Forma correcta:*
public function __construct(string $n, string $a) {
    $this->nombre = $n;
    $this->apellido = $a;
}





Icon key points.gif

Puntos clave

  • $this se lee como: “cuando exista una instancia de esta clase, accede al atributo o método de ese objeto”.



El operador de indirección ->
  • En PHP los objetos se manejan internamente como referencias en memoria.
  • Para acceder a sus elementos se usa el operador ->, que “indirecciona” hacia el atributo o método deseado.
  • Es la forma que tiene PHP de especificar a qué elemento concreto de un objeto se quiere acceder.

Declarando objetos: operador new

  • Permite crear instancias (objetos) en memoria.
  • Una clase describe la estructura común de un conjunto de objetos, su composición o plantilla.
  • En un programa, crearemos objetos (instancias) a partir de las clases mediante el operador new.
  • Una vez instanciado, tenemos una referencia al objeto y podemos usarlo.
  • Recordemos que cada objeto ocupa su propio espacio en memoria (con sus propios atributos y métodos).

Objetos4.png

Ejemplo en el programa principal:

require "Fecha.php";
 
$f1 = new Fecha(10, 2, 1998);

Acceso al contenido del objeto

  • Para acceder a un elemento de un objeto usamos los operadores -> o :: (este último para elementos estáticos).
Operador de indirección ->
  • Este operador permite acceder al contenido de un objeto a través de su referencia.
  • Cuando se usa dentro de la clase, suele acompañarse de $this;

cuando se usa fuera, de una variable objeto.

class Clase1 {
    public $propiedad1;
 
    public function __construct($valor) {
        // No se usa $ delante del nombre de la propiedad
        $this->propiedad1 = $valor; 
    }
}
 
$obj1 = new Clase1("verde");
$obj1->propiedad1 = "azul";