Hay dos formas distintas de acceder a los métodos en PHP, pero ¿cuál es la diferencia?
$response->setParameter('foo', 'bar');
y
sfConfig::set('foo', 'bar');
Supongo que ->
(guión con mayor que signo o chevron) se usa para funciones para variables, y ::
(dos puntos) se usa para funciones para clases. ¿Correcto?
¿El =>
operador de asignación solo se usa para asignar datos dentro de una matriz? ¿Esto contrasta con el =
operador de asignación que se usa para crear instancias o modificar una variable?
Respuestas:
Cuando la parte izquierda es una instancia de objeto, se usa
->
. De lo contrario, usted usa::
.Esto significa que
->
se usa principalmente para acceder a miembros de instancia (aunque también se puede usar para acceder a miembros estáticos, se desaconseja dicho uso), mientras::
que generalmente se usa para acceder a miembros estáticos (aunque en algunos casos especiales, se usa para acceder a miembros de instancia )En general,
::
se utiliza para la resolución de alcance , y puede tener ya sea un nombre de clase,parent
,self
, o (en PHP 5.3)static
a su izquierda.parent
se refiere al alcance de la superclase de la clase donde se usa;self
se refiere al alcance de la clase donde se usa;static
se refiere al "alcance llamado" (ver enlaces estáticos tardíos ).La regla es que una llamada con
::
es una llamada de instancia si y solo si:$this
existe y$this
es la clase del método que se llama o una subclase del mismo.Ejemplo:
Salida:
fuente
->
se usa principalmente para acceder a miembros de la instancia (aunque también se puede usar para acceder a miembros estáticos, se desaconseja dicho uso)" No sabía que podría serlo. Entonces, si "funciona" de alguna manera cuando se usa para acceder a miembros estáticos, ¿qué diferencia de comportamiento se esperaría si se usara incorrectamente de esta manera? Solo por curiosidad.->
. Por supuesto, es posible que deba crear una instancia de la clase solo para llamar a un método estático, por lo que también hay un impacto en el rendimiento. Con las propiedades, sin embargo, hay más problemas. Se genera una advertencia ESTRICTA y puede o no funcionar . Tenga en cuenta que lo contrario también es cierto: puede llamar a un método de instancia estáticamente, pero esto es aún peor (y no puede usarlo$this
en la implementación de dicho método).::
se usa en contexto estático , es decir. cuando algún método o propiedad se declara como estático:Además, el
::
operador (el Operador de resolución de alcance, también conocido como Paamayim Nekudotayim ) se usa en contexto dinámico cuando invoca un método / propiedad de una clase principal:->
se utiliza en contexto dinámico , es decir. cuando tratas con alguna instancia de alguna clase:Por cierto: no creo que usar Symfony sea una buena idea cuando no tienes experiencia en OOP.
fuente
En realidad, con este símbolo podemos llamar a un método de clase que es estático y no depende de otra inicialización ...
Aquí la
doWrite()
función no depende de ningún otro método o variable, y es un método estático. Es por eso que podemos llamar a este método por este operador sin inicializar el objeto de esta clase.Test::doWrite('Mrinmoy'); // Output: Hello Mrinmoy.
Pero si desea llamar al
write
método de esta manera, generará un error porque depende de la inicialización.fuente
El
=>
operador se utiliza para asignar pares clave-valor en una matriz asociativa. Por ejemplo:Su significado es similar en la
foreach
declaración:fuente
La diferencia entre los métodos y propiedades estáticos e instanciados parece ser uno de los mayores obstáculos para aquellos que recién comienzan con OOP PHP en PHP 5.
El operador de dos puntos (que se llama Paamayim Nekudotayim del hebreo - trivia) se usa cuando se llama a un objeto o propiedad desde un contexto estático . Esto significa que todavía no se ha creado una instancia del objeto.
El operador de flecha, por el contrario, llama a métodos o propiedades que a partir de una referencia de una instancia del objeto.
Los métodos estáticos pueden ser especialmente útiles en modelos de objetos que están vinculados a una base de datos para crear y eliminar métodos, ya que puede establecer el valor de retorno en la ID de la tabla insertada y luego usar el constructor para crear una instancia del objeto por la ID de la fila.
fuente
Sí, acabo de golpear mi primero
'PHP Parse error: syntax error, unexpected T_PAAMAYIM_NEKUDOTAYIM'
. Mi mal, tuve un$instance::method()
que debería haber sido$instance->method()
. Tonto de mí.Lo extraño es que esto todavía funciona bien en mi máquina local (ejecutando PHP 5.3.8), nada, ni siquiera una advertencia con error_reporting = E_ALL, pero nada en el servidor de prueba, simplemente explota con un error de sintaxis y una pantalla blanca en el navegador. Como el registro de PHP estaba desactivado en la máquina de prueba, y la empresa de hosting estaba demasiado ocupada para activarlo, no era demasiado obvio.
Entonces, una advertencia: aparentemente, algunas instalaciones de PHP le permitirán usar un $ instance :: method (), mientras que otros no.
Si alguien puede explicar por qué es eso, por favor hágalo.
fuente