PHP: cuándo usar propiedades estáticas privadas en la clase

Resuelto Leff asked hace 54 años • 2 respuestas

Estoy aprendiendo PHP y todavía hay muchas áreas que no me quedan claras en el idioma. Me pregunto cuándo y por qué lo usaríamos private static propertiesdentro de la clase. Por lo que entendí, solo la clase donde se definió puede acceder a las propiedades privadas. Entonces, la parte privada está clara, pero la estática aún no está clara. En los documentos dice:

Declarar propiedades o métodos de clase como estáticos los hace accesibles sin necesidad de crear una instancia de la clase. No se puede acceder a una propiedad declarada como estática con un objeto de clase instanciado (aunque sí se puede acceder a un método estático).

¿Eso significa que puedo acceder a propiedades estáticas sin crear instancias de la clase? Así por ejemplo:

class Foo{

    static $bar;

    public function __construct($bar){
        $this->bar = $bar;
    }

Entonces, ¿puedo acceder a la propiedad $bar de la clase así?

Foo::$bar

Pero, si hago esto, ¿no funcionaría?

$foo = new Foo();
$foo::$bar

Y luego, si creamos una propiedad, ¿ private staticpor qué razón lo haríamos? Ya que pensé que las haríamos estáticas para poder acceder a ellas fuera de su clase y hacerlas privadas haría eso imposible. Estaría muy agradecido si alguien pudiera aclararme esto.

Leff avatar Jan 01 '70 08:01 Leff
Aceptado

Cuando declaras una propiedad normal, hay un valor diferente de esa propiedad para cada instancia que creas de esa clase (cada objeto que creas con new Foo). Para una propiedad estática, hay una copia de esa variable para toda la clase.

Esto es independiente de la visibilidad de esa variable: una propiedad estática pública existe una vez por clase y se puede acceder a ella desde cualquier lugar; una propiedad estática privada existe una vez por clase, pero solo se puede acceder a ella desde dentro de la definición de esa clase.

Como ejemplo simple, podría tener un contador que le diera a cada instancia de la clase un número único. No necesita código fuera de la clase para ver o cambiar este contador, por lo que lo marca como privado, pero debe compartirse entre todas las instancias, por lo que lo marca como estático.

class Foo {
    // Static counter; shared with every instance
    private static $nextID=0;

    // Normal instance property: each instance will have its own value
    private $myID;

    public function __construct() {
        // Set the ID for this instance to the next ID
        $this->myID = self::$nextID;
        // Increment the shared counter
        self::$nextID++;
    }
}
IMSoP avatar Mar 30 '2017 10:03 IMSoP

El contexto estático dentro de una clase PHP (pero fuera de una función) es un contexto que existe estáticamente, es decir, sin la necesidad de una instancia de respaldo de un objeto.

Ejemplo:

class A {
     public $a = 1;
     public static $b = 2;

     public function instanceFunction() {
           A::$a; //Wrong way
           $this->a //Right way
           A::$b; //Works
           self::$b; // Also works
           static::$b; // Also also works
     }
     public static function staticFunction() {
           A::$a; //Does not work
           $this->a //Error $this within static context 
           A::$b; //Works
           self::$b; // Also works
           static::$b; // Also also works
     }

}

A::$a; // Error $a is not static so it needs an instance of an object
A::$b; // Works
$Aobject=new A();
$Aobject->a; //Works 
$Aobject->b // Does not work 

Usar selfsignifica "consultar la clase en la que escribí esto", por ejemplo, en este caso siempre es A. Usar staticsignifica "consulte la clase desde la que llamé a esto", lo cual se aplica si se trata de herencia estática y PHP logra lograrlo.

apokryfos avatar Mar 30 '2017 10:03 apokryfos