Funciones Estáticas de las Classes PHP

Funciones Estáticas de las Classes PHP

Sin valoraciones

Aprende qué son las Funciones estáticas de las classes de php y cómo utilizarlas


Ya hemos visto que para acceder a un método (o función) de una clase de php primero debemos inicializarla a través de un objeto.

A veces, estas acciones resultan un poco tediosas de escribir porque para acceder al resultado esperado deberíamos escribir más de una línea de código y ésto se podría simplificar. Y, sí. Se simplifica a través de las funciones estáticas.


¿Qué son las funciones estáticas?

Las funciones estáticas de las classes de php son funciones o métodos que no necesitan tener inicializado un objeto para poder acceder a ellas.

Es decir, sin tener que crear un new Animal() podremos a acceder a las funciones que estén definidas como estáticas de Animal.


¿Para qué sirven las funciones estáticas?

La principal razón de usar Classes y crear objetos a través de éstas es poder mantener una integridad en el objeto y poder manejar sus datos y comportamientos de la manera más óptima.

Si pusiéramos todas la funciones o métodos en public y dejáramos que cualquier archivo php tenga acceso a esas acciones podríamos tener muchas controversias dentro del mismo proyecto. Así que lo mejor es siempre intentar que todas las acciones que modifiquen las propiedades del objeto sean privadas o protegidas.

Además, cuando hagamos una acción en concreto, sobretodo cuando esta dependa de otras acciones en cadena, queremos controlarlo y asegurarnos que esto ocurra como tiene que ser.

Pongamos un ejemplo: Imaginemos que tenemos una class User. Donde tenemos la contraseña, la fecha de actualización de ésta, el mail y el nombre.

Si quiesiéramos cambiar la contraseña haríamos una cosa similar a ésta:

class User {
    public $name;
    public $email;
    private $passwd;
    private $passwd_date_upd;
    
    public function __construct($email)
    {
        $this->email = $email;
        $this->getData();
    }
    
    private function getData()
    {
        // cargamos los datos desde la base
        // de datos a través del $this->email
        $this->name = ...
        $this->passwd = ...
        $this->passwd_date_upd = ...
    }
    
    private function updatePswd(string $passwd)
    {
        $this->passwd = $passwd;
    }
    
    private function updateDateUpd()
    {
        $this->passwd_date_upd = now();
    }
    
    private function checkPasswd(string $passwd)
    {
        return $this->passwd == $passwd;
    }
    
    public static function updateUserPasswd(
        string $email,
        string $passwd_old,
        string $passwd_new,
        bool $returnString
    ) {
        // Cargamos el usuario
        $user = new User($email);
        
        // Si el passwd actual es correcto, actualizamos
        if ($user->checkPasswd($passwd_old)) {
            $user->updatePswd($passwd_new);
            $user->updateDateUpd();
            return $returnString ?
                'Contraseña actualizada' :
                true;
        }
        return $returnString ?
            'La contraseña actual no es correcta' :
            false;
    }
}

Lo que hemos hecho en esta clase es definir como métodos privados el checkPswd(), updatePswd() y el updateDateUpd(). Para que estos datos sólo se puedan acceder desde dentro de la misma classe y asegurarnos que no hay nada dentro del proyecto que pueda darnos datos erróneos.

Una vez lo tenemos securizado, si queremos modificar la contraseña desde fuera de la clase, hemos creado un método estático que es público dónde le pasamos un $email (para construir el User), el $passwd_old (para comprobar que la contraseña actual es correcta), el $passwd_new (para poner la nueva contraseña) y un booleano para devolver true/false o texto.

Una vez creamos el $user dentro del método estático, como estamos escribiendo la función dentro de la clase, podremos acceder a las propiedades privadas. Y, además, como el paswd sólo se puede modificar desde dentro de la clase, nos aseguramos que, una vez esté checkeado, hagamos la función updateDateUpd() para que se modifique la fecha.

Ahora imaginemos que todos los métodos son públicos y desde fuera de la clase podemos acceder a la función de updatePasswd(string $passwd). Correríamos el riesgo que no se hagan todos los pasos que la clase tiene definidos:

Comprobar contraseña > Actualizar Contraseña > Actualizar Fecha de la Contraseña


¿Cómo se utilizan las funciones estáticas?

A diferencia de una función o método estándar, las funciones estáticas se usan con dobles punto doble :: en vez de ->. Primero se invoca la classe y luego se indica qué propiedad o método estático queremos acceder.

Siguiendo con el ejemplo anterior, para cambiar la contraseña de un usuario haríamos lo siguiente:

User::updateUserPasswd('test@email.com', 'ContraseñaAntigua', 'ContraseñaNueva', true);


Valoración de la Información

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *