TOC

This article is currently in the process of being translated into Spanish (~99% done).

Classes:

Static classes

Debido a que una clase puede ser instanciada más de una vez, los valores que contiene, son únicos a la instancia/objeto y no a la clase misma. Esto también significa que no es posible utilizar métodos o variables en una clase sin instanciarla primero, pero hay una excepción a esta regla. Tanto variables como métodos de una clase pueden ser declarados como estáticos (también llamados "compartidos" en algunos lenguajes de programación), lo cual significa que pueden ser utilizados sin instanciar la clase primero. Esto significa que una variable de clase puede ser accedida sin una instancia específica, también significa que solo habrá una versión de esta variable. Otra consecuencia es que un método estático no puede acceder a variables y métodos no estáticos, ya que estos requieren de una instancia de la clase.

En un capítulo previo, escribimos una clase Usuario. Expandámosla con alguna funcionalidad estática, para ver de que pelo (sic) trata todo esto.

<?php
class User
{
    public $name;
    public $age;
    public static $minimumPasswordLength = 6;
    
    public function Describe()
    {
        return $this->name . " is " . $this->age . " years old";
    }
    
    public static function ValidatePassword($password)
    {
        if(strlen($password) >= self::$minimumPasswordLength)
            return true;
        else
            return false;
    }
}

$password = "test";
if(User::ValidatePassword($password))
    echo "Password is valid!";
else
    echo "Password is NOT valid!";
?>

Lo que le hemos hecho a la clase, es agregar una única variable estática, la $minimumPasswordLength (Longitud de contraseña mínima) que establecemos a 6, y luego agregamos una función estática para validar si una contraseña dada es o no válida. Admito que la validación que se realiza aquí es muy limitada, pero obviamente puede ser ampliada. Ahora, ¿no podríamos hacer esto solo con una variable y una función regulares en la clase? Claro que podríamos, pero simplemente tiene más sentido hacerlo estáticamente, ya que no usamos información específica de un usuario - la funcionalidad es general, entonces no hay necesidad de tener que instanciar la clase para usarla.

Como puede ver, para acceder a nuestra variable estática desde nuestro método estático, la prefijamos con la palabra clave self, lo cual es como this pero para acceder a miembros y constantes estáticas. También notará que acceder a miembros estáticos requiere el operador dos puntos en lugar del operador ->, pero además de eso, es básicamente lo mismo.


This article has been fully translated into the following languages: Is your preferred language not on the list? Click here to help us translate this article into your language!