PHP5: const vs estática


En PHP5, ¿cuál es la diferencia entre usar const y static? ¿Cuándo es apropiado cada uno? Y qué papel hace public, protected y private jugar-si lo hay.

Author: Charles, 2009-11-06

7 answers

En el contexto de una clase, las variables estáticas están en el ámbito de la clase (no en el ámbito del objeto), pero a diferencia de una const, sus valores se pueden cambiar.

class ClassName {
    static $my_var = 10;  /* defaults to public unless otherwise specified */
    const MY_CONST = 5;
}
echo ClassName::$my_var;   // returns 10
echo ClassName::MY_CONST;  // returns 5
ClassName::$my_var = 20;   // now equals 20
ClassName::MY_CONST = 20;  // error! won't work.

Public, protected y private son irrelevantes en términos de conss (que siempre son públicos); solo son útiles para variables de clase, incluida la variable estática.

  • se puede acceder a las variables estáticas públicas en cualquier lugar a través de className:: variable variable.
  • las variables estáticas protegidas pueden ser accedidas por la clase definidora o extendiendo clases a través de className:: variable variable.
  • las variables estáticas privadas solo pueden ser accedidas por la clase definidora a través de className:: variable variable.

Editar: Es importante notar que PHP 7.1.0 introdujo soporte para especificar la visibilidad de las constantes de clase.

 163
Author: Matt Huggins,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-05 14:30:47

Un último punto que debe hacerse es que una const es siempre estática y pública. Esto significa que puede acceder a la const desde dentro de la clase de la siguiente manera:

class MyClass
{
     const MYCONST = true;
     public function test()
     {
          echo self::MYCONST;
     }
}

Desde fuera de la clase se accedería así:

echo MyClass::MYCONST;
 16
Author: luoshiben,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-03-04 01:57:45

Constant es solo una constante, es decir, no se puede cambiar su valor después de declarar.

La variable estática es accesible sin hacer una instancia de una clase y, por lo tanto, compartida entre todas las instancias de una clase.

Además, puede haber una variable local estática en una función que se declara solo una vez (en la primera ejecución de una función) y puede almacenar su valor entre llamadas a funciones, ejemplo:

function foo()
{
   static $numOfCalls = 0;
   $numOfCalls++;
   print("this function has been executed " . $numOfCalls . " times");
}
 9
Author: Mike Borozdin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-08-07 11:12:09

Cuando se habla de herencia de clases se puede diferenciar entre la constante o variable en diferentes ámbitos mediante el uso de self y static palabras clave. Compruebe este ejemplo que ilustra cómo acceder a qué:

class Person
{
    static $type = 'person';

    const TYPE = 'person';

    static public function getType(){
        var_dump(self::TYPE);
        var_dump(static::TYPE);

        var_dump(self::$type);
        var_dump(static::$type);
    }
}

class Pirate extends Person
{
    static $type = 'pirate';

    const TYPE = 'pirate';
}

Y luego hacer:

$pirate = new Pirate();
$pirate::getType();

O:

Pirate::getType();

Salida:

string(6) "person" 
string(6) "pirate" 
string(6) "person" 
string(6) "pirate"
 3
Author: Wilt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-08-07 13:05:59

Declarar un método o propiedad de clase como estático los hace accesibles sin necesidad de una instanciación de la clase.

Una constante de clase es igual que una constante normal, no se puede cambiar en tiempo de ejecución. Esta es también la única razón por la que siempre usará const.

Privado, público y protegido son modificadores de acceso que describen quién puede acceder a qué parámetro/método.

Public significa que todos los demás objetos tienen acceso. Privado significa que solo la clase instanciada tiene acceso. Protegido significa que la clase instanciada y las clases derivadas obtienen acceso.

 3
Author: alexn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-04-15 21:13:32

Así que para recapitular en @ Matt gran respuesta:

  • En la mayoría de las situaciones, necesitará una propiedad Estática Privada / Protegida para que las constantes no sean una opción.

  • Si la propiedad que necesita está destinada a estar disponible públicamente pero no cambiada, la constante a es la elección adecuada.

Ejemplo:

class User{
    private static $PASSWORD_SALT = "ASD!@~#asd1";
    ...
}

class Product{
    const INTEREST = 0.10;
    ...
}
 2
Author: d.raev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-12-17 10:36:58

Estas son las cosas que he aprendido hasta ahora sobre miembros estáticos , variables constantes y modificadores de acceso(privados,públicos y protegidos). Constante

Definición

Como dice el nombre, los valores de una variable constante no se pueden cambiar.Las constantes difieren de las variables normales en que no se usa el símbolo $ para declararlas o usarlas.

El valor debe ser una expresión constante, no (por ejemplo) una variable, una propiedad, un resultado de una operación matemática, o una llamada a una función.

Nota: El valor de la variable no puede ser una palabra clave (por ejemplo, self, parent y estática).

