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 public, private o 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 o 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 user, password, base 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 public, protected o 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.