PHP 5: const vs statico


Risposte:


187

Nel contesto di una classe, le variabili statiche si trovano nell'ambito della classe (non dell'oggetto), ma a differenza di una const, i loro valori possono essere modificati.

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.

Pubblico, protetto e privato sono irrilevanti in termini di costi (che sono sempre pubblici); sono utili solo per le variabili di classe, compresa la variabile statica.

  • le variabili statiche pubbliche sono accessibili ovunque tramite ClassName :: $ variabile.
  • le variabili statiche protette sono accessibili dalla classe di definizione o estendendo le classi tramite la variabile ClassName :: $.
  • le variabili statiche private sono accessibili solo dalla classe che definisce tramite ClassName :: $ variabile.

Modifica: è importante notare che PHP 7.1.0 ha introdotto il supporto per specificare la visibilità delle costanti di classe .


27
Preferisco usare self::$variableper le variabili statiche private e statiche protette poiché preferisco mantenere il nome della classe menzionato solo una volta dentro di sé, che è all'inizio della classe.
Lukman,

3
Sì, buon punto, ho trascurato di menzionare che la parola chiave self può essere utilizzata se si fa riferimento all'interno della classe stessa. Gli esempi che ho fornito sopra sono stati eseguiti al di fuori della definizione della classe, nel qual caso è necessario utilizzare il nome della classe.
Matt Huggins,

Ottima risposta, molto vicina all'accettazione. Potresti chiarire un punto: "Pubblico, protetto e privato sono irrilevanti in termini di costi" - Perché? I cons per impostazione predefinita sono tutti pubblici? tutto privato?
Chris Jacob,

1
un var statico non ha bisogno di un $? static $my_var = 10;nella definizione
Daniel W.

Vecchio thread, ma vorrei aggiungere qualcosa: dai un'occhiata a php.net/manual/en/… , che spiega le staticvariabili sono molto utili anche nei singoli e nelle funzioni ricorsive. Perché PUOI cambiare il valore ma la variabile verrà inizializzata una sola volta. Vedi stackoverflow.com/questions/203336/… per ulteriori spiegazioni su come creare un singleton. Per me quelle sono alcune situazioni in cui preferisco le variabili statiche.
Erik van de Ven,

20

Un ultimo punto da sottolineare è che una const è sempre statica e pubblica. Ciò significa che puoi accedere alla const dall'interno della classe in questo modo:

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

Dall'esterno della classe accederesti in questo modo:

echo MyClass::MYCONST;

1
quella dichiarazione è vera? che "const è sempre statico e pubblico"?
apil.tamang,

7
Questo non è più vero. A partire da PHP 7.1 le costanti di classe possono essere dichiarate private o protette. Vedi RFC
DisgruntledGoat

11

Costante è solo una costante, ovvero non è possibile modificarne il valore dopo aver dichiarato.

La variabile statica è accessibile senza creare un'istanza di una classe e quindi condivisa tra tutte le istanze di una classe.

Inoltre, in una funzione può essere presente una variabile locale statica che viene dichiarata una sola volta (alla prima esecuzione di una funzione) e può memorizzare il suo valore tra chiamate di funzione, ad esempio:

function foo()
{
   static $numOfCalls = 0;
   $numOfCalls++;
   print("this function has been executed " . $numOfCalls . " times");
}

7

Quando si parla dell'ereditarietà delle classi, è possibile distinguere tra la costante o la variabile in ambiti diversi utilizzando selfe staticle parole chiave. Controlla questo esempio che illustra come accedere a cosa:

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';
}

E poi fai:

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

o:

Pirate::getType();

Produzione:

string(6) "person" 
string(6) "pirate" 
string(6) "person" 
string(6) "pirate"

In altre parole, si self::riferisce alla proprietà statica e costante dallo stesso ambito in cui viene chiamata (in questo caso la Personsuperclasse), mentre static::accederà alla proprietà e alla costante dall'ambito in fase di esecuzione (quindi in questo caso nella Piratesottoclasse).

