Il existe deux façons distinctes d'accéder aux méthodes en PHP, mais quelle est la différence?
$response->setParameter('foo', 'bar');
et
sfConfig::set('foo', 'bar');
Je suppose que ->
(tiret avec un signe supérieur à ou un chevron) est utilisé pour les fonctions des variables et ::
(deux-points) pour les fonctions des classes. Correct?
L' =>
opérateur d'affectation est-il uniquement utilisé pour affecter des données dans un tableau? Est-ce en contraste avec l' =
opérateur d'affectation qui est utilisé pour instancier ou modifier une variable?
Réponses:
Lorsque la partie gauche est une instance d'objet, vous utilisez
->
. Sinon, vous utilisez::
.Cela signifie qu'il
->
est principalement utilisé pour accéder aux membres d'instance (bien qu'il puisse également être utilisé pour accéder aux membres statiques, une telle utilisation est déconseillée), tandis qu'il::
est généralement utilisé pour accéder aux membres statiques (bien que dans quelques cas spéciaux, il soit utilisé pour accéder aux membres d'instance ).En général,
::
est utilisé pour la résolution de portée , et il peut avoir soit un nom de classe,parent
,self
ou (en PHP 5.3)static
à sa gauche.parent
fait référence à la portée de la superclasse de la classe où elle est utilisée;self
fait référence à la portée de la classe où elle est utilisée;static
fait référence à la "portée appelée" (voir les liaisons statiques tardives ).La règle est qu'un appel avec
::
est un appel d'instance si et seulement si:$this
existe et$this
est soit la classe de la méthode appelée, soit une sous-classe de celle-ci.Exemple:
Production:
la source
->
est principalement utilisé pour accéder aux membres de l'instance (bien qu'il puisse également être utilisé pour accéder aux membres statiques, une telle utilisation est déconseillée)" Je ne savais pas que cela pouvait l'être. Donc, s'il "fonctionne" d'une manière ou d'une autre lorsqu'il est utilisé pour accéder à des membres statiques - à quelle différence de comportement peut-on s'attendre si on ne l'utilise pas correctement comme ceci? Juste par curiosité.->
. Bien sûr, vous devrez peut-être instancier la classe juste pour appeler une méthode statique, il y a donc également un impact sur les performances. Cependant, avec les propriétés, il y a plus de problèmes. Un avertissement STRICT est émis et il peut ou non fonctionner . Notez que l'inverse est également vrai - vous pouvez appeler une méthode d'instance statiquement, mais c'est encore pire (et vous ne pouvez pas l'utiliser$this
dans une telle implémentation de méthode).::
est utilisé dans un contexte statique , ie. lorsqu'une méthode ou une propriété est déclarée comme statique:De plus, l'
::
opérateur (l'opérateur de résolution d'étendue, alias Paamayim Nekudotayim ) est utilisé dans un contexte dynamique lorsque vous appelez une méthode / propriété d'une classe parente:->
est utilisé dans un contexte dynamique , ie. lorsque vous traitez une instance d'une classe:Soit dit en passant: je ne pense pas que l'utilisation de Symfony soit une bonne idée lorsque vous n'avez aucune expérience de POO.
la source
En fait, par ce symbole, nous pouvons appeler une méthode de classe qui est statique et ne dépend pas d'une autre initialisation ...
Ici, la
doWrite()
fonction ne dépend d'aucune autre méthode ou variable, et c'est une méthode statique. C'est pourquoi nous pouvons appeler cette méthode par cet opérateur sans initialiser l'objet de cette classe.Test::doWrite('Mrinmoy'); // Output: Hello Mrinmoy.
Mais si vous souhaitez appeler la
write
méthode de cette manière, elle générera une erreur car elle dépend de l'initialisation.la source
L'
=>
opérateur est utilisé pour affecter des paires clé-valeur dans un tableau associatif. Par exemple:Sa signification est similaire dans l'
foreach
énoncé:la source
La différence entre les méthodes et propriétés statiques et instanciées semble être l'un des plus grands obstacles à ceux qui débutent avec OOP PHP en PHP 5.
L'opérateur à deux points (appelé Paamayim Nekudotayim de l'hébreu - trivia) est utilisé lors de l'appel d'un objet ou d'une propriété à partir d'un contexte statique . Cela signifie qu'une instance de l'objet n'a pas encore été créée.
L'opérateur flèche, à l'inverse, appelle des méthodes ou des propriétés à partir d'une référence d'une instance de l'objet.
Les méthodes statiques peuvent être particulièrement utiles dans les modèles d'objets liés à une base de données pour les méthodes de création et de suppression, car vous pouvez définir la valeur de retour sur l'ID de table inséré, puis utiliser le constructeur pour instancier l'objet par l'ID de ligne.
la source
Oui, je viens de frapper mon premier
'PHP Parse error: syntax error, unexpected T_PAAMAYIM_NEKUDOTAYIM'
. Mon mauvais, j'en avais un$instance::method()
qui aurait dû l'être$instance->method()
. Que je suis bête.La chose étrange est que cela fonctionne toujours très bien sur ma machine locale (exécutant PHP 5.3.8) - rien, pas même un avertissement avec error_reporting = E_ALL - mais pas du tout sur le serveur de test, là ça explose juste avec une erreur de syntaxe et un écran blanc dans le navigateur. Étant donné que la journalisation PHP était désactivée sur la machine de test et que la société d'hébergement était trop occupée pour l'activer, ce n'était pas trop évident.
Donc, mot d'avertissement: apparemment, certaines installations PHP vous permettront d'utiliser une méthode $ instance ::, tandis que d'autres non.
Si quelqu'un peut expliquer pourquoi, veuillez le faire.
la source