W kontekście klasy zmienne statyczne znajdują się w zakresie klasy (nie obiektu), ale w przeciwieństwie do stałej, ich wartości można zmieniać.
classClassName{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 5ClassName::$my_var =20;// now equals 20ClassName::MY_CONST =20;// error! won't work.
Publiczne, chronione i prywatne nie mają znaczenia w kategoriach stałych (które są zawsze publiczne); są użyteczne tylko dla zmiennych klas, w tym zmiennych statycznych.
publiczne zmienne statyczne są dostępne w dowolnym miejscu poprzez ClassName :: $ variable.
Dostęp do chronionych zmiennych statycznych można uzyskać za pomocą klasy definiującej lub klas rozszerzających za pośrednictwem zmiennej ClassName :: $.
Dostęp do prywatnych zmiennych statycznych można uzyskać tylko przez klasę definiującą za pośrednictwem ClassName :: $ variable.
Wolę używać self::$variabledla chronionych statycznych i prywatnych zmiennych statycznych, ponieważ wolę zachować nazwę klasy wymienioną tylko raz w sobie, czyli na samym początku klasy.
Lukman
3
Tak, słuszna uwaga, zapomniałem wspomnieć, że słowo kluczowe self może być używane w przypadku odwoływania się z samej klasy. Przykłady, które podałem powyżej, zostały wykonane poza definicją klasy, w takim przypadku należy użyć nazwy klasy.
Matt Huggins
Świetna odpowiedź, bardzo bliska akceptacji. Czy mógłbyś wyjaśnić jedną kwestię: „Publiczne, chronione i prywatne są nieistotne w kontekście stałych” - dlaczego? Czy stałe są domyślnie wszystkie publiczne? wszystko prywatne?
Chris Jacob
1
czy zmienna statyczna nie potrzebuje $? static $my_var = 10;w definicji
Daniel W.
Stary wątek, ale chciałbym coś dodać: sprawdź php.net/manual/en/… , który wyjaśnia, że staticzmienne są również bardzo przydatne w singletonach i funkcjach rekurencyjnych. Ponieważ MOŻESZ zmienić wartość, ale zmienna zostanie zainicjowana tylko raz. Więcej informacji na temat tworzenia singletona można znaleźć na stackoverflow.com/questions/203336/… . Dla mnie to są sytuacje, w których wolę zmienne statyczne.
Erik van de Ven
20
Ostatnim punktem, na który należy zwrócić uwagę, jest to, że stała jest zawsze statyczna i publiczna. Oznacza to, że możesz uzyskać dostęp do stałej z poziomu klasy w następujący sposób:
czy to oświadczenie jest prawdziwe? że „stała jest zawsze statyczna i publiczna”?
apil.tamang
7
To już nie jest prawdą. Od wersji PHP 7.1 stałe klasy mogą być deklarowane jako prywatne lub chronione. Zobacz RFC
DisgruntledGoat,
11
Stała jest po prostu stałą, tzn. Nie można zmienić jej wartości po zadeklarowaniu.
Zmienna statyczna 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 wykonaniu funkcji) i może przechowywać jej wartość między wywołaniami funkcji, na przykład:
function foo(){static $numOfCalls =0;
$numOfCalls++;print("this function has been executed ". $numOfCalls ." times");}
Mówiąc o dziedziczeniu klas, możesz rozróżnić stałą lub zmienną w różnych zakresach za pomocą słów kluczowych selfi static. Sprawdź ten przykład, który ilustruje, jak uzyskać dostęp do:
classPerson{static $type ='person';const TYPE ='person';staticpublicfunction getType(){
var_dump(self::TYPE);
var_dump(static::TYPE);
var_dump(self::$type);
var_dump(static::$type);}}classPirateextendsPerson{static $type ='pirate';const TYPE ='pirate';}
Innymi słowy, self::odnosi się do właściwości statycznej i stałej z tego samego zakresu, w którym jest wywoływana (w tym przypadku do Personsuperklasy), podczas gdy w czasie wykonywania static::uzyskuje dostęp do właściwości i stałej z zakresu (czyli w tym przypadku wPirate podklasie).
Zadeklarowanie metody lub właściwości klasy jako statycznej powoduje, że są one dostępne bez konieczności tworzenia wystąpienia klasy.
Stała klasy jest jak normalna stała, nie można jej zmienić w czasie wykonywania. Jest to również jedyny powód, dla którego kiedykolwiek będziesz używać const.
Prywatne, publiczne i chronione to modyfikatory dostępu, które opisują, kto może uzyskać dostęp do danego parametru / metody.
Publiczny oznacza, że wszystkie inne obiekty mają dostęp. Prywatny oznacza, że tylko klasa, której dotyczy instancja, ma dostęp. Chroniony oznacza, że klasa, dla której utworzono wystąpienie, i klasy pochodne uzyskują dostęp.
Oto rzeczy, których nauczyłem się do tej pory o statycznych elementach członkowskich, stałych zmiennych i modyfikatorach dostępu (prywatnych, publicznych i chronionych).
Stały
Definicja
Tak jak nazwa mówi, wartości stałej zmiennej nie można zmienić. Stałe różnią się od zwykłych zmiennych tym, że nie używa się symbolu $ do ich deklarowania lub używania.
Wartość musi być wyrażeniem stałym, a nie (na przykład) zmienną, właściwością, wynikiem operacji matematycznej lub wywołaniem funkcji.
Uwaga: Wartość zmiennej nie może być słowem kluczowym (np. Self, parent i static).
Deklarowanie stałej w php
<?php
class constantExample{const CONSTANT ='constant value';//constant}?>
Zakres stałej jest globalny i można uzyskać do niego dostęp za pomocą słowa kluczowego self
<?php
classMyClass{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 =newMyClass();
$class->showConstant();
echo $class::CONSTANT."\n";// As of PHP 5.3.0?>
Statyczny
Definicja
Static słowo kluczowe może być użyte do zadeklarowania klasy, funkcji składowej lub zmiennej Statyczne składowe w klasie są globalne mogą być również dostępne za pomocą słowa kluczowego self Deklarowanie właściwości lub metod klasy jako statyczne czyni je dostępnymi bez potrzeby tworzenia instancji klasy . Do właściwości zadeklarowanej jako statyczna nie można uzyskać dostępu za pomocą utworzonego obiektu klasy (chociaż metoda statyczna może). Jeśli nie zostanie użyta żadna deklaracja widoczności (publiczna, prywatna, chroniona), wówczas właściwość lub metoda będzie traktowana tak, jakby była zadeklarowana jako publiczna, ponieważ metody statyczne można wywołać bez instancji utworzonego obiektu.
Uwaga: pseudozmienna $ this nie jest dostępna wewnątrz metody zadeklarowanej jako statyczna, a do właściwości statycznych nie można uzyskać dostępu przez obiekt za pomocą operatora strzałki ->
Od 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 statycznej
<?php
classFoo{publicstatic $my_static ='foo';//static variable publicstaticfunction staticValue(){//static function examplereturnself::$my_static;//return the static variable declared globally}}?>
Przykład dostępu do statycznych właściwości i funkcji
Używając prywatnych, publicznych, chronionych słów kluczowych, możesz kontrolować dostęp do członków w klasie. Członkowie klasy zadeklarowani jako publiczni są dostępni wszędzie. Elementy członkowskie zadeklarowane jako chronione są dostępne tylko w ramach samej klasy oraz przez klasy dziedziczone i nadrzędne. Elementy członkowskie zadeklarowane jako prywatne mogą być dostępne tylko dla klasy, która definiuje element członkowski.
Przykład
<?php
classExample{public $variable ='value';// variable declared as public protected $variable ='value'//variable declared as protectedprivate $variable ='value'//variable declared as privatepublicfunction functionName(){//public function//statements}protectedfunction functionName(){//protected function//statements}privatefunction functionName(){//private function//statements}}?>
Dostęp do przykładu członków publicznych, prywatnych i chronionych
Dostęp do zmiennych publicznych i modyfikowanie ich można uzyskać spoza klasy lub wewnątrz klasy. Ale możesz uzyskać dostęp do prywatnych i chronionych zmiennych i funkcji tylko z wnętrza klasy. Nie możesz modyfikować wartości chronionych lub publicznych członków poza klasą.
<?php
classExample{public $pbVariable ='value';protected $protVariable ='value';private $privVariable ='value';publicfunction publicFun(){
echo $this->$pbVariable;//public variable
echo $this->$protVariable;//protected variable
echo $this->privVariable;//private variable}privatefunctionPrivateFun(){//some statements}protectedfunctionProtectedFun(){//some statements}}
$inst =newExample();
$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. Widoczność Php Doc
self::$variable
dla chronionych statycznych i prywatnych zmiennych statycznych, ponieważ wolę zachować nazwę klasy wymienioną tylko raz w sobie, czyli na samym początku klasy.$
?static $my_var = 10;
w definicjistatic
zmienne są również bardzo przydatne w singletonach i funkcjach rekurencyjnych. Ponieważ MOŻESZ zmienić wartość, ale zmienna zostanie zainicjowana tylko raz. Więcej informacji na temat tworzenia singletona można znaleźć na stackoverflow.com/questions/203336/… . Dla mnie to są sytuacje, w których wolę zmienne statyczne.Ostatnim punktem, na który należy zwrócić uwagę, jest to, że stała jest zawsze statyczna i publiczna. Oznacza to, że możesz uzyskać dostęp do stałej z poziomu klasy w następujący sposób:
Spoza klasy można uzyskać do niej dostęp w następujący sposób:
źródło
Stała jest po prostu stałą, tzn. Nie można zmienić jej wartości po zadeklarowaniu.
Zmienna statyczna 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 wykonaniu funkcji) i może przechowywać jej wartość między wywołaniami funkcji, na przykład:
źródło
Mówiąc o dziedziczeniu klas, możesz rozróżnić stałą lub zmienną w różnych zakresach za pomocą słów kluczowych
self
istatic
. Sprawdź ten przykład, który ilustruje, jak uzyskać dostęp do:A następnie wykonaj:
lub:
Wynik:
Innymi słowy,
self::
odnosi się do właściwości statycznej i stałej z tego samego zakresu, w którym jest wywoływana (w tym przypadku doPerson
superklasy), podczas gdy w czasie wykonywaniastatic::
uzyskuje dostęp do właściwości i stałej z zakresu (czyli w tym przypadku wPirate
podklasie).Przeczytaj więcej o późnym wiązaniu statycznym tutaj na php.net .
Sprawdź również odpowiedź na inne pytanie tutaj i tutaj .
źródło
Zadeklarowanie metody lub właściwości klasy jako statycznej powoduje, że są one dostępne bez konieczności tworzenia wystąpienia klasy.
Stała klasy jest jak normalna stała, nie można jej zmienić w czasie wykonywania. Jest to również jedyny powód, dla którego kiedykolwiek będziesz używać const.
Prywatne, publiczne i chronione to modyfikatory dostępu, które opisują, kto może uzyskać dostęp do danego parametru / metody.
Publiczny oznacza, że wszystkie inne obiekty mają dostęp. Prywatny oznacza, że tylko klasa, której dotyczy instancja, ma dostęp. Chroniony oznacza, że klasa, dla której utworzono wystąpienie, i klasy pochodne uzyskują dostęp.
źródło
Oto rzeczy, których nauczyłem się do tej pory o statycznych elementach członkowskich, stałych zmiennych i modyfikatorach dostępu (prywatnych, publicznych i chronionych). Stały
Definicja
Tak jak nazwa mówi, wartości stałej zmiennej nie można zmienić. Stałe różnią się od zwykłych zmiennych tym, że nie używa się symbolu $ do ich deklarowania lub używania.
Wartość musi być wyrażeniem stałym, a nie (na przykład) zmienną, właściwością, wynikiem operacji matematycznej lub wywołaniem funkcji.
Deklarowanie stałej w php
Zakres stałej jest globalny i można uzyskać do niego dostęp za pomocą słowa kluczowego self
Statyczny
Definicja
Static słowo kluczowe może być użyte do zadeklarowania klasy, funkcji składowej lub zmiennej Statyczne składowe w klasie są globalne mogą być również dostępne za pomocą słowa kluczowego self Deklarowanie właściwości lub metod klasy jako statyczne czyni je dostępnymi bez potrzeby tworzenia instancji klasy . Do właściwości zadeklarowanej jako statyczna nie można uzyskać dostępu za pomocą utworzonego obiektu klasy (chociaż metoda statyczna może). Jeśli nie zostanie użyta żadna deklaracja widoczności (publiczna, prywatna, chroniona), wówczas właściwość lub metoda będzie traktowana tak, jakby była zadeklarowana jako publiczna, ponieważ metody statyczne można wywołać bez instancji utworzonego obiektu.
Przykład właściwości statycznej
Przykład dostępu do statycznych właściwości i funkcji
Publiczny, prywatny, chroniony (modyfikatory dostępu AKA)
Przed przeczytaniem poniższej definicji przeczytaj ten artykuł o hermetyzacji, który pomoże ci głębiej zrozumieć koncepcję
Link 1 wikipedia
Samouczki wskazują łącze dotyczące hermetyzacji
Definicja
Używając prywatnych, publicznych, chronionych słów kluczowych, możesz kontrolować dostęp do członków w klasie. Członkowie klasy zadeklarowani jako publiczni są dostępni wszędzie. Elementy członkowskie zadeklarowane jako chronione są dostępne tylko w ramach samej klasy oraz przez klasy dziedziczone i nadrzędne. Elementy członkowskie zadeklarowane jako prywatne mogą być dostępne tylko dla klasy, która definiuje element członkowski.
Przykład
Dostęp do przykładu członków publicznych, prywatnych i chronionych
Aby uzyskać więcej informacji, przeczytaj dokumentację php o widoczności. Widoczność Php Doc
Źródła : php.net
Mam nadzieję, że zrozumiałeś koncepcję. Dzięki za przeczytanie :) :) Życzę miłego
źródło
Podsumowując @Matt, świetna odpowiedź:
jeśli właściwość, której potrzebujesz, nie powinna zostać zmieniona, właściwym wyborem jest stała
jeśli właściwość, której potrzebujesz, może zostać zmieniona, użyj zamiast tego static
Przykład:
Edycja: Należy zauważyć, że PHP 7.1.0 wprowadziło obsługę określania widoczności stałych klas .
źródło