função estática php

108

Eu tenho uma pergunta sobre a função estática no php.

vamos supor que eu tenha uma aula

class test {
    public function sayHi() {
        echo 'hi';
    }
}

se eu fizer test::sayHi();isso funciona sem problemas.

class test {
    public static function sayHi() {
        echo 'hi';
    }
}

test::sayHi(); funciona bem.

Quais são as diferenças entre a primeira e a segunda classe?

O que há de especial em uma função estática?

Lua
fonte
15
A partir do php7, você não pode chamar o método não estático estaticamente
sanjay yadav

Respostas:

153

Na primeira classe, sayHi()é na verdade um método de instância que você está chamando como um método estático e você se safa porque sayHi()nunca faz referência a $this.

As funções estáticas são associadas à classe, não a uma instância da classe. Como tal, $thisnão está disponível em um contexto estático ( $thisnão aponta para nenhum objeto).

Jonathan Fingland
fonte
22
Agora, a chamada estática de métodos não estáticos funciona, mas está obsoleta. Tenha cuidado ao usar esta sintaxe para métodos de instância!
Jet
1
Então é por isso que dizem que é uma função estática? porque não há instância múltipla com fluxo de dados dinâmico e saída dinâmica. Apenas me oriente. @ Chaos
dom
22

Simplesmente, as funções estáticas funcionam independentemente da classe a que pertencem.

$ isso significa que este é um objeto desta classe. Não se aplica a funções estáticas.

class test {
    public function sayHi($hi = "Hi") {
        $this->hi = $hi;
        return $this->hi;
    }
}
class test1 {
    public static function sayHi($hi) {
        $hi = "Hi";
        return $hi;
    }
}

//  Test
$mytest = new test();
print $mytest->sayHi('hello');  // returns 'hello'
print test1::sayHi('hello');    //  returns 'Hi'
user2132859
fonte
9
Ok, eu não sou um assistente de PHP, mas não é a variável ('hello') que é passada para a função estática, explicitamente sendo substituída por 'Hi'? Significa que a linha imprime test1 :: sayHi ('hello'); não retornaria 'hello', mas retornaria 'hi'?
Fnord23 de
6
Essa resposta é desleixada (o efeito das funções estáticas pode depender da classe em que estão) e os exemplos não deixam esse ponto muito claro.
reinierpost de
Não é um exemplo muito bom. $ hi = 'Oi'; sobrescreve o argumento fornecido e não tem nada a ver com a declaração estática. Eu corrigiria isso da seguinte forma: self :: $ hi = $ hi; e funcionaria exatamente como o não estático. Você pode acessar as variáveis ​​de classe com self :: em vez de $ this->
GotBatteries,
20

Toda a diferença é que você não é $thisfornecido dentro da função estática. Se você tentar usar $this, obterá um Fatal error: Using $this when not in object context.

Bem, ok, uma outra diferença: um E_STRICTaviso é gerado pelo seu primeiro exemplo.

caos
fonte
1
Não tenho nenhum aviso quando uso pela primeira vez e estou no php7
ashkan nasirzadeh
Por que não temos $ this dentro de uma função estática? Qual é a lógica arquitetônica disso? Obrigado.
Lucas Bustamante
@LucasBustamante: $thisrefere-se ao objeto atual. Em uma função estática, não há objeto atual; a função existe na classe sem necessidade ou referência a uma instância de objeto dessa classe.
caos
3

Chamar métodos não estáticos gera estaticamente um aviso de nível E_STRICT.


fonte
2

Em suma, você não tem o objeto como $ this no segundo caso, pois o método estático é uma função / método da classe e não a instância do objeto.

Czimi
fonte
1
é estático simplesmente como você define funções de classe? nenhum outro negócio extravagante? Então você está dizendo que se tivesse sido chamado de "class_method" ao invés de "static", seria mais semântico?
ahnbizcad
1

Depois de tentar exemplos (PHP 5.3.5), descobri que em ambos os casos de definição de funções você não pode usar $thisoperador para trabalhar em funções de classe. Então eu não consegui encontrar uma diferença neles ainda. :(

yogesh
fonte