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.
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.
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;
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");
}
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"
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.
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;
...
}
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
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 dniaWarning: 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