PHP utilise des méthodes statiques dans un contexte d'objet
J'ai le code suivant (comme, pour de vrai, c'est mon vrai code) :
<?php
class Foobar
{
public static function foo()
{
exit('foo');
}
}
Quand je lance $foobar = new FooBar; $foobar->foo()
il affiche foo
.
Pourquoi PHP essayez d'utiliser une méthode statique dans un contexte de l'objet ? Est-il un moyen pour éviter cela ?
Ok les gars, vous n'obtenez pas mon problème : je connais les différences entre statiques et non statiques les méthodes et la façon de les appeler. C'est mon point de l'ensemble, si je l'appelle $foobar->foo()
pourquoi ne PHP tente d'exécuter une méthode statique ?
Note : j'utilise PHP 5.4.4, les rapports d'erreurs à E_ALL
.
source d'informationauteur Maxime Fabre
Vous devez vous connecter pour publier un commentaire.
À l'appel d'une méthode statique, vous ne l'utilisez pas:
Vous appelez
Le manuel PHP dit...
C'est pourquoi vous êtes en mesure d'appeler la méthode sur une instance, même si ce n'est pas ce que vous avez l'intention de le faire.
Si oui ou non vous appeler une méthode statique statique ou sur une instance, vous ne pouvez pas accéder
$this
dans une méthode statique.http://php.net/manual/en/language.oop5.static.php
Vous pouvez vérifier pour voir si vous êtes dans un contexte statique, bien que j'question de savoir si c'est exagéré...
Une remarque supplémentaire - je croire que la méthode est toujours exécuté dans un contexte statique, même si elle est appelée sur une instance. Je suis heureux d'être corrigé si je me trompe.
Depuis PHP est assez indulgent langue, vous pouvez prévenir ce comportement par défaut en surcharge
__callStatic
et peut-être utiliser des réflexions afin de valider la portée de la méthode.http://php.net/manual/en/language.oop5.overloading.php#object.call
http://php.net/ReflectionClass
Nous peut avoir besoin de plus d'informations sur le FooBar déclaration.
Évidemment, vous ne pouvez pas déclarer deux méthodes foo() même si l'on est une méthode statique et l'autre une méthode d'instance:
Donc, je suppose que vous voulez atteindre une magie
__call()
méthode, comme suit:Pour y parvenir, regardez ce morceau de code: