PHP5: const vs static

W PHP5, jaka jest różnica między używaniem const i static? Kiedy każdy jest odpowiedni? A jaka rola public, protected i private grać-jeśli w ogóle.

Author: Charles, 2009-11-06

7 answers

W kontekście klasy, zmienne statyczne znajdują się w zasięgu Klasy (Nie obiektu), ale w przeciwieństwie do const, ich wartości mogą być zmieniane.

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 I private są nieistotne pod względem const (które są zawsze publiczne); są użyteczne tylko dla zmiennych klasy, włączając w to zmienną statyczną.

  • publiczne zmienne statyczne mogą być dostępne w dowolnym miejscu poprzez ClassName::$variable.
  • do chronionych zmiennych statycznych można uzyskać dostęp za pomocą klasy definiującej lub Rozszerzanie klas poprzez ClassName:: $ variable.
  • prywatne statyczne zmienne mogą być dostępne tylko przez klasę definiującą poprzez ClassName::$variable.

Edit: ważne jest, aby pamiętać, że PHP 7.1.0 wprowadził obsługę określania widoczności stałych klas.

 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/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-05 14:30:47

Ostatni punkt, który należy podkreślić, to to, że const jest zawsze statyczny i publiczny. Oznacza to, że możesz uzyskać dostęp do const z poziomu klasy w następujący sposób:

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

Spoza klasy można uzyskać do niej dostęp w następujący sposób:

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/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-04 01:57:45

Stała jest tylko stałą, tzn. nie można zmienić jej wartości po zadeklarowaniu.

Statyczna zmienna jest dostępna bez tworzenia instancji klasy i dlatego jest współdzielona między wszystkimi instancjami klasy.

Ponadto w funkcji może istnieć statyczna zmienna lokalna, która jest zadeklarowana tylko raz (przy pierwszym uruchomieniu funkcji) i może przechowywać jej wartość między wywołaniami funkcji, przykład:

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/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-07 11:12:09

Mówiąc o dziedziczeniu klas można odróżnić stałą lub zmienną w różnych zakresach za pomocą słów kluczowych self i static. Sprawdź ten przykład, który ilustruje, jak uzyskać dostęp do czego:

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

A następnie zrobić:

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

Lub:

Pirate::getType();

Wyjście:

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/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-07 13:05:59

Zadeklarowanie metody lub właściwości klasy jako statycznej sprawia, że są one dostępne bez potrzeby tworzenia instancji klasy.

Stała klasy jest taka jak stała normalna, nie może być zmieniana w czasie wykonywania. Jest to również jedyny powód, dla którego będziesz kiedykolwiek używać const.

Private, public i protected to modyfikatory dostępu, które opisują, kto może uzyskać dostęp do jakiego parametru / metody.

Public oznacza, że wszystkie inne obiekty mają dostęp. Prywatne oznacza, że tylko instancyjna Klasa dostanie dostęp. Protected oznacza, że Klasa instancyjna i klasy pochodne otrzymują dostęp.

 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/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-15 21:13:32

Więc podsumowując @ Matt świetna odpowiedź:

  • W większości sytuacji będziesz potrzebował prywatnej / chronionej właściwości statycznej, więc stałe nie są opcją.

  • Jeśli nieruchomość, której potrzebujesz, ma być publicznie dostępna, ale nie zmieniana, stała a jest właściwym wyborem.

Przykład:

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/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-17 10:36:58

Oto rzeczy, których się do tej pory nauczyłem o statycznych członach, stałych zmiennych i modyfikatorach dostępu (prywatnych,publicznych i chronionych). stała

Definicja

Jak sama nazwa mówi, wartości stałej zmiennej nie mogą być zmieniane.Stałe różnią się od normalnych zmiennych tym, że nie używa się symbolu $ do deklarowania lub używania ich.

Wartość musi być wyrażeniem stałym, a nie (na przykład) zmienną, właściwością, wynikiem operacji matematycznej lub wywołanie funkcji.

Uwaga: wartość zmiennej nie może być słowem kluczowym (np. self, parent i statyczne).

Deklarowanie stałej w php

<?php
class constantExample{

   const CONSTANT = 'constant value'; //constant

 }
?>

Zakres Constanta jest globalny i może być dostępny za pomocą słowa kluczowego 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

Definicja

Statyczne słowo kluczowe może być użyte do zadeklarowania klasy, funkcji członka lub zmiennej.Statyczne Członkowie klasy is global mogą być dostępne za pomocą słowa kluczowego self jako cóż.Deklarowanie Właściwości lub metod klasy jako statycznych czyni je dostępnymi bez potrzeby tworzenia instancji klasy. Właściwość zadeklarowana jako statyczna nie może być dostępna z instancyjnym obiektem klasy (chociaż statyczna metoda może). Jeśli nie zostanie użyta Żadna deklaracja widoczności (public, private, protected), Wtedy właściwość lub metoda będą traktowane tak, jakby została zadeklarowana jako Publiczna.Ponieważ statyczne metody można wywołać bez instancji utworzonego obiektu.

Uwaga: pseudo-zmienna $this nie jest dostępna wewnątrz metody deklarowane jako statyczne.Właściwości statyczne nie mogą być dostępne poprzez obiekt za pomocą operatora strzałki - >

Od wersji PHP 5.3.0, możliwe jest odwoływanie się do klasy przy użyciu zmiennej. Wartość zmiennej > nie może być słowem kluczowym (np. self, parent i static).

Przykład właściwości statycznych

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

?>

Dostęp do właściwości i funkcji statycznych przykład

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

 ?>

Publiczne, prywatne , protected (A. K. A access modifiers)

Zanim przeczytasz poniższą definicję, przeczytaj ten artykuł o enkapsulacji. pomoże Ci to głębiej zrozumieć to pojęcie

Link 1 wikipedia

Tutoriale wskaż link o enkapsulacji

Definicja

Używając prywatnych, publicznych, chronionych słów kluczowych możesz kontrolować dostęp do członków klasy. Członkowie klasy uznani za publicznych mogą być dostęp wszędzie. Członkowie deklarowana Ochrona może być dostępna tylko w obrębie samej klasy oraz przez klasy dziedziczone i nadrzędne. Członkowie zadeklarowani jako prywatni mogą być dostępni tylko przez klasę, która definiuje danego członka.

Przykład

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

} 
 ?> 

Dostęp do publicznych, prywatnych i chronionych członków przykład

Publiczne zmienne mogą być dostępne i modyfikowane spoza klasy albo w klasie. Ale dostęp do prywatnych i chronionych zmiennych i funkcji można uzyskać tylko z wewnątrz klasy nie można modyfikować wartości członków chronionych lub publicznych spoza klasy.

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

  ?>

Aby uzyskać więcej informacji przeczytaj dokumentację PHP o widoczności Visibility Php Doc

Bibliografia: php.net

Mam nadzieję, że zrozumiałeś tę koncepcję. Dzięki za przeczytanie:):) miłego dnia
 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/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-07 16:48:23