Maggiori informazioni sull'associazione statica tardiva qui su php.net .
Controlla anche la risposta su un'altra domanda qui e qui .


4

La dichiarazione di un metodo o di una proprietà di classe come statica li rende accessibili senza che sia necessaria un'istanza della classe.

Una costante di classe è proprio come una costante normale, non può essere modificata in fase di esecuzione. Questa è anche l'unica ragione per cui userai mai const.

Privato, pubblico e protetto sono modificatori di accesso che descrivono chi può accedere a quale parametro / metodo.

Pubblico significa che tutti gli altri oggetti hanno accesso. Privato significa che solo la classe istanziata ha accesso. Protetto significa che la classe istanziata e le classi derivate ottengono l'accesso.


2

Ecco le cose che ho imparato finora su membri statici, variabili costanti e modificatori di accesso (privati, pubblici e protetti). Costante

Definizione

Come dice il nome, i valori di una variabile costante non possono essere modificati. Le costanti differiscono dalle variabili normali in quanto non si utilizza il simbolo $ per dichiararle o usarle.

Il valore deve essere un'espressione costante, non (ad esempio) una variabile, una proprietà, il risultato di un'operazione matematica o una chiamata di funzione.

Nota: il valore della variabile non può essere una parola chiave (ad es. Self, parent e static).

Dichiarando una costante in php

<?php
class constantExample{

   const CONSTANT = 'constant value'; //constant

 }
?>

L'ambito di Constant è globale e è possibile accedervi utilizzando una parola chiave 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

?>

Statico

Definizione

La parola chiave statica può essere utilizzata per dichiarare una classe, una funzione membro o una variabile. È possibile accedere anche ai membri statici di una classe globale usando una parola chiave self. Dichiarare proprietà o metodi della classe come statici li rende accessibili senza bisogno di un'istanza della classe . Non è possibile accedere a una proprietà dichiarata come statica con un oggetto classe istanziato (anche se un metodo statico può). Se non viene utilizzata alcuna dichiarazione di visibilità (pubblica, privata, protetta), la proprietà o il metodo verranno trattati come se fossero stati dichiarati pubblici, poiché i metodi statici sono richiamabili senza un'istanza dell'oggetto creato.

Nota: la pseudo-variabile $ this non è disponibile all'interno del metodo dichiarato come static.Non è possibile accedere alle proprietà statiche tramite l'oggetto usando l'operatore freccia ->

A partire da PHP 5.3.0, è possibile fare riferimento alla classe usando una variabile. Il valore della variabile> non può essere una parola chiave (ad es. Self, parent e static).

Esempio di proprietà statica

<?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
    }
}

?>

Accesso ad esempio di proprietà statiche e funzioni

 <?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";

 ?>

Pubblico, privato, protetto (modificatori di accesso AKA)

Prima di leggere la definizione di seguito, leggi questo articolo sull'incapsulamento. Ti aiuterà a comprendere il concetto più profondamente

Link 1 Wikipedia

Link puntuale alle esercitazioni sull'incapsulamento

Definizione

Utilizzando parole chiave private, pubbliche e protette puoi controllare l'accesso ai membri di una classe. I membri della classe dichiarati pubblici sono accessibili ovunque. I membri dichiarati protetti sono accessibili solo all'interno della classe stessa e dalle classi ereditate e parent. I membri dichiarati come privati ​​possono accedere solo alla classe che definisce il membro.

Esempio

 <?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
   }

} 
 ?> 

Accesso all'esempio di membri pubblici, privati ​​e protetti

È possibile accedere e modificare le variabili pubbliche all'esterno della classe o all'interno della classe. Ma puoi accedere alle variabili e funzioni private e protette solo dall'interno della classe, non puoi modificare il valore dei membri protetti o pubblici al di fuori della classe.

  <?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)

  ?>

Per maggiori informazioni leggi questa documentazione php sulla visibilità Visibilità Php Doc

Riferimenti: php.net

Spero tu abbia capito il concetto. Grazie per la lettura :) :) Buona


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.