Pourquoi dans PHP vous pouvez accéder à une méthode statique via l’instance d’une classe mais pas uniquement via le nom du type?
UPDATE: Je suis développeur .net mais je travaille également avec des développeurs PHP. Récemment, j'ai trouvé ce moment à propos de méthodes statiques appelées à partir d'instance et je ne comprends pas pourquoi cela peut être utile.
EXEMPLE:
class Foo
{
public static Bar()
{
}
}
Nous pouvons accepter une méthode comme celle-ci:
var $foo = new Foo();
$foo.Bar(); // ??????
Class Do {
static public function test() {
return 0;
}
}
utiliser comme ceci:
echo Do::test();
Pourquoi dans PHP vous pouvez accéder à une méthode statique via l’instance d’une classe mais pas uniquement via le nom du type?
Contrairement à ce à quoi vous êtes probablement habitué avec .NET, PHP a des types dynamiques. Considérer:
class Foo
{
static public function staticMethod() { }
}
class Bar
{
static public function staticMethod() { }
}
function doSomething($obj)
{
// What type is $obj? We don't care.
$obj->staticMethod();
}
doSomething(new Foo());
doSomething(new Bar());
Ainsi, en permettant l'accès aux méthodes statiques via l'instance d'objet, vous pouvez appeler plus facilement une fonction statique du même nom pour différents types.
Maintenant, je ne sais pas s'il y a une bonne raison pour laquelle l'accès à la méthode statique via ->
est autorisé. PHP (5.3?) Supporte également:
$obj::staticMethod();
ce qui est peut-être moins déroutant. Lorsque vous utilisez ::
, il doit s'agir d'une fonction statique pour éviter les avertissements (contrairement à ->
qui permet l'une ou l'autre).
Dans PHP 7, il vous semble absolument nécessaire de pouvoir exécuter $this->staticFunction()
. Parce que, si ce code est écrit dans une classe abstraite et que staticFunction()
est également abstrait dans votre classe abstraite, $this->
et self::
donnent des résultats différents!
Lorsque vous exécutez $this->staticFunction()
à partir d'un enfant (non abstrait) de la classe abstraite, vous vous retrouvez dans child::staticFunction()
. Tout est bien.
Cependant, en exécutant self::staticFunction()
à partir d'un enfant (non abstrait) de la classe abstraite, vous vous retrouvez dans parent::staticFunction()
, qui est abstrait et lève ainsi une exception.
Je suppose que ceci est juste un autre exemple de PHP mal conçu ..__ Ou moi-même ayant besoin de plus de café ...
Parfois, il est utile de pouvoir accéder à des méthodes et à des propriétés dans le contexte d’une classe plutôt que d’un objet. Pour ce faire, vous pouvez utiliser un mot clé statique. Ainsi, nous pouvons accéder à la méthode statique en utilisant le nom de la classe avec la résolution de la portée.
class User
{ public static $ name = 'john';
public static function display()
{
return self::$name;
}
}
echo User :: display ();
Regardez ici nous avons déclaré une méthode statique dans notre classe User. Donc, si nous déclarons une méthode statique, nous pouvons y accéder en utilisant simplement le nom de la classe. Pas besoin de créer un objet pour y accéder. J'espère que vous comprendrez toute la procédure.
Remarque: C’est en fait la principale différence avec une méthode normale: $ ceci n’est pas disponible dans de telles méthodes.
lire l'article complet à partir d'ici Comment utiliser les propriétés statiques dans PHP?
En PHP, bien que vous soyez autorisé à accéder à la méthode statique en référençant une instance de la classe, vous n'avez pas nécessairement besoin de le faire . Par exemple, voici une classe avec une fonction statique:
class MyClass{
public static function MyFunction($param){
$mynumber=param*2;
return $mynumber;
}
Vous pouvez accéder à la méthode statique simplement par le nom du type, mais dans ce cas, vous devez utiliser le double-signe deux-points (: :), au lieu de "->".
$result= MyClass::MyFunction(2);
(Veuillez noter que vous pouvez également accéder à la méthode statique via une instance de la classe à l'aide de "->"). Pour plus d'informations: http://php.net/manual/fr/language.oop5.static.php