05. Modificadores de Acceso, Métodos Mágicos e Interfaces

Los métodos y atributos de las clases pueden tener diferentes niveles de acceso, o modificadores de acceso, los cuales pueden ser:

  • Públicos
  • Privados
  • Protegidos

Y adicionalmente a estos 3, los podemos volver o no estáticos.

Modificadores públicos

Los modificadores públicos, como su nombre lo dicen, van a poder ser accedidos desde cualquier parte de la aplicación, sin restricción. Se definen anteponiendo la palabra reservada public, de la siguiente manera:

Ejm

<?php
class nombreClase {
    public $un_atributo_publico;
    public function un_metodo_publico(){};
}
?>

El atributo y método creados en el ejm de arriba son accedidos desde cualquier parte de la aplicación.

Modificadores privados

Los métodos y atributos privados se definen anteponiendo la palabra clave private, y sólo podrán ser accedidos por la clase que los ha definido, es decir, ni siquiera se puede utilizar un atributo o método privado por un objeto que haya sido instanciado. Si quisiéramos acceder a una característica o un método privado desde un objeto, tendríamos que hacer desde la misma clase un método público que llamase a ese atributo o método privado, es decir, que éste mandara a su vez llamar al recurso privado.

Ejm

<?php
class nombreClase {
    private $un_atributo_privado;
    private function un_metodo_privado(){};
}
?>

Modificadores protegidos

Este nivel de acceso se define anteponiendo la palabra reservada protected al nombre del atributo o método. Pueden ser accedidos por la propia clase que los definió, así como por las clases que la heredan, pero no desde otras partes de la aplicación.

Ejm

<?php
class nombreClase {
  protected $un_atributo_protegido;
  protected function un_metodo_protegido(){};
}
?>

Modificadores estáticos

Se definen anteponiendo la palabra clave static al nombre del atributo o método. Pueden ser accedidos sin necesidad de instanciar un objeto, es decir, se pueden invocar automáticamente, y su valor es estático, es decir, no pueden variar ni ser modificados.

Ejm

<?php
class nombreClase {
    public static $un_atributo_estatico;
    public static function un_metodo_estatico(){};
}
?>

Como se puede poner, además de la palabra reservada static, le tenemos que dar un nivel de acceso con las palabras publicprivate protected.  Podemos decir que un atributo estático es como una constante, no puede variar su valor, por ejm, podemos definir como atributo estático el valor de PI, que sabemos que no cambia.

Acceso a los objetos

Dependiendo de donde estemos invocando los métodos de una clase, va a ser la manera en que nosotros podremos acceder a dichos objetos. Para acceder a los métodos y atributos de un objeto, existen diferentes maneras de hacerlo, todas ellas dependen del ámbito desde el cual se invoquen, así como de su condición y visibilidad.

  • Dentro de una clase
  • Fuera de una clase

Generalmente nos vamos a ayudar del operador flecha (->).

1. Dentro de la clase y los recursos no son estáticos

Dentro de la clase y si no es estático, podemos utilizar la pseudo-variable $this para acceder a los objetos, siendo ésta una referencia al objeto mismo. La sintaxis sería la siguiente.

Ejm

<?php
class NombreClase {
    $this->atributo;
    $this->metodo();
}
?>

2. Dentro de la clase y los recursos son estáticos

En este caso se accede mediante el operador de resolución de ámbito, que se hace con los dobles dos puntos (::) anteponiendo la palabra clave self parent, según se trate de una propiedad de la misma clase o de otra heredada.

Ejm

<?php
class NombreClase {
    self::atributo_estatico_de_esta_clase;
    parent::atributo_estatico_de_clase_padre;
   
    self::metodo_estatico_de_esta_clase();
    parent::metodo_estatico_de_clase_madre();
}
?>

3. Fuera de la clase y no siendo estáticos

Se necesita instanciar un objeto de la clase y sólo se pueden acceder a métodos y atributos públicos. La sintaxis sería.

Ejm

<?php
$objeto = new Clase();

$objeto->un_atributo_publico;
$objeto->un_metodo_publico();
?>

4. Fuera de la clase y siendo estático

En este caso no es necesario instanciar la clase, y sólo se pueden acceder a métodos y atributos públicos. Veamos su sintaxis.

Ejm

<?php
Clase::atributo_publico;
Clase::metodo_publico();
?>

Constantes

