Existem duas maneiras distintas de acessar métodos no PHP, mas qual é a diferença?
$response->setParameter('foo', 'bar');
e
sfConfig::set('foo', 'bar');
Estou assumindo que ->
(traço com sinal maior que ou chevron) é usado para funções para variáveis e ::
(dois pontos duplos) é usado para funções para classes. Corrigir?
O =>
operador de atribuição é usado apenas para atribuir dados em uma matriz? Isso contrasta com o =
operador de atribuição usado para instanciar ou modificar uma variável?
Respostas:
Quando a parte esquerda é uma instância de objeto, você usa
->
. Caso contrário, você usa::
.Isso significa que
->
é usado principalmente para acessar membros da instância (embora também possa ser usado para acessar membros estáticos, esse uso é desencorajado), enquanto::
geralmente é usado para acessar membros estáticos (embora, em alguns casos especiais, seja usado para acessar membros da instância )Em geral,
::
é usado para a resolução do âmbito , e que podem ter um nome de classe,parent
,self
, ou (em PHP 5.3)static
para o seu lado esquerdo.parent
refere-se ao escopo da superclasse da classe em que é usada;self
refere-se ao escopo da classe em que é usada;static
refere-se ao "chamado escopo" (consulte ligações estáticas tardias ).A regra é que uma chamada com
::
é uma chamada de instância se e somente se:$this
existe e$this
é a classe do método que está sendo chamado ou uma subclasse dele.Exemplo:
Resultado:
fonte
->
é usado principalmente para acessar membros da instância (embora também possa ser usado para acessar membros estáticos, esse uso é desencorajado)" Eu não sabia que poderia ser. Portanto, se ele "funciona" de alguma maneira quando usado para acessar membros estáticos - que diferença de comportamento seria de esperar se o usássemos incorretamente dessa maneira? Apenas por curiosidade.->
. Obviamente, pode ser necessário instanciar a classe apenas para chamar um método estático, para que também ocorra um impacto no desempenho. Com propriedades, no entanto, há mais problemas. Um aviso estrito é gerado e pode ou não funcionar . Observe que o inverso também é verdadeiro - você pode chamar um método de instância estaticamente, mas isso é ainda pior (e você não pode usar$this
essa implementação de método).::
é usado em contexto estático , ie. quando algum método ou propriedade é declarado como estático:Além disso, o
::
operador (o Operador de resolução de escopo, também conhecido como Paamayim Nekudotayim ) é usado em contexto dinâmico quando você invoca um método / propriedade de uma classe pai:->
é usado em contexto dinâmico , ie. quando você lida com alguma instância de alguma classe:A propósito: não acho que usar o Symfony seja uma boa ideia quando você não tem nenhuma experiência em POO.
fonte
Na verdade, por esse símbolo, podemos chamar um método de classe que é estático e não depende de outra inicialização ...
Aqui, a
doWrite()
função não depende de nenhum outro método ou variável e é um método estático. É por isso que podemos chamar esse método por esse operador sem inicializar o objeto dessa classe.Test::doWrite('Mrinmoy'); // Output: Hello Mrinmoy.
Mas se você quiser chamar o
write
método dessa maneira, ele gerará um erro porque depende da inicialização.fonte
O
=>
operador é usado para atribuir pares de valores-chave em uma matriz associativa. Por exemplo:Seu significado é semelhante na
foreach
declaração:fonte
A diferença entre métodos e propriedades estáticos e instanciados parece ser um dos maiores obstáculos para aqueles que estão começando com o OOP PHP no PHP 5.
O operador de dois pontos duplos (chamado Paamayim Nekudotayim do hebraico - trivialidades) é usado ao chamar um objeto ou propriedade de um contexto estático . Isso significa que uma instância do objeto ainda não foi criada.
O operador de seta, por outro lado, chama métodos ou propriedades que a partir de uma referência de uma instância do objeto.
Os métodos estáticos podem ser especialmente úteis em modelos de objetos vinculados a um banco de dados para métodos de criação e exclusão, pois você pode definir o valor de retorno para o ID da tabela inserido e, em seguida, usar o construtor para instanciar o objeto pelo ID da linha.
fonte
Sim, acabei de acertar o meu primeiro
'PHP Parse error: syntax error, unexpected T_PAAMAYIM_NEKUDOTAYIM'
. Meu mal, eu tinha um$instance::method()
que deveria ter sido$instance->method()
. Parvo eu.O estranho é que isso ainda funciona muito bem na minha máquina local (executando o PHP 5.3.8) - nada, nem mesmo um aviso com error_reporting = E_ALL - mas não no servidor de teste, apenas explode com um erro de sintaxe e uma tela branca no navegador. Como o registro do PHP foi desativado na máquina de teste e a empresa de hospedagem estava muito ocupada para ativá-lo, não era muito óbvio.
Portanto, aviso: aparentemente, algumas instalações do PHP permitem usar um $ instance :: method (), enquanto outros não.
Se alguém puder expandir o motivo, faça isso.
fonte