Declarando una constante en php

<?php
class constantExample{

   const CONSTANT = 'constant value'; //constant

 }
?>

El alcance de Constant es global y se puede acceder usando una palabra clave self

<?php
class MyClass
{
    const CONSTANT = 'constant value';

    function showConstant() {
        echo  self::CONSTANT . "\n";
    }
}

echo MyClass::CONSTANT . "\n";

$classname = "MyClass";
echo $classname::CONSTANT . "\n"; // As of PHP 5.3.0

$class = new MyClass();
$class->showConstant();

echo $class::CONSTANT."\n"; // As of PHP 5.3.0

?>

Static

Definición

La palabra clave estática se puede usar para declarar una clase, una función miembro o una variable.Se puede acceder a los miembros estáticos de una clase global usando una palabra clave self como bien.Declarar propiedades o métodos de clase como estáticos los hace accesibles sin necesidad de una instanciación de la clase. Una propiedad declarada como estática no se puede acceder con un objeto de clase instanciado (aunque un método estático sí). Si no se utiliza ninguna declaración de visibilidad (pública, privada, protegida), entonces la propiedad o método se tratará como si hubiera sido declarada como pública.Porque los métodos estáticos son llamables sin una instancia del objeto creado.

Nota : el pseudo-variable this esto no está disponible dentro del método declarado como static.No se puede acceder a las propiedades estáticas a través del objeto usando el operador arrow - >

A partir de PHP 5.3.0, es posible hacer referencia a la clase usando una variable. El valor de la variable >no puede ser una palabra clave (por ejemplo, self, parent y static).

Ejemplo de propiedad estática

<?php
class Foo
{
    public static $my_static = 'foo'; //static variable 

    public static function staticValue() { //static function example
        return self::$my_static;  //return the static variable declared globally
    }
}

?>

Acceso a propiedades y funciones estáticas ejemplo

 <?php
     print Foo::$my_static . "\n";

    $foo = new Foo();
    print $foo->staticValue() . "\n";
    print $foo->my_static . "\n";      // Undefined "Property" my_static 

    print $foo::$my_static . "\n";
    $classname = 'Foo';
    print $classname::$my_static . "\n"; // As of PHP 5.3.0

    print Bar::$my_static . "\n";
    $bar = new Bar();
    print $bar->fooStatic() . "\n";

 ?>

Público, privado , protegido (A. K. A modificadores de acceso)

Antes de leer la definición a continuación , lea este artículo sobre Encapsulación. Le ayudará a comprender el concepto más profundamente

Enlace 1 wikipedia

Tutoriales punto enlace sobre encapsulación

Definición

Usando palabras clave privadas , públicas y protegidas puede controlar el acceso a los miembros de una clase. Se puede acceder a los miembros de la clase declarados públicos en todas partes. Miembro se puede acceder a la protección declarada solo dentro de la propia clase y por clases heredadas y principales. Los miembros declarados como privados solo pueden ser accedidos por la clase que define al miembro.

Ejemplo

 <?php 
class Example{
 public $variable = 'value'; // variable declared as public 
 protected $variable = 'value' //variable declared as protected
 private $variable = 'value'  //variable declared as private

 public function functionName() {  //public function
 //statements
 }

 protected function functionName() {  //protected function
 //statements
 }
  private function functionName() {  //private function
   //statements
   }

} 
 ?> 

Acceso a los miembros públicos, privados y protegidos ejemplo

Las variables públicas se pueden acceder y modificar desde fuera de la clase o dentro de la clase. Pero puede acceder a las variables y funciones privadas y protegidas solo desde dentro de la clase , no puede modificar el valor de los miembros protegidos o públicos fuera de la clase.

  <?php 
  class Example{
    public $pbVariable = 'value'; 
    protected $protVariable = 'value'; 
    private $privVariable = 'value';
    public function publicFun(){

     echo $this->$pbVariable;  //public variable 
     echo $this->$protVariable;  //protected variable
     echo $this->privVariable; //private variable
    }

   private function PrivateFun(){

 //some statements
  }
  protected function ProtectedFun(){

 //some statements
  }

  }


 $inst = new Example();
 $inst->pbVariable = 'AnotherVariable'; //public variable modifed from outside
 echo $inst->pbVariable;   //print the value of the public variable

 $inst->protVariable = 'var'; //you can't do this with protected variable
 echo $inst->privVariable; // This statement won't work , because variable is limited to private

 $inst->publicFun(); // this will print the values inside the function, Because the function is declared as a public function

 $inst->PrivateFun();   //this one won't work (private)
 $inst->ProtectedFun();  //this one won't work as well (protected)

  ?>

Para obtener más información, lea esta documentación de php sobre visibilidad Visibilidad Php Doc

Referencias : php.net

Espero que hayas entendido el concepto. Gracias por leer :) :) Tener una buena

 2
Author: Jijo John,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-08-07 16:48:23