Las constantes mantienen su valor de forma permanente y sin cambios, es decir, no va a tener cambios durante el flujo de la aplicación. A diferencia de las propiedades estáticas, las constantes sólo pueden tener una visibilidad pública. Veamos su sintaxis.

Ejm

<?php
const MI_CONSTANTE = "Valor de constante que no cambiará";
?>

Por ejm, valores de constantes pueden ser los valores del userpasswordbase de datos… del acceso a una base de datos, que prácticamente no van a variar. También es válido crear constantes con la función define(), la cual recibe dos parámetros, el nombre de la constante y su valor. Estando dentro de una clase es más conveniente utilizar la palabra reservada const, no utilizar la función define(). Es mejor utilizar la función define() cuando se trabaje con programación estructurada o cuando definamos constantes que estén fuera de clases.

Ejm

define("CONSTANTE", "Hola Mundo");
echo CONSTANTE;

Métodos mágicos

PHP tiene lo que se denominan métodos mágicos, que no son más que funciones específicas y predefinidas de PHP. Uno de ellos es el método constructor, que lo encontraremos prácticamente en cualquier lenguaje de programación, donde se dan los métodos constructores y destructores. Un constructor es la función que va a inicializar la clase, es decir, cuando instanciamos la clase mediante un objeto, el constructor es el que de manera automática va a instanciar el objeto, es decir, si necesitamos definir o declarar ciertas instrucciones de código para ciertas rutinas que se tengan que ejecutar cuando el programador inicialice un objeto de la clase que se esté programando, esto se realiza mediante el método constructor. Toda la lógica de programación que queramos suceda cuando instanciemos a esa clase la incluimos en el constructor. Su sintaxis sería la siguiente.

Ejm

<?php 
class MiClase {
     function __construct(){     }
 } 
?>

Al constructor no le podemos poner modificadores de acceso (no se pueden utilizar las palabras publicprotected private) porque por definición los constructores van a ser públicos.

De la misma manera que tenemos una función constructora, tenemos una función destructora. El destructor es el encargado de liberar de la memoria al objeto cuando ya no es referenciado. Se puede aprovechar este método para realizar otras tareas que se estimen necesarias al momento de destruir un objeto.

Ejm

<?php
class MiClase {
    function __destruct(){
    }
}
?>

Otros métodos mágicos

Además de estos dos métodos mágicos, tenemos otros, como son:

  • __call
  • __callStatic
  • __get
  • __set
  • __isset
  • __unset
  • __sleep
  • __wakeup
  • __toString
  • __invoke
  • __set_state
  • __clone

Podemos encontrar toda la información acerca de estos métodos mágicos en su página oficial.

Herencia múltiple – Interfaces

Las interfaces son un conjunto de métodos característicos de diversas clases, independientemente de la relación que dichas clases mantengan entre sí. Una misma clase puede implementar múltiples interfaces.

Las interfaces se definen utilizando la palabra clave interface, y se emplean utilizando la palabra clave implements.

Ejm

<?php
interface InterfaceA {
    public function metodo_publico();
}

interface InterfaceB {
    public function otro_metodo_publico();
}

class nombreClase  implements InterfaceA, InterfaceB {
 /*
    ESTA CLASE IMPLEMENTA TODOS LOS MÉTODOS DE LAS INTERFACES INVOCADAS
 */
}
?>

Las interfaces no van a poder tener atributos, sólo tienen métodos, pero únicamente la definición de métodos, no pueden tener código dentro de ellos. Los métodos no tienen cuerpo. Los métodos de dichas interfaces se van a implementar en otra clase. Esto es muy parecido a lo que vimos de las clases abstractas, donde en sus métodos solo podían tener la definición de los métodos, pero la diferencia es que las interfaces no son clases, las cuales representan la abstracción de un objeto siguiendo un orden de relación jerárquica entre ellas.

Las interfaces son sólo un conjunto de métodos característicos de diversas clases, independientemente de la relación que dichas clases tengan entre sí. Un misma clase puede implementar múltiples interfaces.

Características de las interfaces

Estas son las características principales de las interfaces:

  • No pueden tener el mismo nombre que una clase.
  • No pueden instanciarse porque no tienen referencias asociadas a objetos.
  • No pueden definir propiedades, sólamente se pueden definir métodos.
  • Los métodos de una interfaz han de ser públicos, sólo estar definidos y no tener cuerpo.
  • Las clases que implementan una interfaz deben implementar todos los métodos de dicha interfaz.
  • Diferentes interfaces no pueden tener nombres de métodos idénticos si son implementadas por una misma clase.
Scroll al inicio