No contexto de uma classe, variáveis estáticas estão no escopo da classe (não no objeto), mas, diferentemente de uma const, seus valores podem ser alterados.
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.
Público, protegido e privado são irrelevantes em termos de consts (que são sempre públicos); eles são úteis apenas para variáveis de classe, incluindo variável estática.
variáveis estáticas públicas podem ser acessadas em qualquer lugar via ClassName :: $ variable.
variáveis estáticas protegidas podem ser acessadas pela classe de definição ou extensão de classes via ClassName :: $ variable.
variáveis estáticas privadas podem ser acessadas apenas pela classe de definição via ClassName :: $ variable.
Prefiro usar self::$variablevariáveis estáticas e estáticas protegidas, pois prefiro manter o nome da classe mencionado apenas uma vez dentro de si, que está no início da classe.
Lukman
3
Sim, bom ponto, esqueci de mencionar que a palavra-chave self pode ser usada se estiver fazendo referência a partir da própria classe. Os exemplos que forneci acima foram executados fora da definição de classe; nesse caso, o nome da classe deve ser usado.
Matt Huggins
Ótima resposta, muito perto de aceitar. Você poderia esclarecer um ponto: "Público, protegido e privado são irrelevantes em termos de consts" - Por quê? Por padrão, os consts são todos públicos? tudo privado?
Chris Jacob
1
um var estático não precisa de um $? static $my_var = 10;na definição
Daniel W.
Tópico antigo, mas gostaria de acrescentar algo: confira php.net/manual/en/… , que explica staticvariáveis são muito úteis em singletons e funções recursivas também. Porque você PODE alterar o valor, mas a variável será inicializada apenas uma vez. Consulte stackoverflow.com/questions/203336/… para obter mais explicações sobre como criar um singleton. Para mim, essas são algumas situações em que prefiro variáveis estáticas.
Erik van de Ven
20
Um último ponto que deve ser destacado é que uma const é sempre estática e pública. Isso significa que você pode acessar o const de dentro da classe da seguinte maneira:
essa declaração é verdadeira? que "const é sempre estático e público"?
apil.tamang
7
Isso não é mais verdade. As constantes da classe PHP 7.1 podem ser declaradas privadas ou protegidas. Veja RFC
DisgruntledGoat
11
Constante é apenas uma constante, ou seja, você não pode alterar seu valor após a declaração.
A variável estática é acessível sem criar uma instância de uma classe e, portanto, compartilhada entre todas as instâncias de uma classe.
Além disso, pode haver uma variável local estática em uma função que é declarada apenas uma vez (na primeira execução de uma função) e pode armazenar seu valor entre chamadas de função, por exemplo:
function foo(){static $numOfCalls =0;
$numOfCalls++;print("this function has been executed ". $numOfCalls ." times");}
Ao falar sobre herança de classe, é possível diferenciar entre a constante ou a variável em diferentes escopos usando selfe staticpalavras-chave. Verifique este exemplo que ilustra como acessar o que:
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';}
Em outras palavras, self::refere-se à propriedade estática e constante do mesmo escopo em que está sendo chamada (neste caso, a Personsuperclasse), enquanto static::acessará a propriedade e a constante do escopo em tempo de execução (nesse caso, na Piratesubclasse).
Declarar um método ou propriedade de classe como estático os torna acessíveis sem a necessidade de uma instanciação da classe.
Uma constante de classe é como uma constante normal, não pode ser alterada em tempo de execução. Este também é o único motivo pelo qual você utilizará o const.
Privado, público e protegido são modificadores de acesso que descrevem quem pode acessar qual parâmetro / método.
Público significa que todos os outros objetos obtêm acesso. Privado significa que somente a classe instanciada obtém acesso. Protegido significa que a classe instanciada e as classes derivadas obtêm acesso.
Aqui estão as coisas que aprendi até agora sobre membros estáticos, variáveis constantes e modificadores de acesso (privado, público e protegido).
Constante
Definição
Como o nome diz, os valores de uma variável constante não podem ser alterados. As constantes diferem das variáveis normais, pois você não usa o símbolo $ para declará-las ou usá-las.
O valor deve ser uma expressão constante, não (por exemplo) uma variável, uma propriedade, o resultado de uma operação matemática ou uma chamada de função.
Nota: O valor da variável não pode ser uma palavra-chave (por exemplo, auto, pai e estática).
Declarando uma constante em php
<?php
class constantExample{const CONSTANT ='constant value';//constant}?>
O escopo da Constant é global e pode ser acessado usando uma palavra-chave 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?>
Estático
Definição
A palavra-chave estática pode ser usada para declarar uma classe, função-membro ou variável. Os membros estáticos de uma classe são globais também podem ser acessados usando uma palavra-chave própria. Declarar propriedades ou métodos de classe como estáticos os torna acessíveis sem a necessidade de uma instanciação da classe . Uma propriedade declarada como estática não pode ser acessada com um objeto de classe instanciado (embora um método estático possa). Se nenhuma declaração de visibilidade (pública, privada, protegida) for usada, a propriedade ou o método será tratado como se fosse declarado como público.Porque os métodos estáticos podem ser chamados sem uma instância do objeto criado.
Nota: a pseudo-variável $ this não está disponível dentro do método declarado como static. As propriedades estáticas não podem ser acessadas através do objeto usando o operador de seta ->
A partir do PHP 5.3.0, é possível referenciar a classe usando uma variável. O valor da variável> não pode ser uma palavra-chave (por exemplo, auto, pai e estática).
Exemplo de propriedade estática
<?php
classFoo{publicstatic $my_static ='foo';//static variable publicstaticfunction staticValue(){//static function examplereturnself::$my_static;//return the static variable declared globally}}?>
Acessando propriedades estáticas e exemplo de funções
Usando palavras-chave privadas, públicas e protegidas, você pode controlar o acesso aos membros de uma classe. Os membros da classe declarados públicos podem ser acessados em qualquer lugar. Os membros declarados protegidos podem ser acessados apenas dentro da própria classe e pelas classes herdada e pai. Os membros declarados como privados podem ser acessados apenas pela classe que define o membro.
Exemplo
<?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}}?>
Acessando o exemplo de membros públicos, privados e protegidos
As variáveis públicas podem ser acessadas e modificadas de fora da classe ou dentro da classe. Mas você pode acessar as variáveis e funções privadas e protegidas apenas de dentro da classe. Você não pode modificar o valor de membros protegidos ou públicos fora da classe.
<?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)?>
Para obter mais informações, leia esta documentação php sobre visibilidade Visibility Php Doc.
self::$variable
variáveis estáticas e estáticas protegidas, pois prefiro manter o nome da classe mencionado apenas uma vez dentro de si, que está no início da classe.$
?static $my_var = 10;
na definiçãostatic
variáveis são muito úteis em singletons e funções recursivas também. Porque você PODE alterar o valor, mas a variável será inicializada apenas uma vez. Consulte stackoverflow.com/questions/203336/… para obter mais explicações sobre como criar um singleton. Para mim, essas são algumas situações em que prefiro variáveis estáticas.Um último ponto que deve ser destacado é que uma const é sempre estática e pública. Isso significa que você pode acessar o const de dentro da classe da seguinte maneira:
De fora da classe, você o acessaria assim:
fonte
Constante é apenas uma constante, ou seja, você não pode alterar seu valor após a declaração.
A variável estática é acessível sem criar uma instância de uma classe e, portanto, compartilhada entre todas as instâncias de uma classe.
Além disso, pode haver uma variável local estática em uma função que é declarada apenas uma vez (na primeira execução de uma função) e pode armazenar seu valor entre chamadas de função, por exemplo:
fonte
Ao falar sobre herança de classe, é possível diferenciar entre a constante ou a variável em diferentes escopos usando
self
estatic
palavras-chave. Verifique este exemplo que ilustra como acessar o que:E então faça:
ou:
Resultado:
Em outras palavras,
self::
refere-se à propriedade estática e constante do mesmo escopo em que está sendo chamada (neste caso, aPerson
superclasse), enquantostatic::
acessará a propriedade e a constante do escopo em tempo de execução (nesse caso, naPirate
subclasse).Leia mais sobre ligação estática tardia aqui no php.net .
Verifique também a resposta em outra pergunta aqui e aqui .
fonte
Declarar um método ou propriedade de classe como estático os torna acessíveis sem a necessidade de uma instanciação da classe.
Uma constante de classe é como uma constante normal, não pode ser alterada em tempo de execução. Este também é o único motivo pelo qual você utilizará o const.
Privado, público e protegido são modificadores de acesso que descrevem quem pode acessar qual parâmetro / método.
Público significa que todos os outros objetos obtêm acesso. Privado significa que somente a classe instanciada obtém acesso. Protegido significa que a classe instanciada e as classes derivadas obtêm acesso.
fonte
Aqui estão as coisas que aprendi até agora sobre membros estáticos, variáveis constantes e modificadores de acesso (privado, público e protegido). Constante
Definição
Como o nome diz, os valores de uma variável constante não podem ser alterados. As constantes diferem das variáveis normais, pois você não usa o símbolo $ para declará-las ou usá-las.
O valor deve ser uma expressão constante, não (por exemplo) uma variável, uma propriedade, o resultado de uma operação matemática ou uma chamada de função.
Declarando uma constante em php
O escopo da Constant é global e pode ser acessado usando uma palavra-chave self
Estático
Definição
A palavra-chave estática pode ser usada para declarar uma classe, função-membro ou variável. Os membros estáticos de uma classe são globais também podem ser acessados usando uma palavra-chave própria. Declarar propriedades ou métodos de classe como estáticos os torna acessíveis sem a necessidade de uma instanciação da classe . Uma propriedade declarada como estática não pode ser acessada com um objeto de classe instanciado (embora um método estático possa). Se nenhuma declaração de visibilidade (pública, privada, protegida) for usada, a propriedade ou o método será tratado como se fosse declarado como público.Porque os métodos estáticos podem ser chamados sem uma instância do objeto criado.
Exemplo de propriedade estática
Acessando propriedades estáticas e exemplo de funções
Público, privado, protegido (modificadores de acesso AKA)
Antes de ler a definição abaixo, leia este artigo sobre Encapsulamento. Isso ajudará você a entender o conceito mais profundamente
Link 1 wikipedia
Tutoriais apontam link sobre encapsulamento
Definição
Usando palavras-chave privadas, públicas e protegidas, você pode controlar o acesso aos membros de uma classe. Os membros da classe declarados públicos podem ser acessados em qualquer lugar. Os membros declarados protegidos podem ser acessados apenas dentro da própria classe e pelas classes herdada e pai. Os membros declarados como privados podem ser acessados apenas pela classe que define o membro.
Exemplo
Acessando o exemplo de membros públicos, privados e protegidos
Para obter mais informações, leia esta documentação php sobre visibilidade Visibility Php Doc.
Referências: php.net
Espero que você tenha entendido o conceito. Obrigado pela leitura :) :) Tenha uma boa
fonte
Então, para recapitular a ótima resposta do @Matt:
se a propriedade que você precisa não deve ser alterada, uma constante é a escolha certa
se a propriedade necessária for alterada, use static em vez disso
Exemplo:
Edit: É importante notar que o PHP 7.1.0 introduziu suporte para especificar a visibilidade das constantes da classe .
fonte